SOLID-принципы (мышление разделяй и властвуй, а также код нужно не править, а расширять)
# -------------------------------------------------------------------
# SOLID-принципы (мышление разделяй и властвуй)
# Компонентное мышление
# -------------------------------------------------------------------
- Данные принципы формируют архитектуру, которую будет проще поддерживать и развивать.
- Уменьшение ответственности: все состоит из кубиков и кирпичиков.
- Кто-то создает, кто-то выдает, кто-то чинит, кто-то соединяет. Начальники, исполнители.
# -------------------------------------------------------------------
# SRP) <<< Делай модули меньше >>>
# Принцип единой ответственности или обязанности (Single Responsibility)
# 1 модуль = 1 зона ответственности
# -------------------------------------------------------------------
- Класс, отвечающий за обработку товара не должен уметь записывать логи и отправлять почту
- Запись логов и отправку почты нужно вынести в отдельные классы.
- В случае изменения должно затрагиваться как можно меньше модулей. Классы нужно разбивать на независимые модули.
# -------------------------------------------------------------------
# OSP) <<< Делай модули расширяемыми >>>
# Принцип открытости закрытости (Open/Closed)
# Код нужно расширять, а не править
# -------------------------------------------------------------------
- Планируй расширяемость модуля заранее, что бы для изменения его поведения не требовалось менять код самого класса (LogDb, LogFile, LogMail)
- Если мы изменим логику работы класса Logger - это затронет все другие классы
- По этой причине класс Logger нужно разбивать на подклассы LoggerDb, LoggerFile и т.д.
- Выноси взаимодействие модулей в отдельную сущность.
# -------------------------------------------------------------------
# LCP) <<< Наследуйся правильно >>>
# Принцип подстановки Барбары Лисков (Liskov Substitution)
# Наследники ведут себя также как и родитель
# -------------------------------------------------------------------
- Есть класс птица, которая возвращает умею плавать (int).
- Есть подкласс утка, которая в методе умею плавать, также должна вернуть аналогичные данные (поведение) - (int),
а не предложить поохотится на нее или еще чего хуже (mixed)
# -------------------------------------------------------------------
# ISP) <<< Дроби интерфейсы >>>
# Принцип разделения интерфейсов (Interface Segregation)
# Дроби слишком сложные интерфейсы на небольшие части
# -------------------------------------------------------------------
- Для каждого типа информации существует свой интерфейс
- Интерфейс руль
- Интерфейс спидометр
- Интерфейс навигатора
- Интерфейс радиоприемника
# -------------------------------------------------------------------
# DIP) <<< Используй интерфейсы >>>
# Принцип инверсии зависимостей (Dependency Inversion)
# Используй интерфейсы
# -------------------------------------------------------------------
- Зависимости внутри системы должны строится на основе абстракций, а не деталей
- Модули верхних уровней не должны зависеть от модулей нижних уровней
- Оба типа модулей должны зависеть от абстракций construct(Provider $provider...)
# -------------------------------------------------------------------
# Другие (DRY, KISS, YANGI)
# -------------------------------------------------------------------
- DRY - не повторяй себя (каждая повторяющаяся часть кода должна быть абстракцией)
- KISS - делай вещи проще (не усложняй, не изобретай велосипед, не перегружай интерфейс невостребованными опциями)
- YAGNI - вам это не понадобится (откажись от избыточного функционала)
Здесь можно оставить комментарий!