|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
MVC дайте пример27.04.2014, 01:21. Показов 13263. Ответов 13
Метки нет (Все метки)
Столько прочитал книг и статей про этот шаблон,прочитал так же про другие шаблоны GoF...все понимаю,а применить не могу:confused:
Все примеры про MVC написаны с одной моделью,с одним контроллером и с одним представлением...а вот как сделать несколько контроллеров,несколько моделей и несколько представлений не могу понять,так же читал,что на модель и представление нужно применять шаблон Наблюдатель,а на контроллер-Команда...а чтобы была слабая связность между компонентами системы MVC нужно применить шаблон Медиатор....и опять же не могу я все это воплотить в жизнь Люди,помогите,дайте пример пожалуйста с использованием того,что я описал выше...очень прошу...я в ступоре:confused:
0
|
|
| 27.04.2014, 01:21 | |
|
Ответы с готовыми решениями:
13
Дайте простой пример массива Дайте простой пример итерационных циклов Дайте пожалуйста рабочий пример регулярного выражения c++ |
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 27.04.2014, 23:28 [ТС] | |
|
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()? Какие экземпляры создавать? Какая точка входа в программу?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 28.04.2014, 00:59 | ||
|
Твой пример посмотрю попозже, спать уже хочется
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 28.04.2014, 23:26 [ТС] | |
|
Не очень хочется изучать Qt, чтобы просто понять концепцую MVC и применимость других паттернов. Я повторюсь, понимаю теорию полностью, без труда, но когда доходит до дела вхожу в ступор(
Посмотри пример мой, очень жду комментариев по поводу него и помощи
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||
| 28.04.2014, 23:57 | |||||
|
Посмотрел, в целом все довольно неплохо.
Добавлено через 4 минуты В общем забудем про Qt, посыл моего поста в том, что изучать что-то проще на реальных проблемах, чем на искусственных. Например 4 года назад у меня была задача сделать простенькую CASE-систему для проприетарного формата описания данных. Вот там была модель, которая собственно хранила в себе нужные данные. И было три представления, которые эту модель визуализировали: первое - это собственно визуальная интерактивная схема (наподобие как в DIA или VISIO, но с уклоном в задачу), вторая - это текстовое представление, которое понимает парсер формата, третье - табличная сводка, в которой подсвечивались возможные неоптимальные (как правило дублирующие) ветки схемы. И с реальной задачей проще понять что необходимо применить, потому что задача диктует потребности, а не потребности определяют задачу, как это бывает в школьных примерах.
0
|
|||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||
| 29.04.2014, 23:39 [ТС] | ||||||||||||||||
|
Не слышал чтобы делали одну модель,один контроллер и несколько представлений. Слышал, что на каждую подзадачу свой набор триады MVC. К примеру при запуске программы у меня сразу же выполняется триада Model,ControllerDefault,ViewDefault, то есть подзадача по умолчанию.
Вот к примеру я теперь хочу создать курсор, которым я могу двигаться по матрице...ведь это уже будет новая триада MVC правильно? Я сделал примерчик, точнее добавил к старому новые классы,которые занимаются курсором - ControllerCursor,ViewCursor, но Model мне пришлось оставить такой же, более того я добавил в нее новые свойства - x_pos,y_pos - координаты курсора в окне и x_matrix,y_matrix - координаты курсора в матрице. Очень хотелось бы создать несколько моделей, чтобы отделить одну часть от другой, то есть отделить модель занимающейся матрицей, и модель занимающейся курсором, но у меня не получается, так как мне всегда нужно пробегать по матрице координатами(более того, в моей примере я это не сделал, но нужно в дальнейшем проверять границы курсора, чтобы мы не выпрыгнули за пределы матрицы, а значит мне точно нужно как-то сделать взаимодействие этих двух моделей. Я сделал по легкому, просто объединил все в одну модель - и матрицу с ее шириной и высотой, и координаты курсора. Теперь рассмотрим функцию main()...я не понимаю,честно, правильно ли я сделал или нет? В начале я создаю указатели на модель,контроллер и вид:
Вот этот подход правильный или нет, вот в чем у меня вопрос? Я смотрел примеры на php каркаса MVC, там 100% не так, там подключается файл по мере выполнения действий пользователя с пользовательским интерфейсом или что-то вроде того. В C++ я не могу повторить так, поэтому пришлось сделать вот так, как в функции main(), но есть ли более правильный подход? Ведь если думать наперед, то представим что у нас 10 контроллеров, и 10 видов, что тогда? Весь main забивать инициализацией указателей? Итак, повторюсь на счет глобальных вопросов: 1. Что делать с разделением Модели на две части, которые по идее не раздельны, но видно что их нужно разделить - модель матрицы и модель курсора 2. Что делать, если как Вы сказали должен быть всего один контроллер,одна модель и несколько представлений, но так не получается(смотрите мой пример) 3. Что делать с входной точкой в программу и дальнейшими действиями?( функция main() )
0
|
||||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||||||
| 30.04.2014, 00:47 | ||||||||||
|
Вот ты говоришь, если у нас 10 контроллеров. А я спрашиваю, зачем? Вот попробуй напиши сам себе ТЗ, представь, что ты не программист, а заказчик, и хочешь определенную программу. Вот и опиши все ее функции максимально формально. А потом по этому описанию схему взаимодействия нарисуй. И будет виднее гораздо сколько там надо чего. Во-вторых я вообще не думаю, что в данной задаче нужно несколько представлений. Но чтобы сказать точно, нужно ТЗ на задачу. Ну или хотя бы что-то похожее на ТЗ ![]()
0
|
||||||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 30.04.2014, 01:09 [ТС] | |
|
Так...) Смотри:
Есть матрица,которая представляется на экране. Я могу клавишами стрелками пробегать по ней следовательно влево,вправо,вверх,вниз. Так же, нажимая на клавиши цифр от 0 до 9, я могу изменять элементы матрицы в том месте,где в данное время установлен курсор(для этого мне и нужно в моделе держать данные о курсоре в матрице x_matrix,y_matrix). После каждого изменения матрицы,она обновляется в виде в новом обличии. Вот задача на первый план.В дальнейшем она будет развиваться. Из за того,что курсор устанавливает положение,где я могу изменять матрицу, нужно в модели иметь данные о курсоре...а про функцию представления,которую вы мге говорите,я не понимаю(
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 30.04.2014, 21:22 | ||
|
Прошу не относиться к нему как к эталону. Я просто постарался отразить там свой взгляд на эту задачу. Естественно деталям там внимания уделено мало. Все мысли, которые я озвучивал выше, вошли в этот пример. Собственно кода там немного - разберешься, если будут вопросы - задавай.
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 30.04.2014, 22:20 | |
|
Слегка поправил.
2
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 01.05.2014, 00:05 [ТС] | |
|
спасибо,завтра посмотрю)
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 02.05.2014, 23:57 [ТС] | |
|
Посмотрел твой пример, вроде все понятно
У тебя контроллер делает всю работу - отображает матрицу, и вызывает 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 опять же
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 03.05.2014, 00:57 | |||
0
|
|||
| 03.05.2014, 00:57 | |
|
Помогаю со студенческими работами здесь
14
Дайте ссылку или пример на интересующий меня вопрос.
Дайте пример Дайте пример шифрования
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Семь 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.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|