加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 面向对象的方法桥

发布时间:2020-12-13 22:33:20 所属栏目:PHP教程 来源:网络整理
导读:我系统中的几个资源使用基于 Java集合的对象集合的概念. 此Collection类(抽象)为另一个具体类提供基本功能,称为Lists,允许通过Collection的索引查找对象. 我将使用我的HTTP Headers类作为示例来解释. 我在它的构造函数中有一个这个列表类的实例.每个HTTP标头
我系统中的几个资源使用基于 Java集合的对象集合的概念.

此Collection类(抽象)为另一个具体类提供基本功能,称为Lists,允许通过Collection的索引查找对象.

我将使用我的HTTP Headers类作为示例来解释.

我在它的构造函数中有一个这个列表类的实例.每个HTTP标头字段都添加到Collection by Headers :: addHeader()方法中.

显然,我有一个名为getHeaders()的getter方法,它返回Collection的存储,而不是Collection的Object.

所以,如果我需要在这个课程之外列出标题,我只需要调用$obj – > getHeaders()和我有一个添加了所有对象的ArrayObject.

好的!

但是,最近,出现了使用Lists方法Lists :: find()之一的必要性,它找到一个对象,甚至不知道对象的名称或它在Collection的存储中的特定位置.

由于Lists对象位于私有属性中,因此Headers :: getHeaders()返回Collection Storage,我不想违反封装,通过使属性成为公共属性,我无法访问此方法.

除了功能之外,我编写的所有内容都必须在视觉上优雅,并创建另一个getter方法,假设getHeadersLists()会产生如下调用:

$obj -> getHeadersLists() -> find( 'foo' );

这太丑了!

所以,我在Headers Class中快速添加了一个__call(),它运行正常:

$obj -> find( 'foo' );

但我认识的人(他非常精通面向对象主题)告诉我这是错误的.

我的论点纯粹是关注可读性,他反驳说“在面向对象,魔术方法和可读性方面不能共存”.

所以呢?我应该怎么做才能在这两个类之间创建这个“桥”,而不使用_call()并保留Object Orientation的原则?

我知道,我可以在Headers :: getHeaders()中返回Collection Object并使用类似的东西:

$obj -> getHeaders() -> find();

但我学到的关于面向对象的东西是责任.正如其声明所说,这种方法的责任在于返回所有添加的Headers而不是外部对象.

解决方法

我打算用鲍勃叔叔的单一责任原则a.k.a(S.O.L.I.D的大S)打你.您可以在 Principles Of OOD文章中阅读更多内容.也可以直接回答你的问题 Tom Dalling’s very nice article and example.

当你隐藏getHeaders()函数调用返回类型Lists的对象然后看起来你正在调用该对象并且它有一个名为find“它不应该具有”的函数时的问题,因为找不到正确的头文件不是他的责任.

我能理解你的责任方法.

你说:当我调用getHeaders()时,我不应该被迫进一步操纵结果来得到我想要的东西.

你的这个建议是完全正确的.但是要实现这个结果,隐藏带有合成糖的getHeaders()函数调用是完全错误的.因为它会误导我.

考虑我作为第三方阅读您的代码,我会立即假设该类的find()函数非常具有误导性.此外,我会拒绝这个find()函数,因为从标题列表中查找不是来自对象的责任,这只是一个不必要的附加组件或错误.所以你的同事也是正确的:D.

我相信强迫你调用find()以便能够使用Headers类型对象的情况在这里应该受到指责.

我对你的困境的建议是这样的.

>这个对象最应该有一个名为getHeaders()的函数.不要改变它.它应该返回所有标题.
>创建一个名为getRelatedHeaders(“foo”)或getFooHeaders()的函数,它以封装的方式调用getHeaders(),而不是使用find(“foo”)并返回“foo”头.

现在我的朋友只剩下一个小小的消息了.我相信你的讨论会引发一个更有趣的问题,你和你的队友应该问这个问题.

几乎总是,如果你需要获得一个对象的某些属性并对它们采取行动.然后,您还应该能够将该功能封装到该对象/类中.当你获得一个对象属性并使用它来做某事然后把它放回去时,几乎总是代码味道.

Why is that object not doing his responsibility but you are
manipulating his properties for him ?

谢谢你的时间,我希望我能帮助你:D.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读