Найти в Дзене

Принцип открытости-закрытости

Услышала сегодня объяснение принципа открытости-закрытости, которое мне очень понравилось, так что делюсь с вами. Напомню, что сам принцип заключается в том, что классы должны быть открыты для расширения, но закрыты для изменения. Звучит достаточно просто, но что значит "Закрыты"? В какой момент их закрыть надо? А если там баги? А как расширять, если они закрыты? Закрываем класс мы после того как убедились в этих пунктах: После этого мы считаем, что наш класс закрыт и никогда в нём не пишем новый код больше. НО! Конечно же мы что-то меняем, если нашелся баг или теперь логика другая. Например, раньше умножали на 3, а потом пришел аналитик и сказал умножать на 7. Как класс расширять, если он закрыт и его нельзя трогать? Есть два способа: Все сказанное выше относится прям к идеальной ситуации. К этому надо стремиться, но не всегда получается следовать. Бывают ситуации, что нам нужно что-то очень СРОЧНО добавить/отредактировать и нет времени на архитектуру и, по моему мнению, абсолютно нор

Услышала сегодня объяснение принципа открытости-закрытости, которое мне очень понравилось, так что делюсь с вами.

Напомню, что сам принцип заключается в том, что классы должны быть открыты для расширения, но закрыты для изменения. Звучит достаточно просто, но что значит "Закрыты"? В какой момент их закрыть надо? А если там баги? А как расширять, если они закрыты?

Закрываем класс мы после того как убедились в этих пунктах:

  1. Всё протестировано и точно работает правильно;
  2. В плане кода всё сделано: видимость поправлена, наследование сделано, комментарии оставлены и прочее;
  3. Класс корректно работает во всём проекте и ничего не ломает.

После этого мы считаем, что наш класс закрыт и никогда в нём не пишем новый код больше. НО! Конечно же мы что-то меняем, если нашелся баг или теперь логика другая. Например, раньше умножали на 3, а потом пришел аналитик и сказал умножать на 7.

Как класс расширять, если он закрыт и его нельзя трогать? Есть два способа:

  1. Через наследование. Наследуемся от основного класса и добавляем новое необходимое поведение.
  2. Если изначально у нас абстрактный класс, то мы можем в него добавлять новое абстрактное поведение. Тут уже в силу вступает полиморфизм.

Все сказанное выше относится прям к идеальной ситуации. К этому надо стремиться, но не всегда получается следовать. Бывают ситуации, что нам нужно что-то очень СРОЧНО добавить/отредактировать и нет времени на архитектуру и, по моему мнению, абсолютно нормально изменить существующий класс. Исключения есть в любом правиле :)

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes