Model view controller MVC中模型的用途是什么?它真的有用吗?

Model view controller MVC中模型的用途是什么?它真的有用吗?,model-view-controller,architecture,paradigms,Model View Controller,Architecture,Paradigms,我是新来的,所以请容忍我。我最近在几个项目中使用了一个MVC框架,过了一段时间,我对MVC中“模型”的实用性不再抱有幻想 我得到了控制器和视图的有用性,我知道表示和逻辑之间的分离对于使代码在将来更易于维护很重要,尽管不一定更快或更健壮 如果所有逻辑首先都应该放在控制器内部,我看不出模型有任何用处,尤其是活动记录。我们已经有了一种非常健壮且易于使用的语言来与数据库通信,对吗?这叫做SQL。对我来说,当模型像活动记录一样实现时,它的有用性取决于您是否希望您的应用程序适合多个数据库 所以我想问的是,如

我是新来的,所以请容忍我。我最近在几个项目中使用了一个MVC框架,过了一段时间,我对MVC中“模型”的实用性不再抱有幻想

我得到了控制器和视图的有用性,我知道表示和逻辑之间的分离对于使代码在将来更易于维护很重要,尽管不一定更快或更健壮

如果所有逻辑首先都应该放在控制器内部,我看不出模型有任何用处,尤其是活动记录。我们已经有了一种非常健壮且易于使用的语言来与数据库通信,对吗?这叫做SQL。对我来说,当模型像活动记录一样实现时,它的有用性取决于您是否希望您的应用程序适合多个数据库

所以我想问的是,如果你只使用一个数据库,为什么还要麻烦模型和活动记录呢?为什么不直接使用SQL呢?为什么要增加一层复杂性?你们有没有案例研究/真实故事,在这些案例中,模型实际上比仅仅使用数据库类和SQL更好


再一次,如果我看起来如此无知,我很抱歉,但我真的不知道为什么模型很重要。感谢您的回答。

我总是将模型与数据关联起来,而不管它出现在何处或如何表示。在MVC中,V显示数据,C处理更改。即使您在控制器内的HashMap中拥有屏幕上显示的所有数据;该HashMap将被称为模型。

模型应包含您的所有逻辑。控制器只负责与用户交互相关的逻辑。所有与域相关的功能(称为“业务逻辑”)都应该放在模型中,并与控制器代码解耦。这样可以更好地分离关注点和代码重用性

例如,假设您正在编写一个应用程序,让用户输入自己的信息并接收饮食建议

一方面,您可以将与转换用户提供的数据相关的代码放入模型部分的饮食建议列表中。这包括数据库访问,但也包括与问题(问题域)相关的任何计算、算法和处理

另一方面,您将代码放在控制器中,用于用户登录、显示表单、收集表单数据、验证表单。例如,通过这种方式,您可以稍后将api添加到应用程序(使用不同的代码进行身份验证、从用户处获取数据、验证等),并重用代码(从模型)生成结果


这只是一个例子,说明了该模型的优点

在大多数实际情况下,来自用户的数据不会直接进入数据库

必须经常对其进行验证、过滤或转换

模型层的作用通常是通过执行这些操作来确保数据正确地到达后端存储(通常是数据库),这不应由控制器(skinny controller,fat model)负责,也不应由数据库引擎本身负责

换句话说,模型层负责——或者“知道”——应该如何处理数据

大多数现代MVC框架都提供了根据数据有效性要求(如Rails)指定契约的方法

下面是一个例子:

在这里,一些数据有效性要求不能由数据库处理,也不应该在控制器中处理,因为这些要求中的任何修改都可能在多个地方破坏代码

因此,模型是确保数据与您所在领域一致的最佳场所


关于这件事还有很多要说的,但我想解决一个对我来说很重要的问题,这是出于实践经验:)

这根本不是一个无知的问题!事实上,你问这个问题而不是简单地忽略整个MVC理论,然后随心所欲,这很好。:-)

回答您的问题:从概念上讲,模型只是为您的数据提供了一个很好的抽象。模型使您能够从“我的应用程序的对象如何相互关联、它们如何交互以及我如何从它们那里获得所需的数据”的角度来思考,而不是从“如何编写此内部联接以获得我需要的所有字段”的角度来思考

与视图和控制器帮助您将表示与逻辑分离的方式相同,模型帮助您将应用程序的逻辑(无论如何,从用户的角度)与您的数据实际来自何处以及如何在内部表示的细节分离

举一个更具体的例子(如果不完全现实的话):理论上,您可以用通过SQL查询获取所有数据的方式编写整个应用程序。但后来您意识到您想要使用一些noSQL(CouchDB等)引擎,因为您需要水平缩放

有了模型(当然还有一个可以同时使用两种存储类型的框架:-),您就不必担心细节,因为所有重要数据都已经通过模型以通用方式表示,视图和控制器都可以根据这种表示方式进行操作

如果没有它们,您可能需要重写大量代码,以便将数据获取适应新的后端

这只是无聊的存储部分。使用纯SQL,很难定义应用程序对象(即业务逻辑)之间的交互,因为在SQL中不会这样做(可能无论如何)


这不是一个完美的解释(远非如此),但我希望它能有所帮助。

首先,假设模型层必须使用某种ORM,以便将SQL抽象出来。事实并非如此:您可以创建一个与控制器层松散耦合但紧密耦合的模型层
class Cat
  validates_inclusion_of :sex, :in => %w(M F), :message => 'must be M or F'
  validates_inclusion_of :vaccinated, :in => [true,false]
  validates_inclusion_of :fiv, :in => [true,false]
  validates_inclusion_of :age, :within => 1..30
  validates_each :weight do |record, attr, value|
      record.errors.add attr, 'should be a minimum of 1 pound' if value and value  /^[01][0-9]\/[0-9]{2}\/[0-9]{4}$/
  validates_length_of :comment, :allow_blank => true, :allow_nil => true, :maximum => 500
end