【发布时间】:2012-11-20 05:50:59
【问题描述】:
我已经阅读了很多关于 MVC 的出版物,但我仍然不能清楚地理解为什么我们需要“控制器”。
我通常在 client-server 模型中编写应用程序:
server 包含所有业务逻辑,它对 gui 一无所知。它完成了主要工作,并且尽可能便携。
client 是一个 GUI,它绑定到服务器,与用户交互,将命令从用户发送到 服务器。
我喜欢这种架构,但我不明白为什么人们真的需要在 client 和 server 之间增加一个媒介,它似乎是 controller ?
UPD: 简单示例:假设我们需要编写一些数据记录器。数据来自 COM 端口,通过某种协议进行编码。需要在一个简单的日志窗口中显示收到的消息。
我该怎么做:
服务器包含以下项目:
-
Data_receiver:实际上是从 COM 端口接收原始数据,但它是接口,所以我们可以创建另一个类来接收来自任何其他来源的数据; -
Data_decoder:获取原始数据并返回解码后的消息,它也是接口,因此我们可以轻松更改编码协议; -
Data_core:使用Data_receiver和Data_decoder的实例,向客户端发出信号。
客户端包含以下项目:
- Appl核心:创建
Data_receiver(连接到COM端口的那个)、Data_decoder和Data_core(引用Data_receiver和Data_decoder实例)的实例,还创建GUI简单日志窗口(参考Data_core); - GUI 简单日志窗口:绑定到
Data_core,即监听它发出的信号,并显示接收到的数据。
据我了解我所读到的有关 MVC 的内容,GUI 不应该实际接收来自 Data_core 的消息,因为 控制器 应该这样做,然后将数据传递给 GUI。但是如果 GUI 直接从 model 获取这些数据会发生什么坏事呢?
【问题讨论】:
-
我喜欢这个问题,只是因为没有人给出“你做错了”的答案。这意味着整个社区要么不知道这个问题的答案(不太可能),要么 MVC 和 MVVM 被夸大了,以至于像你这样的人认为他们是需要的,而事实上,有时它们会妨碍代码的可读性。
-
此外,像 MVVM 和 MVC 这样的模式是模式。这意味着当您编写 SOLID 代码时,它们出现在您的代码中。换句话说,如果您正在编写 SOLID 代码,但模式没有出现,那么您可能正在编写不需要这些模式的代码。
-
此外,在您的示例中,您的客户端和服务器都有控制器代码。示例:文本字段只是一个文本字段。应用于该文本字段的验证逻辑是 controller 代码。如果您发现自己没有重复该验证逻辑,那么您可能正在以 DRY 方式编写代码,这不需要真正的“控制器”类。另一方面,如果您有两个视图都对它们的文本字段执行相同的操作(将它们转换为整数,确保它们在 1-100 之间),您可能需要考虑子类化文本字段并添加控制器逻辑。
-
注意:我把这些写成 cmets 是因为我敢肯定有很多人会反对这种想法。因此,您应该对我所说的持保留态度,并考虑到许多开发人员认为真正的 MVVM 实现是未来的发展方向。
-
MVC 与你的产品是否是客户端-服务器无关。
标签: model-view-controller client-server application-design