Должны ли все кнопки содержать ссылку на контроллер в коде MVC (C ++)? - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь найти лучший (самый чистый) способ структурирования некоторого кода на C ++ для приложения, которое я создаю. Я думаю, что MVC имеет смысл как путь, но после значительного количества исследований я не совсем уверен, что делаю все правильно.

Вот пример, иллюстрирующий мой вопрос:

Модель

У меня есть класс, который содержит данные чертежа под названием Canvas. Примером функции, используемой для очистки текущего содержимого холста, является ClearCanvas().

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

Контроллер

У меня есть класс контроллера для canvas: CanvasController

Контроллер создает и удерживает ссылку на объект canvas: CurrentCanvas

Контроллер также создает представление: CanvasView и затем устанавливает ссылку на себя в представлении: CurrentCanvasView->SetControllerRef(this);

View

Представление состоит из серии вложенных классов, которые определяют пользовательский интерфейс. Например, иерархия, ведущая к рассматриваемой кнопке, может выглядеть примерно так:

CanvasView
-VerticalBox
--HorizontalBox
---Button

Во время конструктора представления ссылка на контроллер передается из представления всем интерактивным элементам, например. NewButton->SetControllerRef(this->GetControllerRef());

Кнопка нажата

Так что теперь, когда кнопка нажата, она может функционировать так:

void ClearCanvasButton::OnButtonPressed()
{
    Controller->CurrentCanvas->ClearCanvas();
}

Итак, мой общий вопрос: (1) кажется ли это правильным способом ведения дел или плохо структурированным?

Также (2) : Должен ли контроллер инкапсулировать функции холста, например:

void CanvasController::ClearCanvas()
{
    CurrentCanvas->ClearCanvas();
}

Так что функция на кнопке может быть просто:

void ClearCanvasButton::OnButtonPressed()
{
    Controller->ClearCanvas();
}

Я просто не уверен, правильно ли по сути передавать ссылку на контроллер всем элементам представления, которые в конечном итоге хотят изменить модель, или есть более чистый способ.

Извиняюсь, если вопрос задавался тысячу раз тысячами разных способов, я искал вокруг, пытаясь понять это.

1 Ответ

2 голосов
/ 09 мая 2019

Вам не нужен класс ClearCanvasButton, если ваш Button класс содержит такой член, как

std::function<void()> onButtonPressed;

или похоже , а не

virtual void onButtonPressed() {};

Затем вы передаете лямбду, которая ссылается на контроллер

CanvasView::CanvasView()
{
    // make the widgets
    Button.onButtonPressed = [Controller](){ Controller->ClearCanvas(); };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...