Циклическая зависимость двух проектов затмения - PullRequest
1 голос
/ 22 апреля 2009

Я пытаюсь реализовать какой-то MVC в Java. На самом деле это скорее MVP, но это не имеет значения для моей проблемы.

Следующая ситуация: У меня есть графический интерфейс, созданный с помощью Netbeans (из-за лучшего GUI-редактора), который часто обновляется и меняется.

Поскольку мой основной проект проще поддерживать в Eclipse, я решил импортировать проект Netbeans в Eclipse как отдельный проект. Итак, я здесь с проектом "App", содержащим контроллер и пакет модели, и проектом "GUI", содержащим пакет представления. Проблема в том, что шаблон, которому я следую, имеет циклическую зависимость между представлением и контроллером. Всякий раз, когда представление изменяется, контроллер получает уведомление, решает, какие данные получить из модели, а затем вносит изменения в представление.

Когда я добавляю App к пути сборки GUI и наоборот, я получаю сообщение об ошибке «В пути сборки проекта« GUI »обнаружен цикл». Я имею в виду, что это правда, этот цикл уже в моем дизайне.

В настоящее время при запуске я регистрирую представление для его контроллера следующим образом (это не настоящий код, я пытаюсь сократить его)

package view;
import controller.*;
class viewA{
   ...
   public viewA() {
       controllerA.register(this);
   }
   ...  
}

package controller;
import view.*;
class controllerA implements SomeListener{
   ...
   protected viewA[] registeredViews;
   public static register(viewA interestedView){
       arrayPush(registeredViews,interestedView);
       interestedView.addSomeListener(this)    
   }
   ...
}

Итак, вы видите, что соединение установлено путем передачи ссылки на контроллер и последующей регистрации слушателя в этом представлении. Проблема в том, что если у меня нет GUI проекта в App пути сборки, импорт не может быть разрешен, то же самое происходит и при отсутствии App в пути GUI.

Я бы хотел сохранить эту структуру проекта, а также придерживаться своей архитектуры MVC. Как я могу обойти это? Каковы ваши предложения?

Ответы [ 4 ]

7 голосов
/ 22 апреля 2009

Ваши слушатели отстают от обычного пути - обычно, контроллер имеет инициативу. Он создает объект просмотра и регистрирует себя в качестве слушателя событий просмотра.

Кроме того, тип слушателя должен быть интерфейсом, определенным в проекте View. Затем Contoller реализует этот интерфейс, и представление не должно знать о классах конкретного контроллера. Цикл разрешен. Конечно, вы можете сделать это и в «обратной» настройке.

4 голосов
/ 22 апреля 2009

Круговые зависимости между классами сами по себе не являются проблемой (это особенность). Тем не менее, вы должны проверить свой дизайн и обосновать зависимости.

Проекты Eclipse, возможно, немного перегружены. К сожалению, Eclipse на самом деле не справляется со многими (более 10) проектами, а другой отличный частичный компилятор работает медленнее, а процесс компиляции кажется более ошибочным.

В нескольких проектах разработки, в которых я принимал участие, слияние и сокращение количества проектов привело к сокращению времени сборки и уменьшению проблем сборки.

В собственных приложениях, больших и малых, и если есть вероятность, что все, кто работает над кодом, будут иметь доступ ко всему коду, то на самом деле нет смысла разделять код между проектами.

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

Весьма распространено иметь проект «бизнес-уровня», проект уровня «данных» и проект графического интерфейса для каждого «модуля» в большом приложении, и тогда вы обязательно получите несколько циклических зависимостей, если вы не создают искусственные "интерфейсные проекты" и т. д.

Прежде чем идти дальше, чтобы удалить зависимости, подумайте, реальны ли эти зависимости, и, возможно, следует объединить проекты.

Помните, что абстрактные понятия, такие как «модули» или «слои», не обязательно означают, что у вас должны быть соответствующие проекты или папки (или что-то в этом роде). Проекты Eclipse - это группы файлов, над которыми вы работаете, не более или менее реально .

Возможно, вы захотите прочитать о уровне мифического бизнеса .

2 голосов
/ 22 апреля 2009

Прежде всего, вы можете использовать интерфейсы, а не фактические классы для представления контроллера и представления друг другу.

Такая проблема довольно распространена, и, к сожалению, я не думаю, что есть действительно хорошее решение, потому что проекты не должны создавать цикл в Eclipse (разрешено ли это в Netbeans?

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

Если вы действительно хотите этого избежать, вам, возможно, придется использовать внедрение зависимостей, такое как Spring.

1 голос
/ 09 декабря 2011

Вы также можете просто добавить файл .jar одного из двух проектов в другой проект, вместо того чтобы сделать его зависимым от самого проекта. Просто не забудьте обновить банку при необходимости.

...