Get Mystery Box with random crypto!

SOLID Single responsibility — класс отвечает за одну функцию | Про єнотів та IT

SOLID

Single responsibility
— класс отвечает за одну функцию
— код избавляется от копипасты (дубликатов)
— при дебаге проще исправлять ошибки, т.к. нет повторяющихся кусков кода

Пускай у вас есть какой-то класс Date, который отдает информацию о температуре и времени. Если какой-то Вася хочет получить информацию о времени, ему придется продублировать оба метода этого класса. То же касается и какого-то Андрея, который захочет получить информацию о температуре.
————— ————— —————
|DateTemp| копия |Date | копия |DateTime |
—————— <——— ————— ———> ——————
|- temp() | |- time() | |- time() |
—————— |- temp() | ——————
—————
Правильнее будет создать 2 отдельных класса, которые будут возвращать температуру и время соответственно.

Opened-closed
— класс должен быть открыт к расширению, и закрыт к изменениям
— почему хорошо следовать этому принципу? Если у вас был уже протестированный кусок кода и вы добавляете новый не изменяя текущий, вам не нужно тестировать старый. Скорее всего, в нем не будет багов

Liskov Substitution
— поведение наследующих классов не должно противоречить работе базовых
— подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый
— там где используется Child класс, должен подходить и его Parent

К примеру, у вас есть классы Child и Parent. Неправильной будет следующая реализация:
— используя Parent можно вызвать любой метод, а используя Child нужны дополнительные действия для вызова того же метода. Например, вызов какого-нибудь init()
— если метод getMessages() класса Parent возвращает коллекцию из базы данных, Child не должен возвращать пустой массив или null

Допустим, у вас есть классы Rectangle и Square, который наследуется от первого. В случае, если написать тест на Rectangle, который будет считать площадь функцией a*b, возникнет ошибка, т.к. в дочерном классе Square не реализована сторона b.
——— ————
|Rect | extends | Square |
——— <———— ————
|- a() | |- a() |
|- b() | ————
———

Interface Segregation
— много интерфейсов предназначенных для клиента лучше, чем один общий
— клиенты не должны зависеть от методов интерфейса, которые они не используют
интерфейс является принадлежностью не сервера, и клиента
— при изменении одного метода интерфейса будут перекомпилироваться остальные классы, которые имплементятся от этого интерфейса, но которые этот метод даже не используют