【问题标题】:Best practice - Accessing domain object list from view?最佳实践 - 从视图访问域对象列表?
【发布时间】:2011-02-03 16:53:13
【问题描述】:

只是想知道(在 Grails/Java 中)在 MVC 设计的视图/gsp 中调用:Foo.list(),而不是通过模型(即foos: Foo.list())并使用它是否是不好的做法?

在我看来,既然它是如此简单的显示,这很好,但另一方面我知道直接从视图访问域对象是不好的做法。

提前致谢。

【问题讨论】:

  • 这是一条评论,因为我对 Grails 一无所知...我通常从允许这样简单的事情开始,然后我一开始就根据模型和通常提供的功能进行重构模型及其内容。发生这种情况时,我知道复杂性足够高,足以保证始终通过模型,即使模型只是在后台委托给函数。

标签: java model-view-controller grails view


【解决方案1】:

您所做的通常被认为是一种不好的做法。原因很简单:您的视图与您的模型紧密相关。让我们来看看后果:

  1. 如果您需要过滤掉返回的列表,您必须在您的视图中进行。例如,假设您想要显示启用分页的Foo 实例列表。因此,您需要有一个max 参数,它将像Foo.list(max: params.max) 在您的视图中一样使用。 max 是您可以想象的数百个参数(顺序、排序...)。因此,您的视图不仅取决于域实例,还取决于请求参数,您必须对其进行处理。
  2. 最重要的是,当您需要以 JSON(例如 Ajax)或 XML 或其他方式呈现相同的数据时,您必须复制此代码。而这种不好的做法,不可维护且容易出错。

结论:您可以为原型设计或不会重复使用的视图(例如管理内容)执行此操作。其他情况就算了。

【讨论】:

    【解决方案2】:

    不这样做的一个非常实际的原因是,您最终可能希望从不同的操作中使用相同的视图,最终以某种方式过滤数据。您可能并不总是希望处理 Domain.list()。

    【讨论】:

      【解决方案3】:

      我认为,在原型阶段,这样的陈述“在某种程度上”是可以接受的。

      但是,更现实地说,这种简单的东西在生产代码中并没有真正发生。当你开始操作数据,或者说,检索很多不同的对象并对它们做一些事情时,你会发现你可能想要返回一些与 UI 层完全不同的东西......

      现在,如果您已经开始从早期的声明中构建一些闪现的东西,这将导致您不得不重新编写部分 UI 代码......这不太好,并且可能会引起头痛。

      另外,你已经回答了你自己的问题:是的,我认为这是不好的做法。

      【讨论】:

      • 我不会投反对票,但这在某种程度上是不能接受的。你的其余答案都很好......
      • 当你“只是处于原型模式”时,不良做法的问题是,当你处于“真实模式”时,它们通常不会得到修复,废话被传播并复制/粘贴缺乏经验的开发人员,他们不了解情况。
      【解决方案4】:

      我同意这是不好的做法。即使是在原型设计期间,从控制器传递它也不会增加很多额外的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        相关资源
        最近更新 更多