@d4c0

Что такое компонент? Что такое модуль?

Мне кажется, я не понимаю чего-то очевидного и базового. Я, на самом деле, даже не знаю как сформулировать вопрос лаконично, сформулирую как получится.

Существую 2 термина, компонент и модуль. Но что они обозначают?

Начнём с компонента, компонент, как мне представляется, это набор программных сущностей (под программными сущностями я подразумеваю классы/функции), построенные вокруг решения некоторой задачи. Как пример - какой-нибудь компонент фреймворка, например, Router. Или пакет, предположим, для работы с .xlsx файлами. Известный принцип "low coupling, high cohesion" как раз про компоненты. Ключевое - high cohesion, т.е. это программные сущности, которые плотно друг с другом взаимодействуют (зависят друг от друга), и объединены вокруг некоторой задачи (фичи).
Но в той же книге Чистая архитектура, в которой я последнее время тщетно пытаюсь разобраться, в описании "Принципа эквивалентности повторного использования и выпусков" дано следующее описание:

С точки зрения архитектуры и дизайна этот принцип означает, что классы и модули, составляющие компонент, должны принадлежать связной группе. Компонент не может просто включать случайную смесь классов и модулей; должна быть какая-то тема или цель, общая для всех модулей.


А судя по схеме зависимостей компонентов (из раздела "принцип ацикличности зависимостей"), автор объединяет в компонент Controllers все контроллеры, в Entities все сущности:
r0odsfch_htpxpurtonelpiy-em.png

Но о какой связности тут может идти речь? Просто скидать все контроллеры в кучу, по принципу "это контроллеры"? Ведь они никак друг от друга не зависят, как, например, и UseCases. В этой статье автор выделил несколько компонентов в своём приложении: services, infrastructure, model, т.е. опять же по принципу "что это", а не "вокруг некоторой задачи". Судя по всему у автора слой === компонент?

Часто говорят о разделении приложения на модули (например приложения на laravel), имея в виду набор Controllers + Models + routes + configs + views + что угодно ещё, вынесенные в отдельную директорию, например Blog, разве это не является как раз таки компонентом? Но это называют модулем, а ещё модулем называют любую программную сущность, которую можно импортировать (класс/интерфейс/функция и т.д.).

Прошу помощи в данном вопросе.
  • Вопрос задан
  • 502 просмотра
Пригласить эксперта
Ответы на вопрос 3
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Если смотреть в общем - это синонимы. Под оба определения можно подогнать любую сущность. А можно точно так же сказать что это разные сущности. Все зависит от конкретной задачи и области. Обычно уровни абстракции выстроены так: приложение -> модуль -> компонент -> класс -> методы. Т.е., модуль - это что-то более-менее функционально цельное, а компонент - это именно как составная часть чего-либо. А вообще, можно просто не париться и использовать те термины, которые приняты в конкретной ситуации.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
контекст имеет значение.
Компонент может быть целым приложением, которое является одним из сервисом в микросервисной архитектуре.
Или может быть набором общих функций/библиотек.

В целом, компонент достаточно самостоятельная сущность, которую можно либо использовать независимо, либо легко интегрировать.
Модуль - явно часть чего-то, что не может существовать без основного продукта (например плагин). В этом случае он не столько интегрируется, сколько сразу подключается, а существовать самостоятельно не может.

Но опять таки, надо уточнять контекст, потому что в документации к языку программирования, к фреймворку, к конкретному проекту - это слово может использоваться сразу в нескольких местах.
Ответ написан
Комментировать
Существую 2 термина, компонент и модуль. Но что они обозначают?

Зависит от контекста.
Начнём с компонента, компонент, как мне представляется...

Вот это "как мне представляется" будет зависеть от контекста => дальше можно не читать.

А судя по схеме зависимостей компонентов (из раздела "принцип ацикличности зависимостей"), автор объединяет в компонент Controllers все контроллеры, в Entities все сущности:

Если обратишь внимание на текст, то там написано "типичная диаграмма компонентов", а не "эталонная архитектура".

Судя по всему у автора слой === компонент?

Видимо. А есть Jimmy Bogart, который делает наоборот: https://www.youtube.com/watch?v=5kOzZz2vj2o

PS: википедия
Модуль (программирование) — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части.

Модуль - это какая-то часть программы, которой дали имя. (например функция или класс)
Видимо тут Модуль = Единица (Unit)

(Компонент) В программировании — множество классов и языковых конструкций, объединенных по общему признаку, предназначенного для повторного использования и развёртывания. В большинстве языков программирования нет языковых конструкций прямо отражающих понятие компонента. Компоненты реализуются с помощью стандартных конструкций, таких как классы

Компонент - какая-то самодостаточная совокупность из модулей, которая может использоваться повторно.

Но в других контекстах это может быть иначе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы