GoF vs SOLID vs GRASP — Три уровня абстракции

Три уровня знания о проектировании. Согласно автору: придумывались снизу вверх, применяются сверху вниз.

Иерархия

GRASP    ← наиболее абстрактные принципы (Larman)
   ↓
SOLID    ← обобщение опыта в 5 принципов (Боб Мартин)
   ↓
GoF      ← конкретные структуры кода (Gang of Four, 1994)

Хронология (как придумывалось)

  1. 1994 — GoF: 4 практикующих программиста + методиста собрали 23 повторяющихся шаблона из реального кода. Книга «Design Patterns».
  2. ~2000 — SOLID: Боб Мартин обобщил паттерны GoF в 5 принципов: SRP, OCP, LSP, ISP, DIP.
  3. Конец 90-х — GRASP: Крейг Ларман систематизировал ещё более абстрактные принципы: Information Expert, Creator, Controller, Low Coupling, High Cohesion, Polymorphism, Pure Fabrication, Indirection, Protected Variations.

«Мы пересмотрели много кода и поняли, что их можно обобщить в меньшее количество принципов»

Порядок применения (сверху вниз)

  1. GRASP — на этапе проектирования системы: общие мазки, общие принципы.
  2. SOLID — при дизайне классов и модулей: что отвечает за что.
  3. GoF — конкретная реализация структур кода.

«Сначала GRASP, потом SOLID, потом GoF применяешь»

Применение SOLID разворачивается в GoF

«Если выполнять SOLID, ты постепенно всё равно развернёшь их в паттерны GoF плюс пара паттернов сверху (открытый конструктор)»

Связи:

  • SRP + декомпозиция → Facade, Strategy
  • OCP → Strategy, Decorator, Template Method
  • LSP → Adapter, Bridge
  • ISP → Adapter, Facade
  • DIP → Abstract Factory, Bridge

Все три применимы в ФП

«SOLID, GRASP — прекрасно адаптируемы под функциональное программирование или мультипарадигменное»

  • ООПшники присвоили принципы, но это мультипарадигменно.
  • Многие ФП-«принципы» — переписанные SOLID под другие термины.
  • Алан Кей под ООП имел в виду модель акторов, не современное наследование.

Что разделяют

Уровень Что определяет Пример вопроса
GRASP Кто чем должен заниматься в системе «Где разместить эту логику?»
SOLID Как должны выглядеть классы/модули «Можно ли заменить этот класс другим?»
GoF Конкретные структуры реализации «Какой паттерн тут применить?»

Главные тезисы автора

  • «GoF — это структура кода в одном процессе», не архитектура.
  • «Архитектура начинается там, где паттерны GoF заканчиваются» — Enterprise Patterns, DDD.
  • «Каждый, кто доучил всё это, рано или поздно сцепит воедино» — но проще, если знаешь порядок.
  • Объектно-ориентированное оккупировало термины, на самом деле принципы шире.
  • «SOLID и GRASP — это подпорки для плохих языков» (мнение ФП-сообщества, с которым автор не согласен).
  • Книги статичны — мысль автора устаревает, нужен живой контекст.

🎓 Источники

См. также