Skip to content

Принципы

Назад к Глоссарию.

DRY (Don't Repeat Yourself)

DRY ("Don't Repeat Yourself") разумнее понимать как принцип, направленный против дублирования знания, а не как запрет на любое внешнее сходство кода.

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

Ключевой вопрос здесь в другом: поддерживается ли одно и то же правило, модель или предположение в нескольких местах и есть ли риск, что со временем эти места начнут расходиться. Именно такой вид дублирования по-настоящему опасен.

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

Связанное чтение: DRY — это про дублирование знания, а не про внешнее сходство кода.

WET ("Write Everything Twice" / "We Enjoy Typing")

WET — это неформальный контртермин, которым обычно обозначают кодовую базу или решение, где дублирование оставлено без контроля. Расшифровки у него встречаются разные; самые частые — "Write Everything Twice" и "We Enjoy Typing". По смыслу речь идет о повторении, которое снова и снова кодирует одно и то же знание без ясной причины.

В отличие от DRY, WET не является принципом проектирования. Это скорее тревожный индикатор. Обычно он указывает на повторяющиеся правила, бизнес-логику или структурные решения, которые со временем начнут расходиться и удорожать изменения.

Не всякий дубль делает систему WET. Этот термин становится полезным тогда, когда повторение перестает быть временным или осознанным и начинает превращать сопровождение системы в угадывание.

При этом WET иногда используют и в более узком эвристическом смысле: не вводить абстракцию до тех пор, пока не появился хотя бы второй реальный экземпляр такого же кода или поведения. В этом употреблении смысл не в том, чтобы поощрять дублирование, а в том, чтобы сдерживать преждевременные абстракции, пока общая форма решения еще не устоялась.

SOLID

SOLID — это набор принципов, который помогает рассуждать о структуре кода, распределении ответственности, зависимостях и форме интерфейсов.

  • SRP — Single Responsibility Principle, принцип единственной ответственности: одна единица не должна накапливать несвязанные причины для изменения.
  • OCP — Open-Closed Principle, принцип открытости-закрытости: устойчивое поведение лучше расширять, а не постоянно переписывать.
  • LSP — Liskov Substitution Principle, принцип подстановки Лисков: подмена реализации не должна ломать ожидания, заданные исходным контрактом.
  • ISP — Interface Segregation Principle, принцип разделения интерфейсов: интерфейсы должны быть достаточно узкими, чтобы клиент зависел только от реально используемого.
  • DIP — Dependency Inversion Principle, принцип инверсии зависимостей: зависимости лучше выстраивать вокруг абстракций и устойчивых границ, а не вокруг конкретных деталей.

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

Связанное чтение: Clean code — это не лозунг.

GRASP (General Responsibility Assignment Software Patterns)

GRASP — это набор принципов распределения ответственности, который помогает рассуждать о том, где должно жить поведение и как объекты или модули должны взаимодействовать друг с другом.

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

Связанное чтение: Clean code — это не лозунг.

Last updated: