DRY, KISS, YAGNI, GRASP, Law of Demeter

↑ 8.1 Принципы и паттерны проектирования в C♯ · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: senior

Зачем это на собесе

Общие принципы разработки: важно знать и границы их применимости.

Объяснение

ПринципФормулировкаЛовушка
DRYне дублируй знаниепреждевременная абстракция ради «похожего» кода
KISSделай проще«слишком просто» без учёта требований
YAGNIне делай то, что не нужно сейчасигнорирование очевидных ближайших требований
Law of Demeterговори только с непосредственными соседями: a.b.c.d() — плохоцепочки вызовов, знание внутреннего устройства
Composition over inheritanceпредпочитай композициюглубокие иерархии
Separation of Concernsразделяй ответственность
Fail fastобнаруживай ошибки как можно раньше
Principle of least astonishmentкод ведёт себя ожидаемо
Tell, Don’t Askвызывай поведение, а не запрашивай данные и решай снаружианемичная модель

GRASP — принципы распределения ответственности между объектами:

ШаблонСмысл
Information Expertответственность у того, кто владеет данными
Creatorсоздаёт объект тот, кто его содержит/использует
Controllerобработку системного события принимает координатор
Low Coupling / High Cohesionслабая связанность, высокая связность
Polymorphismразличия по типам — через полиморфизм
Pure Fabricationискусственный класс для чистоты дизайна (репозиторий)
Indirectionпосредник для развязки
Protected Variationsскрывайте точки изменения за интерфейсом
// Tell, Don't Ask
if (order.Status == Status.Paid && order.Items.All(i => i.InStock)) order.Status = Status.Shipped;   // логика снаружи
order.Ship();                                                                                           // логика внутри агрегата

DRY относится к знанию (бизнес-правилу), а не к текстуальному сходству кода: два одинаковых фрагмента с разной причиной изменения дублировать допустимо.

Нюансы и подводные камни

  • «Rule of three»: абстрагируйте после третьего повторения.
  • Слепой DRY создаёт связанность между несвязанными модулями.
  • Демeтер не про «одну точку»: fluent API и LINQ допустимы.
  • YAGNI не отменяет продумывание архитектуры.

Практика

  1. Найдите дублирование знания (одинаковое правило в двух местах).
  2. Перепишите цепочку a.B.C.D() в метод у владельца данных.
  3. Проверьте, где абстракция появилась «на всякий случай».

Вопросы с ответами

Связанные темы