【问题标题】:Where do computed values belong in the MVC pattern?计算值在 MVC 模式中属于哪里?
【发布时间】:2009-04-05 09:34:46
【问题描述】:

在我正在构建的应用程序中,我有一个用户的概念。

在应用中,用户有个人资料页面。

这些都很简单。它们基本上就像 /profile?id=3 或其他什么,其中 3 是我想查看其个人资料的用户的用户 ID。

将 url_for_profile 方法添加到 User 模型是否有意义,或者我应该为用户配置文件 URL 创建视图或完全做其他事情?

有很多不同的方法都行得通,但我很好奇这里的最佳做法是什么。

感谢您的建议!

【问题讨论】:

  • 不太清楚你在问什么。

标签: model-view-controller


【解决方案1】:

这取决于决定 url 是什么的层。

如果 url 是由模型层出于某种原因定义的(客户端-服务器应用程序需要偶尔引用网站),那么模型对象应该具有检索配置文件 url 的方法。

如果 url 纯粹是表示层的概念(模型只是提供用户数据本身的网站),那么它是由控制器层做出的决定。如果是这种情况,创建一个 UrlFactory 或类似的东西可能是有意义的,您可以向它提供用户 ID,它会生成相应的配置文件 url。

【讨论】:

    【解决方案2】:

    url_for_profile 也是推荐的,因为明天如果你想缓存配置文件并且当用户数量增长非常多时,你可能需要集群你的应用程序,那个时候这个方法会很有用。

    虽然您可能会创建不同的视图,但隐式处理 url 可能会在较长时间内产生问题,随着项目和数据库的增长,理解和管理正在发生的事情变得太困难了。所以即使你正在创建一个新视图,你仍然应该有 url_for_profile,它可以用于集群。如果你注意到,微软的每个链接都有这种格式... go.microsoft.com/linkID=XXXXXXX ,

    【讨论】:

      【解决方案3】:

      我在您的要求中看不到任何内容表明用户需要知道 URL 是什么。如果您实现此方法,则意味着您最终可能会得到诸如 Order.url_for_order 或 Cart.url_for_cart 之类的东西。如果您想更改指定 URL 的方式,则必须更改所有类。最好让系统中的所有对象都有一个 ID 和一个 View 辅助类,该类具有如下方法: URLHelper.url_for_object(myobject)

      您绝对需要做的是将模型中的对象与其定位的管道隔离开来,并将定位留给您正在使用的 Web 框架。一般的最佳实践是每个类都指定一个 ID,并且 Web 基础设施中的处理程序取决于它呈现的类。它通过传递给它的 ID 检索类。

      所以你看到依赖是一种方式。 View 类依赖于底层模型,但模型不依赖于它的位置。如果您随后想要缓存对象,您可以在视图层实现这一点,同样底层对象不知道或不依赖于它是否被缓存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-16
        • 2014-12-18
        • 1970-01-01
        • 2015-06-12
        • 2017-01-24
        • 1970-01-01
        • 2017-03-27
        • 1970-01-01
        相关资源
        最近更新 更多