Организация MVC в c++

144
28 апреля 2019, 19:10

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

int main() {
   Model model{data};
   View view{window};
   Controller controller{std::move(model), std::move(view)};
   controller.initiate_event_loop();
}

либо

int main() {
   auto model = std::make_unique<Model>(data);
   auto view = std::make_unique<View>(window);
   Controller controller{std::move(model), std::move(view)};
   controller.initiate_event_loop();
}

Какие + и - у подходов? Может есть вариант лучше?

Answer 1

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

Поскольку мы смотрим на MVC, важно помнить, что это была одна из первых попыток сделать серьезный пользовательский интерфейс для любого масштаба. Графические пользовательские интерфейсы не были точно распространены в 70-х годах. Модель Forms and Controls, которую я только что описал, появилась после MVC - я описал ее первым, потому что она проще, не всегда в хорошем смысле. Снова рассмотрим MVC Smalltalk 80 с использованием примера оценки - но имейте в виду, что я принимаю несколько свобод с фактическими данными Smalltalk 80, чтобы сделать это - для начала это была монохромная система.

В основе MVC и идея, которая была наиболее влиятельной для более поздних фреймворков, является то, что я называю Separated Presentation. Идея Separated Presentation - сделать четкое разделение между объектами домена, которые моделируют наше восприятие реального мира, и объекты представления, которые являются элементами GUI, которые мы видим на экране. Объекты домена должны быть полностью автономными и работать без ссылки на презентацию, они также должны поддерживать несколько презентаций, возможно, одновременно. Этот подход также был важной частью культуры Unix и продолжает сегодня позволять манипулировать многими приложениями как через графический, так и в командной строки.

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

В MVC я предполагаю модель домена обычных объектов, а не представление набора записей, которое у меня было в формах и элементах управления. Это отражает общее предположение, стоящее за дизайном. Формы и элементы управления предполагали, что большинство людей хотят легко манипулировать данными из реляционной базы данных, MVC предполагает, что мы манипулируем регулярными объектами Smalltalk.

Презентационная часть MVC состоит из двух оставшихся элементов: view и controller. Задача контроллера состоит в том, чтобы принять вход пользователя и выяснить, что с ним делать.

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

Рисунок 4: Основные зависимости между моделью, представлением и контроллером. (Я называю это существенным, потому что на самом деле представление и контроллер напрямую связаны друг с другом, но разработчики в основном не используют этот факт.)

Как и в последующих средах, Smalltalk выяснил, что вам нужны общие компоненты пользовательского интерфейса, которые можно использовать повторно. В этом случае компонентом будет пара view-controller. Оба были родовыми классами, поэтому их необходимо было подключить к конкретному поведению приложения. Будет представление оценки, которое будет представлять весь экран и определить макет элементов управления нижнего уровня, в этом смысле аналогично форме в Формах и Контроллерах. Однако, в отличие от формы, MVC не имеет обработчиков событий в контроллере оценки для компонентов нижнего уровня.

Рисунок 5: Классы для версии MVC дисплея монитора мороженого

Конфигурация текстового поля происходит от предоставления ему ссылки на его модель, чтения и указания ей, какой метод вызывать при изменении текста. При инициализации экрана устанавливается «#actual:» (ведущий «#» обозначает символ или интернированную строку в Smalltalk). Затем контроллер текстового поля делает рефлексивный вызов этого метода для чтения для внесения изменений. По сути, это тот же механизм, что и для привязки данных, элемент управления связан с базовым объектом (строкой) и рассказал, какой метод (столбец) он манипулирует.

Рисунок 6: Изменение фактического значения для MVC.

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

Наблюдатели происходят в MVC, действительно, это одна из идей, зачисленных в MVC. В этом случае все виды и контроллеры наблюдают за моделью. Когда модель изменяется, взгляды реагируют. В этом случае фактическое представление текстового поля уведомляется о том, что объект чтения был изменен, и вызывает метод de

READ ALSO
Немного запутался с типами при создании функции которая принимает строку в виде массива

Немного запутался с типами при создании функции которая принимает строку в виде массива

Не могу понять где наапортачилТолько начал изучать С++ и предомной стоит такая задача, найти количество букы "а" в строке которая передаётся...

120
Неясное поведение шаблонов

Неясное поведение шаблонов

Есть следующая шаблонная функция:

123