Есть много эвристик, связанных с объектно-ориентированным дизайном. Например, «все переменные-члены должны быть частными», или «следует избегать глобальных переменных», или «использование идентификации типа во время выполнения (RTTI) опасно»). Каков источник этой эвристики? Что делает их правдой? Они всегда правдивы? В этой колонке исследуется принцип проектирования, лежащий в основе этой эвристики - принцип открытого-закрытого типа.
Как сказал Ивар Якобсон: «Все системы меняются в течение своих жизненных циклов. Это необходимо учитывать при разработке систем, которые, как ожидается, будут работать дольше, чем первая версия ». Как мы можем создавать проекты, которые стабильны перед лицом изменений и будут работать дольше, чем первая версия? Бертран Мейер дал нам руководство еще в 1988 году, когда он придумал известный теперь принцип открытого-закрытого типа. Перефразируя его:
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (КЛАССЫ, МОДУЛИ, ФУНКЦИИ, И Т.Д.) ДОЛЖНЫ БЫТЬ ОТКРЫТЫ ДЛЯ РАСШИРЕНИЯ, НО ЗАКРЫТЫ ДЛЯ МОДИФИКАЦИИ.
Когда одно изменение в программе приводит к каскаду изменений в зависимых модулях, эта программа демонстрирует нежелательные атрибуты, которые мы привыкли ассоциировать с «плохим» дизайном. Программа становится хрупкой, жесткой, непредсказуемой и не подлежащей повторному использованию. Принцип «открыто-закрыто» атакует это очень простым способом. Это говорит о том, что вы должны разрабатывать модули, которые никогда не меняются . Когда требования меняются, вы расширяете поведение таких модулей, добавляя новый код, а не изменяя старый код, который уже работает.
Описание
Модули, которые соответствуют принципу открытого-закрытого, имеют два основных атрибута.
- Они «открыты для расширения».
Это означает, что поведение модуля может быть расширено. То, что мы можем заставить модуль вести себя по-новому и по-разному при изменении требований приложения или для удовлетворения потребностей новых приложений.
- Они «закрыты для модификации».
Исходный код такого модуля нерушим. Никто не может вносить изменения в исходный код.
Казалось бы, эти два атрибута расходятся друг с другом. Обычный способ расширить поведение модуля - внести изменения в этот модуль. Обычно считается, что модуль, который нельзя изменить, имеет фиксированное поведение. Как можно разрешить эти два противоположных атрибута?
Абстракция - это ключ ...