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
来控制哪些属性被视为只读(如果您担心的话)。否则,您也可以公开属性——这是完全可以接受的
你提到的另一段代码听起来好像也有同样的问题——一个对象,一个目的。理论上,每个对象都应该处于隔离状态,或者在构造函数中注入任何依赖项。您的对象不应要求定义另一个对象,否则其方法之一将失败