SOLID Принцип открытости/закрытости
sergey shishkin"Open-Closed Principle (OCP)":
Развитие кода оптимально планировать так, чтобы для реализации программистом новых задач требовалось добавлять новый код, а старый код при этом в изменениях не нуждался. Код должен быть открыт (Open) для добавления и закрыт (Closed) для изменения.
Целью для этого принципа является минимизация трудозатрат и устранение неявно вносимых ошибок, получаемых из-за того, что в разработке существуют следующие инварианты:
- ⟨1.1⟩, ⟨1.2⟩, ⟨1.3⟩
- для реализации новой задачи программист может добавить новые блоки кода или изменить поведения старых блоков кода,
- добавление блока кода требует проверки в месте нового использования, и порождает затраты времени программиста
- обусловленное новой задачей изменение поведения блока кода требует проверки в месте нового использования и во всех местах старого использования, что также порождает затраты времени программиста, а в случае опубликованного блока кода работу всех программистов, использовавших это блок кода.
- вариант реализации новой задачи целесообразно выбирать минимизируя затраты времени программиста.
Чаще в практике разработки программного обеспечения затраты добавления гораздо меньше затрат изменения, что делает очевидной пользу использования "Open-Closed (OCP)" принципа. При этом существует масса приемов поддержания архитектуры программы в состоянии, когда реализация новой задачи сводится только к добавлению блоков кода. Эта работа с архитектурой тоже требует затрат времени программиста, но как показывает практика в крупных проектах гораздо меньших чем использование подхода изменений старых процедур. И, конечно, это описание разработки — идеализация. Почти не бывает реализации задачи только добавлением или только изменением. В реальных задачах применяется смесь этих подходов, но OCP подчеркивает пользу в использовании подхода добавления.
И здесь хотелось бы выписать набор приемов поддержания OCP. Из очевидных областей, где можно поискать эти приемы:
- паттерны проектирования;
- библиотеки dll и варианты их распространения, обновления и развития функционала;
- развитие COM библиотек и объектов в них;
- развития языков программирования и поддержка ранее написанного кода;
- развитие законодательной системы государства.