MVC - 除了设置/获取成员之外,模型类中应该都有哪些方法?

Posted

技术标签:

【中文标题】MVC - 除了设置/获取成员之外,模型类中应该都有哪些方法?【英文标题】:MVC - which methods should be in Model class except set/get members?MVC - 除了设置/获取成员之外,模型类中应该有哪些方法? 【发布时间】:2012-11-13 01:28:57 【问题描述】:

应该Model 中还是在 Controller 中实现操纵 Model 类成员的方法?这是否取决于这种操作有多“重”?

“操纵”是指:

    获取班级成员

    根据该类成员进行长计算

    返回与该类相关的另一个值

例如,Board class 包含一个单元矩阵成员。 现在我想实现一个根据特定单元格位置返回所有周围单元格的方法。

模型或视图是否负责实现上述内容?

如果此问题属于另一个 Stack Exchange QA 站点,我将欢迎将我的帖子移至该站点的建议。

【问题讨论】:

“操纵”是什么意思?也许举几个例子会有所帮助。 @s.m.我在编辑中解释了 这里有一些关于在 MVC 项目中放置算法的有趣线程。 Here's one。请注意,这是一个稍微主观的话题。 【参考方案1】:

保持控制器精简,不要让它们做太多事情,这符合 SOLID 中面向对象设计的单一职责原则。如果你有胖控制器,它们就会变得难以测试和维护。

至于模型,在此之前我有一些愚蠢的模型,除了映射到数据库表之外什么也没做,这受到了您在网络上看到的大多数示例应用程序的启发,但现在我不这样做了。

我(尝试)遵循领域驱动设计的原则,其中模型(DDD 术语中的实体)位于应用程序的中心,它们被期望封装与实体相关的行为,它们是智能模型(所以是的,在这种情况下,与对象相关的逻辑将与它一起存在)。 DDD 是一个更大的话题,它与 MVC 没有直接关系,但它背后的原理可以帮助您更好地设计应用程序,如果您在 Google 上搜索 DDD,可以找到很多材料和示例应用程序。

此外,Ruby On Rails 社区 - 似乎激发了大多数 MVC 框架 - 似乎也对拥有 Fat Models 和 Skinny Controllers 进行了炒作。

除此之外,您还可以将 View Models 添加到您的组合中,这对我很有帮助。在这种情况下,您可以使用 ViewModel 来表示模型的一个愚蠢子集,仅用于生成视图,它使您的生活更轻松,并进一步将您的视图与模型分开,这样它们就不会影响您的设计不必要的决定。

【讨论】:

【参考方案2】:

你所谓的“模型”实际上是domain objects。 MVC 中的实际模型只是一个层,而不是具体的东西。

在您的特定示例中,Board 应该有一个返回此列表的方法。我假设,您实际上正在获取它,因为您需要与这些细胞进行进一步的交互。

这就是模型层中的services 发挥作用的地方。如果使用它们,它们是模型层的外部部分,包含应用程序逻辑——不同域对象之间的交互以及持久性(通常是data mappers 或units of work)与域对象之间的交互。

假设您正在制作一款游戏,您和玩家进行表演并进行 AoE 攻击。控制器持有负责此功能的服务并发送命令:此玩家将 AoE 指向此方向,执行它

服务实例化Board 并询问目标位置的周围单元格。然后它对它获取的集合中的每个单元格执行“损坏”。逻辑完成后,它告诉 Unit of Work 实例提交发生在 Board 上的所有更改。

控制器不关心服务做什么的细节。它不应该收到任何反馈。当执行到达视图时,它从模型层请求最新的更改并修改 UI。作为额外的好处 - 服务可以让您阻止业务逻辑在表示层中泄漏(主要由视图和控制器组成)。

域对象应该只包含处理其状态的方法。

【讨论】:

【参考方案3】:

我认为这与 MVC 关系不大,而与常规软件工程有很大关系。

我个人会毫不犹豫地将琐碎的计算放在模型中,但会非常警惕 fat 模型。

现在,MVC 代表模型视图控制器这一事实并不一定意味着一切都应该是视图、模型或控制器。如果您觉得有必要将职责转移到一个不符合 M、V 或 C 标准的单独类,我不明白您为什么不应该这样做。

实现方式由您决定。您可以将此单独的类用作“***”(因为没有更好的术语)对象,或者将模型的方法委托给它,以隐藏您正在使用它的事实。我可能会选择后者。

不过,一切都值得商榷。每个人和他们的妹妹似乎对如何正确地执行 MVC 有不同的看法。

我,我只是将其视为指导方针。当然,这是一个好主意,因为它可以让你更好地分离关注点,但最终——正如它总是发生的那样——没有一种万能的方法来应用它,你不应该被它过度束缚,以至于一切都必须是视图、模型或控制器。

【讨论】:

【参考方案4】:

根据最佳实践,我们应该使用仅限获取访问权限的计算字段的属性。例如公共双总成本 得到 返回 this.Role.Cost * TotalHour;

【讨论】:

以上是关于MVC - 除了设置/获取成员之外,模型类中应该都有哪些方法?的主要内容,如果未能解决你的问题,请参考以下文章

一个中级java工程师应该掌握哪些知识?有啥途径去获取这些知识?

使用 JPA 时实现 MVC

如何通过 MVC Razor 代码获取枚举成员的显示名称属性?

类中的internal成员可能是一种坏味道

是或否:MVC 中的模型是不是应该包含应用程序逻辑?

我正在尝试使用模型表单小部件更新模型。除了 forms.DateField 之外的所有字段都可以在 HTML 表单中进行编辑