Мне кажется, я не понимаю чего-то очевидного и базового. Я, на самом деле, даже не знаю как сформулировать вопрос лаконично, сформулирую как получится.
Существую 2 термина,
компонент и
модуль. Но что они обозначают?
Начнём с компонента, компонент, как мне представляется, это набор программных сущностей (под программными сущностями я подразумеваю классы/функции), построенные вокруг решения некоторой задачи. Как пример - какой-нибудь компонент фреймворка, например, Router. Или пакет, предположим, для работы с .xlsx файлами. Известный принцип "low coupling, high cohesion" как раз про компоненты. Ключевое - high cohesion, т.е. это программные сущности, которые плотно друг с другом взаимодействуют (зависят друг от друга), и объединены вокруг некоторой задачи (фичи).
Но в той же книге Чистая архитектура, в которой я последнее время тщетно пытаюсь разобраться, в описании "Принципа эквивалентности повторного использования и выпусков" дано следующее описание:
С точки зрения архитектуры и дизайна этот принцип означает, что классы и модули, составляющие компонент, должны принадлежать связной группе. Компонент не может просто включать случайную смесь классов и модулей; должна быть какая-то тема или цель, общая для всех модулей.
А судя по схеме зависимостей компонентов (из раздела "принцип ацикличности зависимостей"), автор объединяет в компонент Controllers все контроллеры, в Entities все сущности:
Но о какой связности тут может идти речь? Просто скидать все контроллеры в кучу, по принципу "это контроллеры"? Ведь они никак друг от друга не зависят, как, например, и UseCases. В
этой статье автор выделил несколько компонентов в своём приложении: services, infrastructure, model, т.е. опять же по принципу "что это", а не "вокруг некоторой задачи". Судя по всему у автора слой === компонент?
Часто говорят о разделении приложения на модули (например приложения на laravel), имея в виду набор Controllers + Models + routes + configs + views + что угодно ещё, вынесенные в отдельную директорию, например Blog, разве это не является как раз таки компонентом? Но это называют модулем, а ещё модулем называют любую программную сущность, которую можно импортировать (класс/интерфейс/функция и т.д.).
Прошу помощи в данном вопросе.