Лакмусовый тест для меня для хорошей реализации MVC - насколько легко поменять местами вид. Я всегда делал это очень плохо из-за лени, но теперь я хочу сделать это правильно. Это на C ++, но оно должно применяться в равной степени к приложениям, не относящимся к рабочему столу, если верить обману.
Вот один пример: контроллер приложения должен проверить какой-либо URL на наличие в фоновом режиме. Он может подключиться к событию «URL available» (с использованием Boost Signals) следующим образом:
BackgroundUrlCheckerThread(Controller & controller)
{
// ...
signalUrlAvailable.connect(
boost::bind(&Controller::urlAvailable,&controller,_1))
}
Так как же Controller::urlAvailable
выглядит?
Вот одна из возможностей:
void
Controller::urlAvailable(Url url)
{
if(!view->askUser("URL available, wanna download it?"))
return;
else
// Download the url in a new thread, repeat
}
Мне это кажется грубым соединением вида и контроллера. Такое соединение делает невозможным реализацию вида при использовании полотна (кроме сопрограмм.)
Другая возможность:
void
Controller::urlAvailable(Url url)
{
urlAvailableSignal(url); // Now, any view interested can do what it wants
}
Я неравнодушен к последнему, но кажется, что если я сделаю это, то будет:
- 40 миллиардов таких сигналов. Контроллер приложения может стать огромным для нетривиального приложения
- Очень реальная возможность того, что данное представление случайно игнорирует некоторые сигналы (API могут информировать вас во время соединения, но сигналы / слоты находятся во время выполнения)
Так что вы предлагаете удалить сцепление, а также уменьшить сложность? Заранее спасибо.