Входит в Чистая архитектура - Мартин, Роберт
Все три существующие парадигмы были сформированы в период с 1958 по 1968 год, каждая из них налагает определенные ограничения, таким образом, все они являются в определенном роде “негативными”. То есть, каждая из парадигм говорит нам, что не следует делать, в большей степени, чем что следует.
- Структурное программирование предполагает дисцпилинированную прямую
передачу управления (отказ от
goto
). Оно заставляет нас рекурсивно декомпозировать программы до уровня небольших проверяемых функций. Затем мы можем использовать тесты для проверки правильности работы каждой из них. Есть небольшое ограничение - Научные теории недоказуемы, но опровергаемы, т.е. мы должны согласиться, что созданный набор тестов не может опровергнуть утверждение о правильности работы функции. - Объектно-ориентированное программирование налагает ограничения на непрямую передачу управления (отказ от указателей на функции). Любая зависимость на уровне исходного кода может быть инвертирована в рамках этой парадигмы. Использование полиморфизма позволяет получить абсолютный контроль над направлением зависимостей в системе. Полиморфизм позволяет архитектору создать архитектуру подключаемых модулей (плагинов), в которой модули, содержащие высокоуровневые политики (бизнес-правила) не зависят от модулей с низкоуровневыми деталями. При этом плагины могут разрабатываться и развертываться независимо от высокоуровневых модулей.
- Функциональное программирование предполагает отказ от присваиваний (отказ от изменений состояния). Смысл в том, что хорошо структурированные приложения будут разделены на компоненты по признаку изменяемости данных. Часть компонентов будет изменять данные, а часть - нет. Такое разделение возможно только при использовании подхода, защищающего неизменяемые данные.
Почему парадигмы важны для архитектуры? Полиморфизм используется как механизм для пересечения архитектурных границ (разделение компонентов), функциональное программирование дисциплинирует работу с данными, а структурные блоки являются алгоритмическим основанием для модулей ПО.