提问人:Andrew G. Johnson 提问时间:12/1/2008 最后编辑:macAndrew G. Johnson 更新时间:1/3/2012 访问量:484
可以对模型进行任何处理吗?[MVC格式]
Can any processing be done on the model? [MVC]
问:
我决定为我制作的所有新网站大力推动 MVC。我有一个关于是否可以在模型级别进行任何处理的问题。
提出这个问题的案例是一个视频网站。我有一个 Video 类(模型),当用户观看视频时,我需要做的一件事就是需要将视图记录在数据库中。我不确定是否需要在控制器中添加查询,或者是否可以在 Video 类中添加 addView 方法。
对我来说,基本的基本问题是,在模型中,我只能使用哪种方法?它可以是任何东西,还是只能是访问器(又名 getValue/setValue)方法?
答:
我认为您的模型正是处理此问题的地方。现在,模型必须仅由实体类组成。在我看来,你的模型将包括你的实体以及你需要实现的任何业务逻辑。控制器应该只处理视图的 I/O,调用模型方法来完成用户通过用户界面(视图)调用的操作。
由于您可以在 MVC 中使用所需的任何模型代码(不仅限于 LINQ),因此简短的回答是肯定的。在模型中应该做什么也许是一个更好的问题。根据我的口味,我会添加一个 ViewCount 属性(它可能映射到 Video 表中的列,除非您跟踪每个用户,在这种情况下,它将位于 UserVideo 表中)。然后,您可以从控制器中递增此属性的值。
评论
Ruby on Rails 的座右铭是瘦控制器,胖模型。这不仅适用于 Rails,还应该使用任何 mvc 框架进行实践。
请记住,MVC 有很多变化,没有真正的“正确方法”来做事。归根结底,你如何设计你的课程归结为个人喜好。但是,既然您征求了设计建议,以下是我的两分钱:
业务逻辑属于控制器。将其排除在模型和视图之外。
在 MVC 模式的众多变体中,被动视图样式似乎是最容易测试的。在被动视图中,您的类设计如下:
您的控制器是“智能的”:它对数据库进行更改,更新模型,并将视图与模型同步。除了对模型和视图的引用外,控制器还应保存尽可能少的状态信息。
该模型是“愚蠢的”,这意味着它只保存视图的状态,而没有其他业务逻辑。模型不应包含对视图或控制器的引用。
该视图是“愚蠢的”,这意味着它仅将信息从模型复制到 UI,并调用由控制器处理的事件处理程序。该视图不应包含其他业务逻辑。视图不应包含对控制器或模型的引用。
如果你是一个纯粹的 MVC 主义者,那么模型更新自身或数据库是没有意义的,因为这些职责属于控制器,因此为 Video 类创建 addView 方法是不合适的。
评论
在这里,我将如何做到这一点。它应该在几乎任何语言中都有效。
View 将启动对控制器的 OnView() 方法的方法调用,然后显示控制器吐回的任何内容(当然,以受控的方式......我认为您的视图将包含一个视频播放器组件,因此您将从控制器中获取某种视频)
在控制器中,有一个 OnView() 方法,它执行 3 项操作:实例化 Video 对象(即使用数据层获取模型对象)、对 Video 对象调用 updateViewCount() 方法,以及显示视频(大概通过将 Video 对象返回给 View)。
Video 模型对象包含表示视频和所需的任何内容的数据,其中包括 updateViewCount()。这样做的理由是视频具有观看次数(聚合)。如果“视图计数”需要是一个复杂的对象,而不仅仅是一个整数,那就这样吧。根据视频对象在磁盘(数据库?)上的原始表示形式创建视频对象的数据层还将负责加载和创建相应的观看次数对象,作为创建视频的一部分。
所以,这是我的 0.02 美元。您可以看到,我已经创建了第四个东西(前三个是模型、视图和控制器),即数据层。我不喜欢模型对象加载和保存自己,因为那样它们就必须知道你的数据库。我不喜欢控制器直接进行加载和保存,因为这会导致控制器之间的代码重复。因此,一个单独的数据层,只能由控制器直接访问。
最后,以下是我查看视图的方式:用户所做的一切,以及用户看到的所有内容,都应该通过视图。如果屏幕上有一个按钮显示“播放”,则它不应该直接调用控制器方法(在许多语言中,这样做没有危险,但有些语言(例如PHP)可能允许这样做)。现在,视图的“play”方法将转过身来,在控制器上调用相应的方法(在示例中是 OnView),并且不执行任何其他操作,但该层在概念上很重要,即使它在功能上无关紧要。同样,在大多数情况下,我希望您的视图播放视频流,因此控制器返回给视图的数据将是视图所需格式的流,这不一定是您的确切 Model 对象(即使您可以直接使用 Video 对象,添加额外的解耦层也可能是可取的)。这意味着我实际上可能会让我的 OnView 方法采用一个参数来指示我想要返回的视频格式,或者可能在控制器上为每种格式创建单独的视图方法,等等。
啰嗦对你来说够了吗?:D我预计 Ruby 开发人员会有一些火焰,他们似乎对 MVC 的想法略有不同(尽管并非不兼容)。
With MVC, people seem to be struggling with fitting four layers into three.
The MVC paradigm does not properly address the data storage. And that's the "fourth layer". The Model has the the processing; but since it also addresses the data, programmers put SQL in there, too. Wrong. Make a data abstraction layer which is the only place that should talk to back-end storage. MVC should be DMVC.
评论