php – 面向对象的方法桥
我系统中的几个资源使用基于
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()的函数.不要改变它.它应该返回所有标题. 现在我的朋友只剩下一个小小的消息了.我相信你的讨论会引发一个更有趣的问题,你和你的队友应该问这个问题. 几乎总是,如果你需要获得一个对象的某些属性并对它们采取行动.然后,您还应该能够将该功能封装到该对象/类中.当你获得一个对象属性并使用它来做某事然后把它放回去时,几乎总是代码味道.
谢谢你的时间,我希望我能帮助你:D. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |