Принципы программирования

SOLID

  • Single Responsibility Principle (SRP) – принцип единственной ответственности: На каждый объект должна быть возложена одна единственная обязанность.
  • Open\Close Principle (OCP) – принцип открытости\закрытости: программные сущности должны быть открыты для расширения, но закрыты для изменения.
  • Liskov Substitution Principle (LSP) – принцип подстановки Лисков: объекты в программе могут быть заменены их наследниками без изменения свойств программы.
    • Реализация LSP через контракты:
      • Предусловия в подтипе должны быть не сильнее, чем в супертипе.
      • Постусловия в подтипе должны быть не слабее, чем в супертипе.
      • Перечень выбрасываемых исключений в подтипе должен быть не шире, чем в супертипе. (хотя часто на это не обращают внимания)
      • Остальные детали контракта, которые нельзя проверить статически, должны проверяться тестами, и подтипы должны проходить все тесты, которые проходят супертипы.
  • Interface Segregation Principle (ISP) – принцип изоляции интерфейсов: Несколько специализированных интерфейсов лучше, чем один универсальный.
  • Dependency Inversion Principle (DIP) – принцип инверсии зависимостей: Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Do not repeat yourself (DRY)

Одинаковый код должен быть вынесен в отдельный метод и использован другими.

Command-Query Separation (CQS)

Все функции некоторого интерфейса должны быть или некоторыми запросами, возвращающими ответ, или командами, изменяющими состояние системы, но не одновременно. Никогда функция не должна возвращать ответ и изменять состояние системы одновременно.

Keep it simple, stupid! (KISS)

Делайте все настолько простым, насколько можно, но не проще.

You Aren't Gonna Need It (YAGNI)

Принцип, требующий реализации только основных возможностей класса (программы, библиотеки и т.д.). При этом реализация должна быть максимально простой. По сути это Бритва Оккама для разработки программного обеспечения. 

Inversion of Control (IoC)

Принцип разработки программного обеспечения, который подразумевает что ходом программы управляет внешний, по отношению к ней, Framework. Dependency Injection (DI) является частью IoC.

Dependency Injection (DI)

Стиль разработки программного кода, когда в зависимости класса не создаются им напрямую, а внедряются из вне. При этом уменьшается связанность кода, но теряется контроль над созданием и временем жизни объектов, от которых зависит класс.

Descriptive And Meaningful Phrases (DAMP)

Принцип написания модульных тестов таким образом, чтобы происходящее в них можно было понять без дополнительных комментариев и документации. Достигается использованием описательных имен и допускает небольшие нарушения принципа DRY при необходимости.

Arrange Act Assert (AAA)

Правило создания модульных тестов – задать условия (Arrange), выполнить действие (Act) и проверить итог (Assert).

GRASP (General Responsibility Assignment Software Patterns)

GRASP представляет из себя набор принципов, определяющих распределение ответственностей по классам в приложении:

  • Information Expert (Информационный эксперт) – класс, сосредотачивающий информацию о конкретной предметной области. Операции над ней также передаются в его ответственность. Например, Aсcount хранит информацию о счете и может предоставить выписку с него.
  • Creator (Создатель) – классы, создающие другие классы. Это может быть фабрика, пул и т.д.
  • Controller (Контроллер) – объект, который несет в себе управляющие функции (не путать с бизнес-логикой приложения). Яркий пример, Контроллер в шаблоне MVC.
  • Low Coupling (Низкая связанность) – данный принцип декларирует программирование на основе интерфейсов и абстракций, а не конкретных реализаций. Это способствует упрощению повторного использования кода, его поддержки, модификации, тестированию.
  • High Cohesion (Высокое сцепление) – методы внутри классы должны быть тесно связаны между собой. Это еще одна гарантия, того что класс обеспечивается реализацию четко определенной единственной ответственности. Классы с низким сцеплением легко можно разделить на несколько.
  • Pure Fabrication (Чистая выдумка) – представляет собой классы, которые не отображают реальных объектов из предметной области приложения. Например, репозиторий, используемый для сохранения и загрузки объектов из хранилища.
  • Indirection (Посредник) – необходим для устранения сильной связанности нескольких классов. На него ложится ответственность организации взаимодействия между ними. К слову, Контроллер в MVC является также посредником между Моделью и Представлением.
  • Protected Variations (Защищенные изменения) – данный принцип предполагает определение объектов, которые наиболее вероятно будут подвержены изменениям, и применение мер, по минимизации влияний этих изменений на остальные части приложения.
  • Polymorphism (Полиморфизм) – возможность объектов с одинаковой спецификацией иметь различную реализацию.