Для меня, идеальный модуль это тупо папочка с файлами.
1 модуль = 1 папка.
Закинул такую папку из одного проекта в другой и с минимальными телодвижениями по подключению, всё заработало.
Такая структура позволяет:
1. Хранить вместе всё что вместе используется (код и тесты рядом с кодом)
2. Легко переиспользовать модули между проектами - скопировал - вставил
3. Легко делать копии модулей. Например в том же проекте нужен подобный модуль но с немного другой логикой, копируем и вписываем изменившуюся логику, и всё работает.
4. Работать в одной папке в пределах одной бизнес-задачи, не держать три-четыре дерева открытых рядом в просмотре проекта.
src\Components\MyModule
src\Controllers\MyModule
views\my-module
tests\my-module
Вместо этого используем:
src\MyModule
\Components
\Controllers
\Views
\Tests
Работаем в одной папке, упрощаем управление, разгружаем мозг.