Форум программистов, компьютерный форум CyberForum.ru

MVC дайте пример - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
27.04.2014, 01:21     MVC дайте пример #1
Столько прочитал книг и статей про этот шаблон,прочитал так же про другие шаблоны GoF...все понимаю,а применить не могу:confused:

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

Люди,помогите,дайте пример пожалуйста с использованием того,что я описал выше...очень прошу...я в ступоре:confused:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
27.04.2014, 01:25     MVC дайте пример #2
Bretbas, если ты знаком с Qt, то будет проще посмотреть здесь. В библиотеке полно реальных примеров.
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
27.04.2014, 23:28  [ТС]     MVC дайте пример #3
Qt не изучал никогда,а есть ли смысл?Мне кажется,что нужно вначале без всяких библиотек понять конструкцию MVC,а потом уже смотреть,то что действительно подходит)

Короче вот тут набросал свою программку с использованием MVC и других паттернов, таких как Наблюдатель и Комманда. Ничего толком она не делает еще, только создал 3 абстрактных класса - Model,Controller,View.
Model состоит у меня из таких свойств как двумерный массив(сама матрица),ширина и высота(матрицы). Так же имеются методы get,set...
Controller наследуется от класса Command, чтобы реализователь паттерн проектирования Команда.
View является наблюдателем за изменением Model, по этому в этом случае я применил паттерн Наблюдатель, который реализуется в классах Observer и Observable.

Итак, Я начинаю создавать подклассы данной триады, и получаю в итоге еще 2 класса ViewDefault и ControllerDefault - Вид и Контроллер по умолчанию, то есть при первом запуски моего приложения, должны создаваться экземпляры именно этих классов.
В методе execute() переопределенного классом ControllerDefault запрашивается у пользователя Ширина и Высота матрицы и изменяется соответственно Model(Проверку на правильность введенных данных не проверяю, для простоты примера).
Соотвенно заполняется так же массив(матрица) заданной шириной и высотой нулями так же в методе execute(). После всех изменений в Модели Я вызываю метод notify(), для оповещения всех наблюдателей за Моделью.
После вызова этого метода, вызывается метод update() класса ViewDefault и рисуется на экране в середине двумерный массив(матрица).

Вроде все. Пример прикрепил.

Теперь вопросы...

Как мне сделать несколько контроллеров и запустить всю систему? К примеру теперь я хочу добавить курсор, который будет устанавливаться в середине массива(матрицы) и клавишами-стрелками я буду двигаться по ней, не заходя за ее пределы. Указатель курсора будет виден на экране, и с каждой нажатой кнопкой, указатель сдвигается по матрице.
Как мне сделать это? И на счет Модели...все правильно? Я ее оставляю постоянной, потомков не наследую, потому что не знаю зачем...помогите, может что не правильно?
И самое главное, как запустить всю систему MVC с несколькими контроллерами,моделями и видами в главной функции main()? Какие экземпляры создавать? Какая точка входа в программу?
Вложения
Тип файла: 7z CreateMaps_new.7z (453.6 Кб, 32 просмотров)
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
28.04.2014, 00:59     MVC дайте пример #4
Цитата Сообщение от Bretbas Посмотреть сообщение
Qt не изучал никогда,а есть ли смысл?Мне кажется,что нужно вначале без всяких библиотек понять конструкцию MVC,а потом уже смотреть,то что действительно подходит)
Поэтому я и сказал "если". Но вообще, я убежден, что реализовывать паттерны ради паттернов - ошибка. Я не зря предложил к изучению реальный проект, с реальными задачами, которые решаются с помощью MV(C). Потому что всегда на основе реальных примеров проще оценить что здесь действительно уместно, а что нет. И зачем применен тот или иной паттерн. А когда у нас есть синтетический пример, то естественно будет очень сложно понять что там и зачем, ведь реальной проблемы за ним не стоит, кроме проблемы "реализовать на паттернах".

Твой пример посмотрю попозже, спать уже хочется
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
28.04.2014, 23:26  [ТС]     MVC дайте пример #5
Не очень хочется изучать Qt, чтобы просто понять концепцую MVC и применимость других паттернов. Я повторюсь, понимаю теорию полностью, без труда, но когда доходит до дела вхожу в ступор(

Посмотри пример мой, очень жду комментариев по поводу него и помощи
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
28.04.2014, 23:57     MVC дайте пример #6
Посмотрел, в целом все довольно неплохо.

Цитата Сообщение от Bretbas Посмотреть сообщение
К примеру теперь я хочу добавить курсор, который будет устанавливаться в середине массива(матрицы) и клавишами-стрелками я буду двигаться по ней, не заходя за ее пределы.
Очевидно, что курсор, это функция представления. Перемещение курсора будет выполнятся контроллером, а отображение - представлением. Кстати для курсора есть целый паттерн, который так и называется "курсор", или "итератор".
Цитата Сообщение от Bretbas Посмотреть сообщение
И на счет Модели...все правильно?
В рамках данной задачи, вроде бы, ничего больше от него не нужно.
Цитата Сообщение от Bretbas Посмотреть сообщение
И самое главное, как запустить всю систему MVC с несколькими контроллерами,моделями и видами в главной функции main()?
Ну обычно делают модель, контроллер и несколько представлений. А зачем в данной задаче несколько контроллеров?

Добавлено через 4 минуты
Цитата Сообщение от Bretbas Посмотреть сообщение
Не очень хочется изучать Qt, чтобы просто понять концепцую MVC
Ну я же не предлагал его изучать, я же сказал, если ты знаком с ним, то будет проще на примерах разобрать.
В общем забудем про Qt, посыл моего поста в том, что изучать что-то проще на реальных проблемах, чем на искусственных.
Например 4 года назад у меня была задача сделать простенькую CASE-систему для проприетарного формата описания данных. Вот там была модель, которая собственно хранила в себе нужные данные. И было три представления, которые эту модель визуализировали: первое - это собственно визуальная интерактивная схема (наподобие как в DIA или VISIO, но с уклоном в задачу), вторая - это текстовое представление, которое понимает парсер формата, третье - табличная сводка, в которой подсвечивались возможные неоптимальные (как правило дублирующие) ветки схемы. И с реальной задачей проще понять что необходимо применить, потому что задача диктует потребности, а не потребности определяют задачу, как это бывает в школьных примерах.
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
29.04.2014, 23:39  [ТС]     MVC дайте пример #7
Не слышал чтобы делали одну модель,один контроллер и несколько представлений. Слышал, что на каждую подзадачу свой набор триады MVC. К примеру при запуске программы у меня сразу же выполняется триада Model,ControllerDefault,ViewDefault, то есть подзадача по умолчанию.

Вот к примеру я теперь хочу создать курсор, которым я могу двигаться по матрице...ведь это уже будет новая триада MVC правильно? Я сделал примерчик, точнее добавил к старому новые классы,которые занимаются курсором - ControllerCursor,ViewCursor, но Model мне пришлось оставить такой же, более того я добавил в нее новые свойства - x_pos,y_pos - координаты курсора в окне и x_matrix,y_matrix - координаты курсора в матрице.
Очень хотелось бы создать несколько моделей, чтобы отделить одну часть от другой, то есть отделить модель занимающейся матрицей, и модель занимающейся курсором, но у меня не получается, так как мне всегда нужно пробегать по матрице координатами(более того, в моей примере я это не сделал, но нужно в дальнейшем проверять границы курсора, чтобы мы не выпрыгнули за пределы матрицы, а значит мне точно нужно как-то сделать взаимодействие этих двух моделей.
Я сделал по легкому, просто объединил все в одну модель - и матрицу с ее шириной и высотой, и координаты курсора.

Теперь рассмотрим функцию main()...я не понимаю,честно, правильно ли я сделал или нет? В начале я создаю указатели на модель,контроллер и вид:
C++
1
2
3
4
5
...
Model* model;
View* view;
Controller* controller;
...
Потом инициализирую эти указатели с видом и контроллером по умолчанию(при запуске) и запускаю execute(), чтобы выполнить первые действия:
C++
1
2
3
4
5
...
view = new ViewDefault(model);
controller = new ControllerDefault(view,model);
controller -> execute();
...
Затем, я инициализирую эти же указатели с другим видом и контроллером - курсора:
C++
1
2
3
4
5
...
view = new ViewCursor(model);
controller = new ControllerCursor(view,model);
controller -> execute();
...
И так же вызываю execute(), чтобы считывать нажатие клавиш и двигать курсор в нужную мне сторону.

Вот этот подход правильный или нет, вот в чем у меня вопрос? Я смотрел примеры на php каркаса MVC, там 100% не так, там подключается файл по мере выполнения действий пользователя с пользовательским интерфейсом или что-то вроде того.
В C++ я не могу повторить так, поэтому пришлось сделать вот так, как в функции main(), но есть ли более правильный подход? Ведь если думать наперед, то представим что у нас 10 контроллеров, и 10 видов, что тогда? Весь main забивать инициализацией указателей?


Итак, повторюсь на счет глобальных вопросов:
1. Что делать с разделением Модели на две части, которые по идее не раздельны, но видно что их нужно разделить - модель матрицы и модель курсора
2. Что делать, если как Вы сказали должен быть всего один контроллер,одна модель и несколько представлений, но так не получается(смотрите мой пример)
3. Что делать с входной точкой в программу и дальнейшими действиями?( функция main() )
Вложения
Тип файла: 7z CreateMaps_new.7z (491.2 Кб, 10 просмотров)
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
30.04.2014, 00:47     MVC дайте пример #8
Цитата Сообщение от Bretbas Посмотреть сообщение
Не слышал чтобы делали одну модель,один контроллер и несколько представлений. Слышал, что на каждую подзадачу свой набор триады MVC.
Интересно что на самом деле имелось в виду в твоих источниках (если можно, ссылку). Усложнение на ровном месте - это плохо.

Цитата Сообщение от Bretbas Посмотреть сообщение
Вот к примеру я теперь хочу создать курсор, которым я могу двигаться по матрице...ведь это уже будет новая триада MVC правильно?
Опять же, не думаю, если честно. В чем профит?

Цитата Сообщение от Bretbas Посмотреть сообщение
модель занимающейся курсором
Я продолжаю настаивать, что курсор - это функция представления. Зачем модели вообще знать про какой-то курсор?
Цитата Сообщение от Bretbas Посмотреть сообщение
но у меня не получается, так как мне всегда нужно пробегать по матрице координатами
Если задача упорно сопротивляется выбранному решению, значит решение - неверно. Напротив, верное решение, правильная архитектура сами как бы развивают себя. Следующий шаг следует из предыдущего.

Цитата Сообщение от Bretbas Посмотреть сообщение
Я смотрел примеры на php каркаса MVC, там 100% не так
Там не так, потому что задача решается другая. И архитектура программы на php обычно немного по-другому строится.

Цитата Сообщение от Bretbas Посмотреть сообщение
Ведь если думать наперед, то представим что у нас 10 контроллеров, и 10 видов, что тогда?
Без четко поставленной задачи думать наперед вредно. Серьезно.
Вот ты говоришь, если у нас 10 контроллеров. А я спрашиваю, зачем?
Вот попробуй напиши сам себе ТЗ, представь, что ты не программист, а заказчик, и хочешь определенную программу. Вот и опиши все ее функции максимально формально. А потом по этому описанию схему взаимодействия нарисуй. И будет виднее гораздо сколько там надо чего.

Цитата Сообщение от Bretbas Посмотреть сообщение
Что делать с разделением Модели на две части, которые по идее не раздельны, но видно что их нужно разделить
Не согласен. Не нужно тут ничего делить. У тебя есть сущность - матрица. Сущность одна и модель одна. А экземпляров этой модели может быть много. Например матрица 20х20 и 15х15 это два экземпляра одной и той же модели. А курсор - это функция представления. Под него не надо делать модель.

Цитата Сообщение от Bretbas Посмотреть сообщение
Что делать, если как Вы сказали должен быть всего один контроллер,одна модель и несколько представлений, но так не получается(смотрите мой пример)
Я не советовал делать именно так, я просто привел пример.
Во-вторых я вообще не думаю, что в данной задаче нужно несколько представлений. Но чтобы сказать точно, нужно ТЗ на задачу. Ну или хотя бы что-то похожее на ТЗ

Цитата Сообщение от Bretbas Посмотреть сообщение
Что делать с входной точкой в программу и дальнейшими действиями?( функция main() )
Задачку опиши, что ты в конце концов хочешь получить. Без паттернов. Пока не ясно что тебе не ясно
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
30.04.2014, 01:09  [ТС]     MVC дайте пример #9
Так...) Смотри:
Есть матрица,которая представляется на экране. Я могу клавишами стрелками пробегать по ней следовательно влево,вправо,вверх,вниз. Так же, нажимая на клавиши цифр от 0 до 9, я могу изменять элементы матрицы в том месте,где в данное время установлен курсор(для этого мне и нужно в моделе держать данные о курсоре в матрице x_matrix,y_matrix). После каждого изменения матрицы,она обновляется в виде в новом обличии.

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

Из за того,что курсор устанавливает положение,где я могу изменять матрицу, нужно в модели иметь данные о курсоре...а про функцию представления,которую вы мге говорите,я не понимаю(
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
30.04.2014, 21:22     MVC дайте пример #10
Цитата Сообщение от Bretbas Посмотреть сообщение
Есть матрица,которая представляется на экране. Я могу клавишами стрелками пробегать по ней следовательно влево,вправо,вверх,вниз. Так же, нажимая на клавиши цифр от 0 до 9, я могу изменять элементы матрицы в том месте,где в данное время установлен курсор(для этого мне и нужно в моделе держать данные о курсоре в матрице x_matrix,y_matrix). После каждого изменения матрицы,она обновляется в виде в новом обличии.
В общем вот я набросал на коленке примерчик по твоему описанию.
Прошу не относиться к нему как к эталону. Я просто постарался отразить там свой взгляд на эту задачу. Естественно деталям там внимания уделено мало.
Все мысли, которые я озвучивал выше, вошли в этот пример. Собственно кода там немного - разберешься, если будут вопросы - задавай.
Вложения
Тип файла: 7z matrix_mvc.7z (24.1 Кб, 22 просмотров)
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
30.04.2014, 22:20     MVC дайте пример #11
Слегка поправил.
Вложения
Тип файла: 7z matrix_mvc.7z (25.9 Кб, 42 просмотров)
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
01.05.2014, 00:05  [ТС]     MVC дайте пример #12
спасибо,завтра посмотрю)
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
02.05.2014, 23:57  [ТС]     MVC дайте пример #13
Посмотрел твой пример, вроде все понятно У тебя контроллер делает всю работу - отображает матрицу, и вызывает event(..) для ловли клавиш. Тоже подход) На самом деле эту задачу можно крутить под разными углами, и результат можно получить одинаковый, вопрос только в том, на сколько она будет легка для изменения чего-либо в ней.
Честно, я эту задачу уже разбирал на здесь, выложил свой проект, и услышал много комментариев по поводу разделения сущностей - логики от вида. Вот тогда я впервые с этим встретился
Вот, если хочешь взгляни на старый мой проект, прикрепляю его к посту с названием OldCreateMap. Оценишь хи-хи :-D

Так, ну собственно я переделал, немного, то что выкладывал выше, я решил задачу сделать тупо без контроллера, ибо он мне мешает. Грубо говоря только Модель, и только Представление.

Смотри, у меня есть 6 классов, два из них которые абстрактные:
View - Абстрактный класс, является наблюдателем за Model, и так же использует шаблон Command для того, чтобы внести чисто виртуальную функцию execute()
Model - Абстрактный класс, является субъектом, за которым следят наблюдатели, а именно View.
ModelMatrix - Конкретный подкласс класса Model, содержит данные о матрице и ее ширине и высоте. Так же предоставляет команды set/get.
ModelCursor - Конкретный подкласс класса Model, содержит данные о курсоре, координатами на экране и в матрице. Имеет прямую ссылку на саму матрицу. Так же предоставляет команды set/get.
ViewMatrix - Конкретный подкласс класса View, переопределяет функцию execute(), в которой запрашивает у пользователя ширину и высоту, затем инициализирует матрицу с введенной шириной и высотой нулями, и подписывается на обновления модели(именно ModelMatrix), что в свою очередь сразу же отображает матрицу на экране, затем прям в этой функции создается экземпляр подкласса ViewCursor и вызывается так же переопределенная функция execute(), о которой прямо сейчас напишу ниже
ViewCursor - Конкретный подкласс класса View, переопределяет функцию execute(), в которой отслеживает нажатия клавиш и делает соответствующии действия по нажатию. Следит за изменениями модели курсора(ModelCursor) и перерисовывает его каждый раз в нужном месте.

Вот более менее объяснил, как я и хотел, я разделил Модель на две сущности - Матрица и Курсор. Причем Курсор всегда имеет ссылку на матрицу, в которой он крутится.

На мой взгляд по логике все правильно не так ли? Прикрепил проектик с названием NewCreateMap.

Еще хотел узнать, как сделать такую систему, что к примеру у меня есть класс ViewError(), и чтобы я его мог использовать где захочу вывести к примеру ошибку какую-нибудь...ну вы полняли, я просто не могу нормально объяснить Такое я видел на php опять же
Вложения
Тип файла: 7z NewCreateMap.7z (531.7 Кб, 21 просмотров)
Тип файла: 7z OldCreateMap.7z (338.6 Кб, 8 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2014, 00:57     MVC дайте пример
Еще ссылки по теме:

Не компилируется пример пример! C++
Дайте совет C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
03.05.2014, 00:57     MVC дайте пример #14
Цитата Сообщение от Bretbas Посмотреть сообщение
На мой взгляд по логике все правильно не так ли?
Да, вполне. Я тоже сперва хотел сделать индекс (курсор) модели отдельным классом, но потом подумал, что это будет загромождать пример и оставил обычные целочисленные индексы. Правда то, что он сам является моделью - момент спорный. Лично я бы не стал так делать, но вряд ли можно назвать твое решение плохим из-за этого, ведь я не претендую на абсолютную правильность. Кстати в Qt тоже сделан индекс модели, там он называется QModelIndex.
Цитата Сообщение от Bretbas Посмотреть сообщение
Еще хотел узнать, как сделать такую систему, что к примеру у меня есть класс ViewError()
В С++ для этого есть exceptions
Yandex
Объявления
03.05.2014, 00:57     MVC дайте пример
Ответ Создать тему
Опции темы

Текущее время: 11:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru