Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
-7 / 2 / 1
Регистрация: 10.04.2016
Сообщений: 53

Тот самый MVC для desktop

13.05.2016, 17:21. Показов 3196. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени, форумчане. Последнее время пытаюсь постигнуть дзен пониманием паттернов программирования GUI-приложений, но в голове мозаика не складывается. Хорошей литературы достаточно для веб, но MVC для веб не увязывается с настольными приложениями. Да и стоит ли, может тут лучше использовать другой подход?

Сейчас я понимаю View как набор состояний отображения, Controller переключает эти состояния, и Model хранит логику программы и методы для её изменения. Закрадывается предположение,что модели для View и Controller - разные понятия. Эти все теории просты, когда эта троица представлена в одном экземпляре, но когда появляется дерево моделей, вложенные вьюшки, в том числе для повторного использования, контролер или раздувается до деградации ООП к простым функциям (методам внутри одного контролера), или теряет переносимость при изменении структуры моделей или представления, так вот тогда становится непонятно, кто кого имеет, что во что вложено, кто какие выполняет задачи.

Пишу на Qt c++, там есть сигналы и подписка на них. Но мне бы хотелось обсудить сам принцип, можно на общих схемах.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2016, 17:21
Ответы с готовыми решениями:

Тот самый DateTimePicker
Здавствуйте. Помогите пожалуйста. Использую на форме компонент DateTimePicker. С помощью его добавляю данные в БД Access в поле дата/время....

Тот же самый отбор
Подскажите с модулем. Может кто подскажет, есть другие варианты! Сп=НОвый СписокЗначений; ...

r6010 - Abort() (тот самый Страуструпп)
И так, след код, выдает мне АБОРТ, сразу после того как я введу показатели и нажму Энтер (прога считает площадь прямоугольника(Страуструпп...

15
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.05.2016, 19:48
Цитата Сообщение от O_Q Посмотреть сообщение
но когда появляется дерево моделей,
это вьюшек может быть множество.
а модель должна быть одна.

суть вьюшек: по разному показывать одну и туже модель.
при изменении модели, вьюшки идут лесом,
и приходится пилить новые.
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
18.05.2016, 10:54
O_Q, начинается всё всегда с модели. Модель состоит из данных, методов доступа к ним и методов изменения данных. Controller и View не содержат данных (кроме служебных).
View занимается только отображением интерфейса: он отображает данные, обращаясь к Model и показывает пользователю элементы управления (кнопочки, поля редактирования, меню и др.).
Controller - необязательный компонент. Он управляет реакцией на события. События бывают двух типов - зависящие от действий пользователя (тогда View вызывает методы Controller-а) и независимые (например, таймеры могут быть встроены в Controller).
0
-7 / 2 / 1
Регистрация: 10.04.2016
Сообщений: 53
22.05.2016, 18:16  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
это вьюшек может быть множество.
а модель должна быть одна.
Как же она может быть одна? Возьмём стандартный пример: у нас есть класс "книга" и "покупатель", 2 класса - 2 модели. Если мы возьмём динамический интерфейс, тогда у нас появляются виджеты с отображением моделек, каждый из которых работает с отдельным объектом.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
22.05.2016, 18:41
O_Q
Одна модель -- один MVC. Если две модели, то два MVC. Книга и покупатель -- это какие-то бизнес-объекты, которые, скорее являются частью программной модели какого-то бизнес-процесса.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.05.2016, 21:11
Цитата Сообщение от O_Q Посмотреть сообщение
Как же она может быть одна? Возьмём стандартный пример: у нас есть класс "книга" и "покупатель", 2 класса - 2 модели.
это два класса какой то одной модели.

модель определяется совокупностью классов,
которые определяют её бизнес-логику.
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
22.05.2016, 23:20
"Модель" употребляется в разных значениях. Модель, которая "М" в MVC - это доменная модель, то есть, совокупность классов, которые определяют бизнес-логику.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,357
23.05.2016, 08:51
Цитата Сообщение от Shamil1 Посмотреть сообщение
Модель, которая "М" в MVC - это доменная модель
Разве? Она может быть доменной моделью (если повезёт), но, как правило, является частью триады MVC, т.е. частью уровня представления.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
23.05.2016, 09:29
Цитата Сообщение от Usaga Посмотреть сообщение
частью уровня представления
MVC как раз и придумано, чтобы модель бизнес-процесса отделить от представления. М -- не является "частью уровня представления". V -- есть уровень представления, а M -- уровень процесса, который спрятан, инкапсулирован, от клиента (будь это пользователь или другая программа) посредством макета процесса, выраженного потоками ввода C и вывода V.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,357
23.05.2016, 11:28
mporro, к уровню представления я отношу всю триаду MVC (представление != уровень представления), точнее все такие наборы (окна/страницы). View (представление) - это уже часть этого уровня. Модель триады MVC (или MVP) так же является частью уровня представления, так как отражает фунцкиональность данного окошка/страницы. Если для этой цели можно использовать модель предметной области без переделок, то зашибись - не нужно будет делать 100500 моделей .

Но у окошка может быть функционал не являющий частью бизнес-процесса, но являющий исключительно частью UI (выбранный элемент списка, имя файла выбранного документа, логин/пароль на странице авторизации). Вот это и должно храниться в модели MVC. Вообще, как мне кажется, иметь на каждом уровне свой набор моделей - нормальное явление.

Вот и получается, что у бизнес-процессов свой набор моделей, у уровня представления свой (причём модели MVC могут содержать модели бизнес-уровня). Очень хорошо, если можно переиспользовать модели между уровнями, но так далеко не всегда может быть.

Добавлено через 6 минут
mporro, тут ещё надо не забывать, что чёткого описания MVC нету, каждый автор трактует всё по своему. Я вот, придерживаюсь варианта предложенного Дино Эспозито, мне его видение архитектуры ПО кажется разумным. Так, что это вопрос дискуссионного характера .
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
23.05.2016, 13:01

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
к уровню представления я отношу всю триаду MVC
И тем самым просто уничтожаете саму идею MVC. Чтобы MVC идея работала, видеть слои M V C необходимо отдельно. Если Вы не видите этих слоёв и вам кажется, что есть какая-то особая M, которая связана особыми отношениями с "представлением", значит где-то дырка в вашем MVC. Уничтожение идеи -- это не трактовка, а именно уничтожение.



Добавлено через 23 минуты

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
арианта предложенного Дино Эспозито
Я, к сожалению, с этим трудом не знаком. Но почти уверен, что Вы что-то не так поняли. Это случается, часто. Скорее всего, речь шла о том, что само представление может иметь свою логику, выраженную каким-то, скажем, конечным автоматом, который и является модель интерфейса. В таком случае автомат является частью буквы V, а M как была доменная модель так и осталась.

0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,357
23.05.2016, 16:07
mporro, значит я и правда мог что-то не так понять.

На данный момент я практикую такой подход: модель из MVC (MVP) - агрегат содержащий как модели предметной области так и примитивы необходимые представлению. Т.е. модель содержит только то, что нужно представлению и, возможно, в более удобном для него виде (а это уже может не быть доменная модель). Контроллер\презентер, реагируя на запрос от представления, обращается к моделям предметной области и, если нужно, к службам предметной области, а так же обновляет другие данные в модели MVC. После этого представление обновляется.

Это не верная трактовка?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
23.05.2016, 16:30
Цитата Сообщение от Usaga Посмотреть сообщение
Это не верная трактовка?
Я не супер-эксперт в MVC, но оригинальная идея подразумевает барьеры между элементами "тройки". Если Вы эти барьеры видите и можете вынимать то, что называете контроллером, и заменять его, то у Вас всё в порядке. Если же Вы при замене представления из GUI в XML вынуждены поковыряться в модели -- это яркая красная лампа, что MVC построено плохо.

P.S. Ещё сегодня развелось очень много дочерних подходов, которые борются с проблемой "виджетов", так как оригинальная идея становится через-чур многословной. Так как книга, которую Вы привели, что-то там про MS и .NET, то, возможно, там вообще не про MVC, а какой-то специальный подход для работы с системой "виджетов", которые гораздо сложнее, чем оригинальный Tool.
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
23.05.2016, 17:50
Я считаю:

MVC - это не набор троек M-V-C.
У меня одна Модель и несколько Контроллеров. На каждый из Контроллеров может быть несколько Представлений.

Цитата Сообщение от Usaga Посмотреть сообщение
модель содержит только то, что нужно представлению и, возможно, в более удобном для него виде
Рассмотрим веб-приложение.
Для работы с одним Представлением Контроллер использует разные виды классов:
1. "формы" - классы для получения данных от Представления
2. "модель представления" - классы для передачи данных представлению
3. "службы" - классы для изменения Модели (Предметной Модели) и получения данных из Модели (бизнес-логика)

Но я не считаю, что "формы" или "модели представления" играют роль модели в MVC.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,357
23.05.2016, 18:02
Цитата Сообщение от mporro Посмотреть сообщение
Если Вы эти барьеры видите и можете вынимать то, что называете контроллером, и заменять его, то у Вас всё в порядке.
Да, именно из-за этого я и использую этот паттерн (а иначе нафига оно надо? ). Просто у меня возникли сомнения, что я не правильно роль модели себе представляю. Возможно, что это действительно так. Но разделение (и тестопригодность) кода это не влияет, а значит всё путём.

Книжка действительно не про MVC, но про модели как таковые. Я оттуда много чего подчерпнул. Хотя специалисты там вряд ли что-то новое найдут.

Добавлено через 5 минут
Цитата Сообщение от Shamil1 Посмотреть сообщение
Но я не считаю, что "формы" или "модели представления" играют роль модели в MVC.
Ну я тоже так не считаю. В данном случае это просто DTO. Тоже самое можно было бы сделать и в "настольном" MVC, упаковывая данные для передачи контроллеру.
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
23.05.2016, 22:11
Цитата Сообщение от Usaga Посмотреть сообщение
В данном случае это просто DTO.
Я бы не стал называть это DTO.
Класс формы содержит поля, которые есть на форме (включая скрытые). И эти поля могут содержать служебную информацию или информацию, необходимую лишь для валидации.
Класс модели представления содержит информацию, необходимую представлению. И эта информация может быть собрана из разных источников.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2016, 22:11
Помогаю со студенческими работами здесь

Реализация MVC паттерна в несложном desktop приложение на Java
Добрый вечер! Я новичок в Java и решил написать своё первое приложение, в котором будет использоваться MVC паттерн. Идея простая: есть...

Не срабатывают события, если использовать тот же самый элемент в шаблоне
В silverlight не срабатывают события, если использовать тот же самый элемент в шаблоне. Например в шаблоне Button тоже используется...

кто зделает тот самый крутой на етом сайте(на языке с++)
Matrix3. Дана матрица размера 5 x 10. В каждой строке1|столбце2 найти количество элементов, больших3|меньших4 среднего арифметического всех...

Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый?
К примеру : int main() { int x=3, y=4; swap(&x,&y); return 0; } void swap(int* a, int* b){ int tmp = *a; *a...

Самый самый тихий кулер для процессора
Пока что нашел 8дБ. Есть еще тише?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru