【问题标题】:Reconciling Law of Demeter with Models用模型调和得墨忒耳定律
【发布时间】:2012-04-05 14:39:59
【问题描述】:

我有一个数据模型对象User。例如,我的应用程序还有一些其他数据模型对象,ForkOptions。用户有分叉和分支。我的应用程序必须使用用户/叉子/选项等信息的某种组合运行大量查询。例如,您可以看到一个用户分叉页面。这将需要在 Forks 上加入该用户(例如会话中的登录用户)的查询。

我不想违反得墨忒耳法则,而且我通常也反对一般的 getter(和 setter),所以我不想实现 User::getID()User::getUsername()

但是,对我来说,替代方案似乎并没有好多少。最终发生的是我在User 中实现了各种方法来运行这些查询(例如User::getForks())。一般来说,这是可行的,但 User 类已经变得单一,这有其自身的坏处。

更重要的是,我不确定如何解决对两个数据模型对象的查询。例如,我可以有一个带有 id 的 User 和一个带有 id 的 Fork 并且想要检查分叉是否属于用户。这要求 Fork 将其 id 暴露给用户,User 将其 id 暴露给 Fork,或者两者都将它们的 id 暴露给控制器(或其他任何东西)。这些似乎都不是可取的,我不确定该选择哪个。我还缺少其他选择吗?

在另一个类似的步骤中,我不确定向视图添加信息的最佳方式。我有一个视图对象,通常我使用像User::addForksToView(View $view) 这样的方法,它将运行一个或多个查询并进行一些处理,但这也增加了User 的大小和责任。我认为这是一个类似的问题。

【问题讨论】:

    标签: php mysql model-view-controller law-of-demeter


    【解决方案1】:

    而不是 User 对象中的 getForks 方法,使用 ForksFactory 或类似的东西。工厂可以有fromUser(User $user)byId($id) 这样的方法。这样User 对象在Fork 对象上就没有hidden dependency,并且可能隐藏了对数据库访问的依赖。 ForksFactory 依赖于数据库并包含获取数据和创建Forks 所需的代码,这就是它所知道的全部内容。 Fork 对象不会依赖于数据库,而现在User 对象不需要知道任何关于Fork 的信息,实际上Fork 根本不存在,User 不存在不在乎。这就是单一用途对象的想法。

    至于 getter 和 setter,为什么不公开像 id 和 name 这样的属性呢?或者,您可以使用 magic methods __get__set 来控制哪些属性被视为只读,如果这是您所关心的。否则,您也可以公开这些属性——这是完全可以接受的。

    你提到的其他代码听起来也有同样的问题——一个对象,一个目的。理论上,每个对象都应该独立存在,或者在构造函数中注入任何依赖项。您的对象不应要求定义另一个对象,否则其中一个方法将失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      相关资源
      最近更新 更多