kavi4
@kavi4
Web developer

Как уменьшить связанность классов?

Есть следующая структура классов.
5ab3eb5db6ccc011081836.png
Есть класс GraphParser который может как парсить граф в json , так и json парсить в граф, вопрос в следующем: чтобы создать граф в него нужно передать обьекты Point и Edge ,а чтобы создать Point нужно передать config и container в котором он будет отображаться и получается большая иньекция зависимостей в обьект, которому они не нужны, можно было бы вынести config и container в глобальную область видимости, но это лишь замаскирует проблему.

Есть какие нибудь шаблоны проектирования для данного случая , я знаю про фабрики, но должно быть что-то получше.
var parser = new JsonParser({config:Config,container:Container});
 var graph = new Graph({config:Config,container:Container,points:points,edges:edges,parser:parser});
  • Вопрос задан
  • 442 просмотра
Решения вопроса 1
@arTk_ev
Поможет перестать мыслить плоско и использовать диаграмму классов. К проектированию все это не имеет отношение.
Прочитайте про декомпозицию систем, уроню декомпозиции, теория систем, SOLID.
Как я понял, вам нужно сделать модуль парсера.
Point, Edge, Graph - это не программные сущности, а просто структура данных без функционала. Им точно не нужен Container.
Parser - универсальный модуль, который может серилизовать и дессерилозвать, любые абстрактые данные. Его уже можно разбить на модули для записи и чтения файлов или на парсеры конкретных объектов.
Модули нижнего уровня декомпозиции не могут ссылать напрямую к модулях верхнего уровня. Все связи должны идти сверху-вниз. А вот уже на такой структуре можно применять инверсию зависимостей.
5ab5242bd26f4639869567.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Точка не должна знать, какие у приложения настройки и в какой контейнер ее запихнули.
Это контейнер должен уметь выдать список того, что в него запихнули, а рендер - знать настройки.
Вы слишком много логики засунули внутрь классов, от которых требуется только хранение координат и пар (или списков) точек. Вот и мучаетесь теперь с ними.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
1. Что такое Container и для чего он нужен? Возможно, от этого дела удастся избавиться или заменить интерфейсом?
2. Не должен конструктор Graph брать в параметры Parser. Наоборот, Parser функцией parse() должен возвращать Graph.
3. Config стоит разбить на несколько частей: одна специфична для Graph, вторая для Parser. Как их объединять — зависит от того, кому какие настройки нужны.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы