【问题标题】:MVC - Should be there a master View, Model and Controller or should they be implementation-specific?MVC - 应该有主视图、模型和控制器,还是应该是特定于实现的?
【发布时间】:2019-02-01 12:28:57
【问题描述】:

我对概念感兴趣,而不是实现。考虑CarBookingRequest 场景,用户通过界面请求预订汽车。让我们在以下约束条件下讨论它,并通过保持 ControllerModel 简单的方式仅考虑 View

  • 有一个控制器类/代码包含代表相关动作的所有功能
  • 有一个模型类/代码只处理带有少量表的单个数据库(没有其他数据模型)

可以通过多种接口发出请求:

1.桌面应用程序

用户单击Button 会触发Click 事件,该事件又被预先编程为通过请求NewBooking 调用BookingController。比如:

 Event OnClick() { 
    C = New BookingController
    C.Request('NewBooking')
 }

2。移动应用程序

用户点击Button 触发Touch 事件,该事件又被预先编程为使用请求NewBooking 调用相同的BookingController。比如:

 EventListener OnTouch() { 
    C = New BookingController
    C.Request('NewBooking')
 }

3.自动售货机

用户在触发事件的机器上按下PushButton,该事件被预编程以使用请求NewBooking 调用相同的BookingController。比如:

 Event OnPress() { 
    C = New BookingController
    C.Request('NewBooking')
 }

假设 Web 界面服务界面 的实现类似,其中请求由另一个系统或计划任务发出。显然,所有这些实现都是用不同的语言和平台编写的不同版本的 BookingViews。现在,如果我事先知道这些实现并且我正在制作一个 Booking MVC,那么我的视图、控制器和模型类应该是什么样的?或者有多少?为什么?

我是否应该有一个“主要”BookingView 类,其功能如下:

 Function CallController(Command) { 
    If Command = 'NewBooking' {
       Return New BookingController
    }
    or some good implementation of controller/action registry to fetch appropriate controller
 }

每个特定的View 应该依次调用这个函数,然后将BookingController 调用为:

 Event OnClick { 
    C = MainView.CallConroller('NewBooking')
 }

或者每个View 应该以自己的方式分别调用控制器吗?

可能有太多问题,但我认为我的视图、控制器和模型应该是可重复使用的,并且每个新的 Interface(移动设备、机器或 Web)都应该只需要它们对 View(事件或显示),而连接和获取数据代码保持不变。

【问题讨论】:

    标签: model-view-controller design-patterns


    【解决方案1】:

    MVC 模式的核心思想是将应用程序的三个方面——模型、视图和控制器——分离

    您描述解决方案的方式似乎不符合这一原则。让我建议一种方法来帮助您实现良好的 MVC,遵循这些规则。我正在描述通用规则,然后您可以根据您的应用程序、框架等的具体情况进行修改:

    • 您的控制器不应该知道视图。此规则有助于将“视图”与控制分开。如果您遵循此规则,您的控制器无需担心客户端类型,只需返回一种类型的资源(例如 JSON 资源,在本例中为 Booking)。然后,每个客户端(Web、移动设备、机器)必须以他们想要的任何方式处理此资源的呈现。但重要的是,这不是控制器的关注点。
    • 你的模型不应该知道控制器。 Model 关心的是实现汽车预订。它不知道正在用它做什么(比如控制器是否想要访问它然后将它传递给其他人左右)。例如,它可能有一个接口,如

      订车:

      构造函数();

      书();

      取消预订();

      ...

    它执行构建请求、预订请求或删除预订的业务逻辑。 期间

    您如何实现这一点,模型、视图和控制器的正确分离?嗯,一种方法是从内部开始,然后向外移动。即从模型开始,然后控制器,然后视图。实际上,您可能不会按此顺序进行操作,因为您必须考虑所有这些方面。但是,我说的更多是合乎逻辑的。

    【讨论】:

    • 谢谢。如果 Controller 与 View 是分开的,那么 what 会在给出诸如 CreateBooking 之类的命令时激活(或调用)控制器?控制器不是模型和视图之间的中介吗?
    • 实际上,MVC 模式的核心思想——无论其实现方式——只是将两个应用程序方面相互分离:UI 和业务逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多