Существует ли рекомендуемый шаблон для управления отношениями контроллер-контроллер / представление контроллера в многомодульных приложениях? - PullRequest
0 голосов
/ 04 мая 2020

Я читал шаблон MVC для GUI приложений - но я далеко не эксперт, поскольку я самоучка. Я пытаюсь использовать шаблон MVC в многомодульном приложении, над которым я работаю, но я не совсем понимаю, как взаимодействуют контроллеры.

В частности, как представления одного модуля отправляют запросы от пользователя на правильный контроллер?

Вот что я сделал до сих пор (используя QT: PySide2 в Python 3.7):

Модуль запуска создает экземпляр модели, основного контроллера и основного представления (страницы навигации):

launcher.py - main ()

self.model = ApplicationModel()
self.main_controller = MainController(self.model)
self.main_view = MainView(self.model, self.main_controller)

Оттуда главный контроллер создает экземпляры других контроллеров:

main_ctrl.py - MainController .__ init __ (self, model: ApplicationModel)

self._model = model
self._corpus_controller = corpus_ctrl.CorpusController(self._model)
self._prep_controller = prep_ctrl.PreprocessingController(self._model)
self._analysis_controller = analysis_ctrl.AnalysisController(self._model)

Когда пользователь хочет для работы в модуле корпуса главное представление открывает представление корпуса, передавая его: себя (родительское окно), модель и контроллер корпуса:

main_view.py - MainView.open_corpus_view ( self)

self.child_window = CorpusView(self, self._model, self._main_controller._corpus_controller)
self.child_window.show()
self.hide()

Однако по мере роста проекта я начал дублировать подпрограммы между модулями, потому что модули не знают методов друг друга, кроме как через модель. Я думаю, что каждая процедура (например, открытие корпуса) должна принадлежать только одному модулю.

Например, открытие корпуса похоже на то, что оно должно принадлежать контролеру корпуса. Тем не менее, пользователь также должен иметь возможность открыть корпус из представления предварительной обработки. Задача состоит в том, как представление предварительной обработки узнает о контроллере корпуса для вызова этой функции?

Я подумал (и попробовал) пару разных идей:

  • Рассказывая каждому представление о каждом контроллере, чтобы они могли отправлять его напрямую (кажется, становится громоздким, когда вы добавляете новые модули, вы должны добавлять их повсюду)
  • Когда программа запуска создает диктанты всех контроллеров и передает их каждое представление (это помогает представлениям, но как контроллеры узнают друг о друге?)
  • Передайте основной контроллер в представление каждого модуля в дополнение к контроллеру c, указанному для модуля, и используйте основной контроллер как «хаб» для межмодульных запросов (например, self._main_controller.corpus_controller.open_corpus ()) - кажется моим лучшим вариантом из трех на данный момент. Но и здесь это помогает представлениям, но как отдельные контроллеры узнают друг о друге?

Есть ли лучший способ подключения контроллеров и представлений из одного модуля к методам из другого контроллера модуля?

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...