У « Об’єктно-орієнтованій програмі» ( Майєр ) він визначає принцип відкритого / закритого типу :
- Модуль, як кажуть, буде відкритим, якщо він ще доступний для розширення. Наприклад, має бути можливість додати поля до структур даних, які він містить, або нових елементів до набору функцій, які він виконує.
- Кажуть, що модуль закритий, якщо він доступний для використання іншими модулями. Це передбачає, що модулю було дано чітко визначений стабільний опис (інтерфейс у сенсі приховування інформації).
Він продовжує говорити:
Якщо ви знову відкриєте модуль, ви також повинні знову відкрити всі його клієнти, щоб оновити їх, оскільки вони покладаються на стару версію. … [Ця проблема] виникає кожного разу, коли модуль повинен бути розширений новою функцією або елементом даних, викликаючи зміни у прямих та непрямих клієнтів. ... При класичних підходах до проектування та програмування неможливо написати модулі, які є відкритими та закритими.
Вирішенням цієї дилеми Мейєра є: ніколи не розширюйте модуль бібліотеки, змінюючи існуючі класи; натомість написати новий модуль, який підкласирует наявні класи та має нових клієнтів, залежать від цього нового модуля.
Зараз, у 1988 році, я писав іграшкові (процедурні) програми в Turbo Pascal і Blankenship Basic, і мій досвід 21 століття в JVM, CLR та на динамічних мовах, тому я не знаю, що мав на увазі Меєр "класичними підходами до проектування та програмування".
Конкретний приклад Мейєра, чому клієнтські модулі повинні бути повторно відкриті (заява переключення на перерахування, в якій зараз є більше членів, вимагає більше випадків), здається достатньо розумною, але він майже не виправдовує твердження, що кожного разу, коли ви додаєте функціональність до бібліотеки модуль, вам потрібно оновити всіх його клієнтів .
Чи є історична причина, що це твердження здавалося само собою зрозумілим у 1988 році? Чи, скажімо, додавання функцій або структур даних до статичної бібліотеки С змінило макет таким чином, що навіть із API-сумісними назад, клієнтів довелося перекомпілювати? Або Меєр насправді просто говорить про механізм забезпечення сумісності API назад?