Php 德米特定律与模型的协调

Php 德米特定律与模型的协调,php,mysql,model-view-controller,law-of-demeter,Php,Mysql,Model View Controller,Law Of Demeter,我有一个数据模型对象User。我的应用程序还有一些其他数据模型对象,例如,Fork和Options。用户有分叉和分支。我的应用程序必须运行大量查询,并结合用户/分叉/选项等信息。例如,您可以看到一页用户的分叉。这需要在Forks上加入该用户(例如会话中登录的用户)的查询 我不想违反德米特定律,通常我也反对getter(和setter),所以我不想实现User::getID()或User::getUsername() 然而,在我看来,另一种选择并没有好多少。结果是我在User中实现了各种方法来运行

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

我不想违反德米特定律,通常我也反对getter(和setter),所以我不想实现
User::getID()
User::getUsername()

然而,在我看来,另一种选择并没有好多少。结果是我在
User
中实现了各种方法来运行这些查询(例如
User::getForks()
)。一般来说,这是可行的,但是
User
类已经变成了单片的,这本身就很糟糕

更重要的是,我不确定如何解析两个数据模型对象的查询。例如,我可以让一个id为的
用户
和一个id为的
分叉
,并希望检查分叉是否属于该用户。这要求
Fork
向用户公开其id,
user
Fork
公开其id,或者两者都向控制器公开其id(或其他任何内容)。这些似乎都不可取,我也不知道该选哪个。我还缺少其他的选择吗


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

使用
ForksFactory
或类似的方法,而不是
User
对象中的
getForks
方法。工厂可以有类似于
fromUser(User$User)
byId($id)
的方法。这样,
用户
对象就不会对
Fork
对象有依赖关系,并且可能对数据库访问有隐藏的依赖关系。
ForksFactory
依赖于数据库,它只包含获取数据和创建
Forks
所需的代码,这就是它所知道的全部操作。其中,
Fork
对象将不依赖于数据库,现在
User
对象不需要知道关于
Fork
的任何信息,实际上
Fork
根本不可能存在,
User
也不关心。这是单一目的对象的概念

至于getter和setter,为什么不将id和name等属性公开为public呢?或者,您可以使用
\uu get
\uu set
来控制哪些属性被视为只读(如果您担心的话)。否则,您也可以公开属性——这是完全可以接受的


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

请使用
ForksFactory
或类似的方法,而不是
User
对象中的
getForks
方法。工厂可以有类似于
fromUser(User$User)
byId($id)
的方法。这样,
用户
对象就不会对
Fork
对象有依赖关系,并且可能对数据库访问有隐藏的依赖关系。
ForksFactory
依赖于数据库,它只包含获取数据和创建
Forks
所需的代码,这就是它所知道的全部操作。其中,
Fork
对象将不依赖于数据库,现在
User
对象不需要知道关于
Fork
的任何信息,实际上
Fork
根本不可能存在,
User
也不关心。这是单一目的对象的概念

至于getter和setter,为什么不将id和name等属性公开为public呢?或者,您可以使用
\uu get
\uu set
来控制哪些属性被视为只读(如果您担心的话)。否则,您也可以公开属性——这是完全可以接受的

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