例如,在Java中,由于该语言的静态性质,因此开箱即用。但是在PHP中,从架构的角度来看,这尤其有用,可以确保代码的安全和整洁。
例如,我们有以下代码:
interface DocumentProcessorInterface
public function process();
}
class GameSaveProcessorImpl implements DocumentProcessorInterface {
public function process() {
// do something useful
}
public function methodToSetSomethingFromFriendClass() {
// setting private fields, some postponed initialization/resetting, etc
}
}
然后,从某个类(我们称其为“朋友类”,因为它与GameSaveProcessorImpl
类并排放置并对其进行补充),我们称为方法methodToSetSomethingFromFriendClass
。由于使用PHP Duck进行键入,因此此类调用此方法的功能也可用于任何外来客户端代码,但此方法不适用于此类用法。外来(外部)客户代码必须仅使用DocumentProcessorInterface
方法(这是我们完全使用接口的原因之一)。
想到了一些解决方案。
1)保持原样,但重命名接口中未包含的公共方法,因此对于那些外来客户端代码实现者而言,它可以作为警告,例如,将methodToSetSomethingFromFriendClass
重命名为internalUseOnly_methodToSetSomethingFromFriendClass
。降低偶尔使用的风险,但不禁止在技术上调用方法。
2)使用适配器(装饰器)图案。传递给没有methodToSetSomethingFromFriendClass
方法的仅装饰外部代码的实例。它确实解决了不需要的方法访问问题,但使我们代码的其他部分非常复杂。似乎没有整体利润。
3)尚未对此想法进行任何验证:利用以下事实。基类可以声明受保护的方法,因此我们控制的所有朋友类都可以
从该基础类扩展而来,将我们的methodToSetSomethingFromFriendClass
方法标记为受保护,可以有效地免受外部代码的攻击,但可以从“朋友”类中调用。从技术上讲,这可以提供保护,但是需要朋友类从通用基类继承,这种缺陷是众所周知的。
您知道什么更好的吗? 赞赏本文的链接并分享了该主题研究的经验。