Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Вопрос, связанный с тем как лучше реализоавть MVC


Автор: Royan 23.3.2008, 19:12
Вопрос по архитектуре. У меня есть меню - класс унаследованный от JMenuBar и соотвественно класс окна, унаследованный от JFrame.

План был таков:

1) Для меню только класс MenuController (меню статично поэтому модель не нужна)
2) Для JFrame и соответственно всех входящех в него элементов GUI один FrameController и одна модель FrameModel.

Подумав немного, я столкнулся с проблемой, вот, допустим, пользователь из меню открыл файл. То есть отработал код в MenuController, далее ... тут у меня начинаются вопросы. По идее я должен сообщить FrameController, что был открыт файл и он должен уже его обработать и направить данные в MenuController, так? Тогда я должен подписать FrameController на какое-то событие которым MenuController будет сигналищировать об открытии файла, так? Основной вопрос - Не очень ли это сложно? Быть может правильнее вообще создать один глобальный Controller, который будет обрабатывать события от всех элементов? Поделитесь пожалуйста опытом как правильно проектировать MVC.

Автор: teg 23.3.2008, 19:41
Правильней? Это неверный вопрос. 

Всё определяется Вашими задачами. Если приложение небольшое, а функционал невелик, то вполне хватит одного контроллера. Но если заранее известно, что простое на старте приложение будет обрастать фичами, то надо сразу планировать по-серьёзному.

Автор: Royan 23.3.2008, 20:40
teg, Мои задачи описаны в самом вопросе

Автор: COVD 23.3.2008, 21:37
А вы попробуйте какую-нибудь заготовку. Например, в Nетбинc 6 есть тип проекта - DesktopApplication. Нажали на кнопку - и готова болванка с меню и кнопкой About. Там сплошной маппинг action-ов ( модно! ), у каждого класса есть файл ресурсов. Пустое приложение уже имеет 200К библиотеку, где инфраструктура забита. Но есть опасность: пока это осваивать, они новое придумают.

Автор: Royan 23.3.2008, 22:28
COVD, Я этого не могу себе позволить.

Автор: COVD 23.3.2008, 22:59
 smile чего "этого"? 

Автор: w1nd 24.3.2008, 00:11
Royan, шаблон Command, реализованный в Swing (javax.swing.Action), вас не устраивает? И вообще, при чём здесь MVC? Зачем пихать MVC туда, где он вообще неприменим? 

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

Автор: Royan 25.3.2008, 00:22
Цитата(COVD @  23.3.2008,  19:59 Найти цитируемый пост)
чего "этого"?  

Цитата(COVD @  23.3.2008,  18:37 Найти цитируемый пост)
Nетбинc 6 есть тип проекта - DesktopApplication

Ну если коротко, то я ограничен только использованием классов, входящих в core java API 1.6 соответственно данный подход для меня невозможен, да и потом как вы сами сказали на изучение этого framework'а уйдет столько времени что кто то успеет написать новый.

w1nd, Насчет шаблона, можно пример, я не совсем понимаю как он относится к моей задаче. Глобальный диспетчер событий он же и есть глобальный Controller о котором я говорю в конце своего оригинального поста. Если вы имели ввиду что-то другое, пожалуйста, поясните.

Автор: w1nd 25.3.2008, 00:31
Цитата(Royan @  25.3.2008,  00:22 Найти цитируемый пост)
w1nd, Насчет шаблона, можно пример, я не совсем понимаю как он относится к моей задаче.

Вы спрашиваете: "То есть отработал код в MenuController, далее ... тут у меня начинаются вопросы. По идее я должен сообщить FrameController, что был открыт файл и он должен уже его обработать и направить данные в MenuController, так?"

1. Зачем сообщать кому-либо о необходимости открывать файл, если в соответствующем пункте меню должен быть Action, который и файл откроет и вполнит все сопутствующие процедуры?
2. Зачем данные в MenuController?

Зачем вообще MenuController? Что-то вроде глобального контекста, хранящего состояния всех и вся?

Автор: Royan 25.3.2008, 01:19
Цитата(w1nd @  24.3.2008,  21:31 Найти цитируемый пост)
сли в соответствующем пункте меню должен быть Action

Окей я не спорю, но можно пример кода с использованием Action'а? Я никогда с ними не имел дела.

Добавлено через 4 минуты и 9 секунд
Или речь идет об обработке в методе actionPerformed ActionEvent'ов?

Автор: Kangaroo 25.3.2008, 01:42
Цитата(Royan @  25.3.2008,  00:19 Найти цитируемый пост)
Окей я не спорю, но можно пример кода с использованием Action'а? 

http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

Автор: Royan 25.3.2008, 17:20
Kangaroo, Спасибо за ссылку. В общем, из прочтенного я так понял что Action'ы это то что было до того как придумали вышеозвученный паттерн. Я также не нашел преимуществ Action'ов перед Controller'ом. И там и там надо писать класс (наследник AbstractAction в первом случае и собственно Controller во втором) разница лишь в том, что наследник AbstractAction выходит более специфицированным, потому что используется только с конкретным набором GUI элементов (Кнопки, пункты меню, текстовые поля и все). Controller же обычно пишется таким образом, что в нем имплементируются все интерфейсы (например, PropertyChangeListener для той же модели) В общем я пока склоняюсь написать один внутренний класс контроллер в корневом классе окна своего приложения. Так мне кажется будет задан простор для дальнейшей разработки, то есть когда мне вдруг понадобятся custom свойства я легко смогу создать класс модели и подключить обработку событий к Controller'у. А все меню и кнопки запросто смогут уже сейчас взять себе actionHandler'ами экземпляр класса Controller.

Автор: w1nd 25.3.2008, 22:38
Цитата(Royan @  25.3.2008,  17:20 Найти цитируемый пост)
В общем, из прочтенного я так понял что Action'ы это то что было до того как придумали вышеозвученный паттерн. <...> Я также не нашел преимуществ Action'ов перед Controller'ом.

 smile 


Автор: COVD 27.3.2008, 03:05
Цитата

Ну если коротко, то я ограничен только использованием классов, входящих в core java API 1.6 соответственно данный подход для меня невозможен, да и потом как вы сами сказали на изучение этого framework'а уйдет столько времени что кто то успеет написать новый.


Ну, это я роптал. DesktopApplication можно рассматривать, как пример реализации идеи акшинов и некоторых других прогрессивных приемов, которые можно копировать не приходя в сознание  smile . 



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)