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

Консольное меню MVC - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
06.05.2014, 22:43     Консольное меню MVC #1
С моего последнего проектика прошло не так уж много времени, а я вновь здесь и уже с новыми исходниками
Снова паттерны и каркас MVC, и снова я жду от вас комментариев

Итак, мой новый проект является, грубо говоря, библиотекой для создания консольного меню. То есть, Вы, как пользователь, хотите создать к примеру маленькую игрушку в консольном приложении, и вам 100% понадобится Меню для вашего серьезного проекта. Как же быть? Писать с нуля? Нет конечно, на помощь вам приходит папа bretbas!

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

Классы:
Controller - Абстрактный класс контроллера. Имеет виртуальную операцию execute() для реализации паттерна Команда(Command). Так же имеет статическую функцию initialize(...) для инициализации контроллера нужными данными, и статическую функцию run() для управления меню с пользователем.
ItemStart - Конкретный класс контроллера. Реализует операцию execute()
ItemOption - Конкретный класс контроллера. Реализует операцию execute()
ItemExit - Конкретный класс контроллера. Реализует операцию execute()

Model - Абстрактный класс модели. Реализует паттерн Наблюдатель(Observer) и является субъектом за которым следят наблюдатели.
ModelMenu - Конкретный класс модели. Знает о названии пунктов меню, о положении текущего курсора, о координатах показа меню на экране и тд. Использует функции set/get.

View - Абстрактный класс представления. Является наблюдателем в паттерне Наблюдатель(Observer), поэтому использует виртуальную операцию update(), для реализации ее в подклассах. Каждый раз, когда будет изменяться Model, будет вызвана эта операция. Так же инициализирует простейшую графику в консоле.
ViewMenu - Конкретный класс представления. Реализует операцию update(), для отображения меню на экране.


Применение:
К примеру Вы в вашем грандиозном проекте решили создать меню из 3 пунктов, а именно Start,Option,Exit. Как же Вам создать их, используя мою библиотеку?
Да очень просто!
Во-первых, нужно создать три подкласса класса Controller. Давайте назовем их ItemStart,ItemOption,ItemExit.
Во-вторых, нужно написать соответствующие действие по выбронному пункту меню правильно? А значит нужно реализовать переопределенную операцию execute() для каждого подкласса.
В-третьих, в основном коде, нужно инициализировать Модель и Представление:
C++
1
2
3
4
...
    ModelMenu   *model  = new ModelMenu();          // Создаем Модель Меню
    View        *view   = new ViewMenu(model);      // Создаем Представление Меню
...
В-четвертых, инициализируем контроллер моделью и нужными нам координатами для вывода меню на экране:
C++
1
2
3
...
    Controller :: initialize(model,40,12);          // Инициализируем Контроллер данными
...
В-пятых инициализируем каждый пункт с параметрами, которые являются названию пунктов меню:
C++
1
2
3
4
5
6
...
    Controller* item[3];                            // Создаем 3 Пункта Меню
    item[0] = new ItemStart("Start");               // Start
    item[1] = new ItemOption("Option");             // Option
    item[2] = new ItemExit("Exit");                 // Exit
...
Ну и соответственно запустим всю систему
C++
1
2
3
4
...
    Controller :: run();                            // Запуск системы
...
...
Просто? Я думаю да

А теперь я хочу чтобы вы прокоментировали мои исходники, правильно ли я разложил все на 3 полки - MVC? Или что-то нужно добавить/убрать/изменить?

Я не шел к цели, чтобы я работал на MVC. Я шел к цели, чтобы MVC работал на меня, где-то его изменить, где-то что-то убрал, но суть каркаса MVC в моей задаче НА МОЙ ВЗГЛЯД осталась та же.
Но опять же, это на мой взгляд. Так вот мне нужно узнать ваш взгляд на данную задачу Прикрепляю проект
Вложения
Тип файла: 7z PatternsMenu.7z (548.6 Кб, 37 просмотров)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
08.05.2014, 00:03  [ТС]     Консольное меню MVC #2
есть тут кто?)
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
08.05.2014, 13:14     Консольное меню MVC #3
Bretbas, Да, да..

Не мог бы ты выложить сорсы на github.com или bitbucket.org? У меня проблемка с кодировкой.

UPD: а нет, QtCreator потянул cp1251 (просто я с вимом налажал)
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
09.05.2014, 23:24  [ТС]     Консольное меню MVC #4
outoftime, не понял?
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
10.05.2014, 23:37  [ТС]     Консольное меню MVC #5
ну где же ваши комменты?)
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 302
11.05.2014, 02:04     Консольное меню MVC #6
Цитата Сообщение от Bretbas Посмотреть сообщение
ну где же ваши комменты?)
Просто никому не нужна эта библиотека))
Кому надо - тот сделает сам и под себя, так даже интереснее. Да и не трудно это.
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
11.05.2014, 02:29     Консольное меню MVC #7
А можно скрины примера меню?
Влом качать и делать самому
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
11.05.2014, 23:52  [ТС]     Консольное меню MVC #8
только завтра могу скинуть скрины)

на счет библиотеки...я же это так просто сказал)конечно же я ее не буду выпускать ахах)мне просто интересно ваше мнение по поводу кода,рефакторинга и тд
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.05.2014, 00:05     Консольное меню MVC #9
в файле Model.h есть
C++
1
#include "View.h"
так вот его надо убрать и сделать forward declaration
C++
1
class View;
а уже в файле Model.cpp сделать
C++
1
#include "View.h"
____________________________________________________________________________________________
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Model :: remove_observer(View* observer)
{
    std :: vector<View*> :: iterator i;
 
    for (i = observers_.begin( ) ; i != observers_.end( ) ; i++)
    {
        if(*i == observer)
        {
            observers_.erase(i);
            break;
        }
    }
}
1. зачем сравнивать View по значению?
2. после модификации вектора итераторы становятся недействительными
____________________________________________________________________________________________
очень много где в коде параметры передаются по значению вместо ссылки на константу
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
12.05.2014, 00:51  [ТС]     Консольное меню MVC #10
Jupiter, спасибо за ответ,все поправлю)
Но есть вопросы:
1.Зачем делать предварительное объявление и инклуд класть в .cpp файл?Почему именно так?
2.Значит нужно делать такую схему предварительного объявления везде,где подключается файл?К примеру в файле Controller.h подключается файл ModelMenu.h,значит нужно так же сделать forward
declaration и добавить иклуд ModelMenu в Controller.cpp?
3.В методе remove_observer(View* observer) я пытаюсь удалить из вектора элемент observer.Вы имеете ввиду не сравнивать по значению как?А как нужно?
4. Что значит итератор не действительный?И как это исправить?
5. А где именно в программе параметры передаются по значению?Я вроде почти везде использовал ссылки
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.05.2014, 01:26     Консольное меню MVC #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Bretbas Посмотреть сообщение
1.Зачем делать предварительное объявление и инклуд класть в .cpp файл?Почему именно так?
потому что #include это простая подстановка содержимого файла. тому кто инклудит Model.h нужна только модель, а ему вместе с моделью ещё зачем-то впаривают содержимое View.h

Добавлено через 4 минуты
Цитата Сообщение от Bretbas Посмотреть сообщение
2.Значит нужно делать такую схему предварительного объявления везде,где подключается файл?К примеру в файле Controller.h подключается файл ModelMenu.h,значит нужно так же сделать forward
declaration и добавить иклуд ModelMenu в Controller.cpp?
не смотрел, но общие принципы таковы:
- хедер должен как можно меньше инклудить другие хедеры
- если в хедере используется лишь указатель на класс следует использовать forward declaration

Добавлено через 45 секунд
Цитата Сообщение от Bretbas Посмотреть сообщение
3.В методе remove_observer(View* observer) я пытаюсь удалить из вектора элемент observer.Вы имеете ввиду не сравнивать по значению как?А как нужно?
в векторе у тебя указатели на View, так вот и сравнивай указатели

Добавлено через 5 минут
C++
1
2
3
4
5
6
void Model::remove_observer(View* observer)
{
    std::vector<View*>::iterator it = std::find(observers_.begin(), observers_.end(), observer);
    if (it != observers_.end())
        observers_.erase(it);
}
Цитата Сообщение от Bretbas Посмотреть сообщение
5. А где именно в программе параметры передаются по значению?Я вроде почти везде использовал ссылки
да в том же Controller
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
12.05.2014, 01:33  [ТС]     Консольное меню MVC #12
В контроллере из за того,что я сделал поле ModelMenu* model_ статическим?В функции initialize() передаю указатель вроде.Не пойму я.Скорее всего я не понимаю вас по поводу 5 вопроса(
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
22.06.2014, 17:45     Консольное меню MVC #13
Цитата Сообщение от Bretbas Посмотреть сообщение
Скорее всего я не понимаю вас по поводу 5 вопроса(
Наверное он имел в виду передачу std::string по значению, 17 строка, Controller.cpp и подобные ситуации.

А в целом, если оставить в стороне мелкие придирки, код хороший и аккуратный.
gray_fox
What a waste!
 Аватар для gray_fox
1247 / 1130 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
22.06.2014, 18:05     Консольное меню MVC #14
Bretbas, стоило бы очистить проект от временных файлов перед тем, как выкладывать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 22:13     Консольное меню MVC
Еще ссылки по теме:

C++ подскажите - консольное меню не реагирует на нажатие клавиш (case)
Разработать программу, в которой будет организовано меню, выбор функций меню C++
Консольное приложение C++
C++ TextUserInterface меню(Консольное приложение)
C++ Создать консольное меню с более чем 10-ю пунктами

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

Или воспользуйтесь поиском по форуму:
Bretbas
156 / 31 / 4
Регистрация: 05.08.2013
Сообщений: 603
Завершенные тесты: 1
22.06.2014, 22:13  [ТС]     Консольное меню MVC #15
DrOffset, спасибо
Yandex
Объявления
22.06.2014, 22:13     Консольное меню MVC
Ответ Создать тему
Опции темы

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