Є багато евристики, пов'язаної з об'єктно-орієнтованим дизайном. Наприклад, "всі змінні члена повинні бути приватними", або "глобальні змінні слід уникати", або "використання ідентифікації типу часу виконання (RTTI) небезпечно". Яке джерело цих евристик? Що робить їх справжніми? Чи завжди вони правдиві? У цій колонці досліджено принцип проектування, що лежить в основі цієї евристики - принципу відкритого закритого типу.
Як сказав Івар Якобсон: «Всі системи змінюються протягом свого життєвого циклу. Це потрібно мати на увазі, коли розробляються системи, які, як очікується, триватимуть довше, ніж перша версія. »Як ми можемо створити конструкції, стабільні в умовах змін, які триватимуть довше, ніж перша версія? Бертран Мейєр дав нам рекомендації ще в 1988 році, коли він придумав відомий тепер відкритий принцип. Перефразовуючи його:
ПРОГРАМНІ ЗАБЕЗПЕЧЕННЯ (КЛАСИ, МОДУЛИ, ФУНКЦІЇ, ETC.) ПОВИННІ ВІДКРИТИ ДЛЯ РОЗШИРЕННЯ, АЛЕ ЗАКРІТЛЕНО НА МОДИФІКАЦІЮ.
Коли одна зміна програми призводить до каскаду змін залежних модулів, ця програма виявляє небажані атрибути, які ми стали асоціювати з «поганим» дизайном. Програма стає крихкою, жорсткою, непередбачуваною та невиправданою. Принцип відкритого закриття атакує це дуже прямолінійно. У ньому йдеться про те, що ви повинні проектувати модулі, які ніколи не змінюються . Коли вимоги змінюються, ви розширюєте поведінку таких модулів, додаючи новий код, а не змінюючи старий код, який вже працює.
Опис
Модулі, які відповідають принципу відкритого закритого типу, мають два основні ознаки.
- Вони "Відкриті для розширення".
Це означає, що поведінку модуля можна продовжити. Що ми можемо змусити модуль вести себе по-новому і по-різному, коли змінюються вимоги програми або задовольняють потреби нових програм.
- Вони закриті для внесення змін.
Вихідний код такого модуля є непорушним. Ніхто не може вносити зміни до вихідного коду.
Здавалося б, ці два атрибути суперечать один одному. Нормальним способом розширення поведінки модуля є внесення змін до цього модуля. Як правило, вважається, що модуль, який неможливо змінити, має фіксовану поведінку. Як можна вирішити ці два протилежні атрибути?
Абстракція - це ключ ...