MVC:完全填充的模型还是部分填充的模型?


10

这个困扰了我好久了。在进行MVC编程时,您认为更好的编程实践是什么?一个人应该使用完全填充的模型还是部分填充的模型,特别是当我知道要完成此特定任务时,我将仅需要来自模型对象的2个字段,而其他5个字段呢?

有时,当您知道只需要几个模型对象时,就用数据库中的所有值填充20个模型对象的列表似乎是犯罪的。

当然,局部模型意味着除了获取所有内容的方法外,您还必须在DAO中编写另一种方法。哪个意味着要维护更多代码?

另一方面,从具有完全填充的模型的数据库中提取所有内容意味着一种方法可以解决所有问题,但这显然会给您带来一些性能开销。

我可以看到ORM(例如Hibernate或ActiveRecord of Rails)在MVC编程中倾向于趋势,而诸如Google的BigTable完整模型这样的数据库则被接受为趋势。但是,如果您仍在使用旧的JDBC,该怎么办?

硬件便宜,开发成​​本高。即使应用程序每小时需要扩展至数十万个请求,这真的是真的吗?


1
“另一方面,从具有完全填充的模型的数据库中提取所有内容意味着一种方法可以解决所有问题,但这显然会给您带来一些性能开销。”真的吗?您是否测量了此实践的性能开销?
S.Lott

>>真的吗?您是否测量过此做法的性能开销?<<-我曾期望过这一点。不,我没有。但这将很有意义,否则将被证明是错误的。
Pritam Barhate 2011年

很难证明不存在间接费用。您可以轻松地询问很多细节,声称这些测量在某些情况下是无效的。如果您使用数据库,应用程序语言等的“典型”设置,并配置您的首选配置以显示实际的开销,那就更好了,这样我们就不必去质疑我们在测量中遗漏的各种因素了。 。
S.Lott

1
我在msdn.microsoft.com/en-us/magazine/ee236638.aspx上找到了一篇精彩的文章,涉及公开域模型与发送DTO的问题。
Mayo

Answers:


3

您有两种选择:

1)将模型中的某些字段保留为空

2)根据您的具体情况创建一个额外的“精简”模型

选择哪一个又取决于两件事:

a)“完整”模型的多少个字段将被忽略

b)多久实例化一次此“精简”模型

如果只有几个或多个字段无法填写,可以选择1)。

如果b)只是个别情况,那么仅针对一个使用案例创建额外的模型可能没有意义。

另一种方法是定义“精简”模型并从中继承“完整”模型。


感谢您的回答。根据需要建立一个精简模型是有意义的。但是有时我想知道这样的策略会不会创建太多的模型类?尤其是当我创建特定于视图的模型而不是特定于业务逻辑的模型时。
Pritam Barhate

3

如果您的视图仅需要模型中的2个属性,则您(可能)具有该用例错误的模型!我希望创建一个适合视图的模型,保存额外的数据库查找,仅填充所需的数据。如果后续视图需要更多详细信息,那么您必须问一下,我以后是否要获取额外的数据,还是应该先获取所有这些数据?

作为替代方案,您可以查看某种惰性评估,以便在需要时填充值。这可以很好地工作,但显然需要更多工作,并且可能最终导致数据库的多次往返,如果您要花很多时间这样做就不好了。

就是说,如果您基本上是从表或视图中选择一些额外的字段,那么获取所有额外数据的成本在所有意图和目的上都是零(好的,在线上有更多字节,但是最大的成本可能是(在创建和删除连接中),因此,如果有机会需要一些额外的数据,一旦您拥有正确的模型,我可能会完全填充模型

硬件很便宜,但是没有任何数量的硬件可以使不良的设计表现良好。


2
>>如果您的视图仅需要模型中的2个属性,则您的模型错误!<<-不必总是磨损。典型案例是显示业务应用程序中搜索结果的列表。例如,在CRM(客户)中,大多数客户将只在搜索列表中显示姓名和一个或两个重要字段。但是,CRM将具有与该客户关联的许多其他字段。
Pritam Barhate

1
问题说,在这种情况下,仅需要两个属性。
史蒂夫

-2

该模型不是DAO。

还有另一件事:如果您说有20个模型(来自示例的客户),那么那不是MVC模型。域模型直接映射到单个表行。相反,它应该负责与“客户”一起完成的所有操作。

在您的示例中,“客户”不是域模型,而只是模型内部的对象。

至于与数据库的交互,应该将该责任委托给一个数据映射器对象,该对象应该知道如何存储和获取您的Customer类实例。


PS如果模型中包含数据库逻辑,则它将域业务逻辑推入控制器。
mefisto

1
一类为客户进行所有操作的类是一个坏主意,因为它将很难维护。
安迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.