最佳实践 - 从视图访问域对象列表?
Posted
技术标签:
【中文标题】最佳实践 - 从视图访问域对象列表?【英文标题】:Best practice - Accessing domain object list from view? 【发布时间】:2011-02-03 16:53:13 【问题描述】:只是想知道(在 Grails/Java 中)在 MVC 设计的视图/gsp 中调用:Foo.list()
,而不是通过模型(即foos: Foo.list()
)并使用它是否是不好的做法?
在我看来,既然它是如此简单的显示,这很好,但另一方面我知道直接从视图访问域对象是不好的做法。
提前致谢。
【问题讨论】:
这是一条评论,因为我对 Grails 一无所知...我通常从允许这样简单的事情开始,然后我一开始就根据模型和通常提供的功能进行重构模型及其内容。发生这种情况时,我知道复杂性足够高,足以保证始终通过模型,即使模型只是在后台委托给函数。 【参考方案1】:您所做的通常被认为是一种不好的做法。原因很简单:您的视图与您的模型紧密相关。让我们来看看后果:
-
如果您需要过滤掉返回的列表,您必须在您的视图中进行。例如,假设您想要显示启用分页的
Foo
实例列表。因此,您需要有一个max
参数,它将像Foo.list(max: params.max)
在您的视图中一样使用。 max
是您可以想象的数百个参数(顺序、排序...)。因此,您的视图不仅取决于域实例,还取决于请求参数,您必须对其进行处理。
最重要的是,当您需要以 JSON(例如 Ajax)或 XML 或其他方式呈现相同的数据时,您必须复制此代码。而这种不好的做法,不可维护且容易出错。
结论:您可以为原型设计或不会重复使用的视图(例如管理内容)执行此操作。其他情况就算了。
【讨论】:
【参考方案2】:不这样做的一个非常实际的原因是,您最终可能希望从不同的操作中使用相同的视图,最终以某种方式过滤数据。您可能并不总是希望处理 Domain.list()。
【讨论】:
【参考方案3】:我认为,在原型阶段,这样的陈述“在某种程度上”是可以接受的。
但是,更现实地说,这种简单的东西在生产代码中并没有真正发生。当你开始操作数据,或者说,检索很多不同的对象并对它们做一些事情时,你会发现你可能想要返回一些与 UI 层完全不同的东西......
现在,如果您已经开始从早期的声明中构建一些闪现的东西,这将导致您不得不重新编写部分 UI 代码......这不太好,并且可能会引起头痛。
另外,你已经回答了你自己的问题:是的,我认为这是不好的做法。
【讨论】:
我不会投反对票,但这在某种程度上是不能接受的。你的其余答案都很好...... 当你“只是处于原型模式”时,不良做法的问题是,当你处于“真实模式”时,它们通常不会得到修复,废话被传播并复制/粘贴缺乏经验的开发人员,他们不了解情况。【参考方案4】:我同意这是不好的做法。即使是在原型设计期间,从控制器传递它也不会增加很多额外的时间。
【讨论】:
以上是关于最佳实践 - 从视图访问域对象列表?的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 数据库中存储和稍后访问 JSON 对象的最佳实践
DAO(数据访问对象)最佳实践 - 我看到的示例同时使用 DAO 和服务对象,这里的最佳实践是啥?