Я занимаюсь рефакторингом большой кодовой базы, где большинство классов находятся в одном пакете. Для лучшей модульности я создаю подпакеты для каждой функциональности.
Я помню, как где-то узнал, что граф зависимостей пакетов не должен иметь циклов, но я не знаю, как решить следующую проблему: Figure
находится в пакете figure
, Layout
находится в пакете layout
, Layout
требует фигуры для выполнения макета, поэтому пакет layout
зависит от пакета figure
. Но с другой стороны, a Figure
может содержать Figure
внутри себя другие s, имеющие свои собственные Layout
, что делает пакет figure
зависимым от пакета layout
.
У меня есть некоторые решения, такие как создание Container
интерфейса, который Figure
реализует и положить его в Layout
пакет. Это хорошее решение? Есть ли другие возможности?
благодаря
источник
Ответы:
Вы должны думать об инверсии контроля
Вы в основном определяете интерфейс для вашего,
Layout
который расположен где-то рядом с вашим классом Layout в собственном пакете, так что у вас будет пакет реализации и пакет общедоступного интерфейса - например, вызовите егоLayoutable
(я не знаю, правильный ли это английский). Теперь - Layout будет реализовывать не этот интерфейс, аFigure
класс. Точно так же вы бы создали интерфейс для Figure,Drawable
например.Так
Теперь - Рисунок реализует Layoutable и, таким образом, может использоваться Layout и (пока я не уверен, что это именно то, что вы хотели) - Layout реализует Drawable и может быть нарисован на рисунке. Дело в том, что класс, который предоставляет некоторый сервис, делает его доступным через интерфейс (здесь: Layout и Layoutable) - класс, который хочет использовать этот сервис, должен реализовать интерфейс.
Тогда у вас будет что-то вроде объекта-создателя, который связывает их вместе. Так что создатель имел бы зависимость
Layout
как отFigure
, такLayout
и отFigure
себя , но и сам был бы независимым.Это грубая идея.
Отличным источником решения этих проблем является книга Кирка Кнорншильда « Архитектура приложений Java ».
источник
Container
интерфейс, предложенный в вопросе?Container
пойти в той же упаковке, что иLayout
. Это не сработает, а ваше решение будет.Мне не очень понятно, что это
Figure
такое, но, возможно, оно должно быть в той же упаковке, что иLayout
?Ваше предлагаемое
Container
интерфейсное решение не будет работать - если вы не поместитеContainer
интерфейс в 3-й пакет, у вас все равно будет циклическая зависимость между двумя пакетами. Смотрите ответ michael_s для чего-то, что будет работать.Другое дело, как уже упоминали другие, - это, вероятно, никогда не будет проблемой. Вы только собираетесь столкнуться с проблемами в будущем , если
Figure
иLayout
хотят быть в отдельных модулях . Вы можете справиться с этим, если и когда это станет необходимым, но, учитывая, что эти два класса кажутся довольно тесно связанными, это кажется маловероятным.источник