gpt4 book ai didi

c++ - Controller 和 View 之间的耦合

转载 作者:搜寻专家 更新时间:2023-10-31 01:59:52 24 4
gpt4 key购买 nike

对我来说,良好的 MVC 实现的试金石是更换 View 的难易程度。由于懒惰,我一直做得非常糟糕,但现在我想做对了。这是用 C++ 编写的,但如果我相信炒作的话,它应该同样适用于非桌面应用程序。

这是一个示例:应用程序 Controller 必须在后台检查某个 URL 是否存在。它可能会连接到“URL 可用”事件(使用提升信号),如下所示:

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
}

在我看来,这似乎是 View 和 Controller 的粗略耦合。这样的耦合使得在使用 web 时无法实现 View (除了协程。)

另一种可能性:

void
Controller::urlAvailable(Url url)
{
urlAvailableSignal(url); // Now, any view interested can do what it wants
}

我偏向于后者,但看起来如果我这样做将会:

  1. 400 亿个这样的信号。对于非平凡的应用程序,应用程序 Controller 可能会变得庞大
  2. 给定 View 意外忽略某些信号的可能性非常大(API 可以在链接时通知您,但信号/槽是运行时的)

那么您有什么建议来消除耦合并降低复杂性?提前致谢。

最佳答案

The litmus test for me for a good MVC implementation is how easy it is to swap out the view.

我可能会因为这样说而招惹火,但我不同意这种说法。这在纸面上看起来不错,但现实世界的例子表明,一个好的 UI 具有响应性和交互性,这通常需要将 View 和 Controller 交织在一起。尝试编写一个完全通用的 Controller 来处理不可预见的理论 View 会给 Controller 和 View 增加大量代码和复杂性。根据我的经验,相互关联的 View / Controller 效果更好 - 我将其视为“M(VC)”。

我想说,对于良好的 MVC 实现,试金石是您可以轻松地将另一个 View / Controller 对“添加”到模型中的程度。一个 View / Controller (例如桌面运算符(operator))对模型的更改是否传播到另一个 View / Controller (例如 Web 远程用户)。该模型是否足够通用以支持不同的 View / Controller 范例(例如桌面 GUI、命令行、计划/批处理输入、基于 Web 的 UI、Web 服务等)?

这并不是说 Controller 代码不能共享(例如,从公共(public)基础派生),但您必须在 Controller 应处理的内容(模型的外部操作)之间找到正确的界线什么应该被视为模型行为的一部分(模型的内部转换)。查看代码同上。

我想阅读 "What goes into the “Controller” in “MVC” 下的一些答案也会对此有所帮助。

关于c++ - Controller 和 View 之间的耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2589357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com