Как в модульной системе грамотно делаются зависимости? Прочитал я один блог, который жевал проблему современных фреймворков - дескать это громоздские конструкции с огромной кучей кода, который мало кому нужен. И вот жевал этот автор жевал эту тему и в конце дал решение - делайте модульную структуру вашего приложения. Кусочки, дескать, имеют собственные виды, модели и контроллеры и собираются воедино (наверное он имел в виду шину (в народе - массив, для олд-скула - одномерная матрица) событий или инструкций). И вот как в этом случае последний слон ООП реализуется? Скажем есть у меня модуль Messages - задача его хранить все методы сообщений об ошибках, колекционировать их, вести логи, а если задуматься - то даже делать трассировку. Есть модуль Роутер - который разбивает строку адреса на куски и определяет - язык это значит, параметры товара, или кусок урла отвечающий за страницу. И вот Роутер имеет ошибки, то есть он ЗАВИСИТ от модуля Messages. Как же грамотно (чтобы без гемора в будущем) сделать такие зависимости? В самой шине? В главном модуле? Или все зависимости подключаются прямо в файле модуля Роутера? А если через одну зависимости? К примеру есть модуль языков еще. И роутеру требуются ошибки, а ошибкам - языки. А языкам кстати говоря тоже ошибки требуются, для ведения логов, каких фраз нету. И как тут сделать зависимости, чтобы они еще и подряд загрузились, как полагается? И без дублей.
В модульной системе зависимости лучше всего делать через внедрение зависимостей (dependency injection). Это позволяет сделать код более гибким, уменьшить связанность между модулями и легче тестировать отдельные компоненты.
В вашем случае, модуль Роутер зависит от модуля Messages. Вы можете создать интерфейс для модуля Messages, который будет реализовывать сам модуль, и передавать этот интерфейс в конструктор Роутера. Таким образом, Роутер будет иметь доступ к методам сообщений об ошибках без прямой зависимости от конкретной реализации модуля Messages.
Если у модуля Роутер также есть зависимость от модуля Языков, можно поступить так же - создать интерфейс для модуля Языков и передавать его в конструктор Роутера.
Чтобы все зависимости корректно загрузились и не было дублирования, можно использовать контейнеры внедрения зависимостей, такие как DI-контейнеры. Они позволяют автоматически управлять зависимостями и предоставляют механизмы для их загрузки и конфигурации.
Таким образом, грамотное управление зависимостями поможет вам избежать проблем с загрузкой и дублированием зависимостей в вашем приложении.
В модульной системе зависимости лучше всего делать через внедрение зависимостей (dependency injection). Это позволяет сделать код более гибким, уменьшить связанность между модулями и легче тестировать отдельные компоненты.
В вашем случае, модуль Роутер зависит от модуля Messages. Вы можете создать интерфейс для модуля Messages, который будет реализовывать сам модуль, и передавать этот интерфейс в конструктор Роутера. Таким образом, Роутер будет иметь доступ к методам сообщений об ошибках без прямой зависимости от конкретной реализации модуля Messages.
Если у модуля Роутер также есть зависимость от модуля Языков, можно поступить так же - создать интерфейс для модуля Языков и передавать его в конструктор Роутера.
Чтобы все зависимости корректно загрузились и не было дублирования, можно использовать контейнеры внедрения зависимостей, такие как DI-контейнеры. Они позволяют автоматически управлять зависимостями и предоставляют механизмы для их загрузки и конфигурации.
Таким образом, грамотное управление зависимостями поможет вам избежать проблем с загрузкой и дублированием зависимостей в вашем приложении.