Принципы
Назад к Глоссарию.
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 — это не лозунг.