浅述PHP设计模式(3)
5、其它面向对象的原则
CARP: The Composite/Aggregate Reuse Principle 合成聚合复用原则
合成聚合复用原则的定义:在一个新对象中使用一些已有的对象,使之成为新对象的一部分。新的对象通过向这些对象的委派达到复用的目的。
提出这一原则的根本点在于,很多编码的问题是滥用继承。通过SOLID原则,我们可能分出了较多的类。
如果最终我们仍是使用SOLID原则将这些类最终继承成为一个类,一下子将我们的松耦合的目标又破坏了。这是因为,继承实现是静态的,很难应对父类的变化。而使用合成聚合复用,则是动态的。
所以,这一原则简单来说可以这样理解,如果SOLID把一个类分成了多个类,则不要设法通过继承让其再成为一个类,而要使用合成聚合复用的手段。这就是说另行定义一个新类,或使用其中一个类,调用其它被分出的类。
LoD: The Law of Demeter 迪米特法则
迪米特法则是:不要和陌生人说话。
这实际上是与单一职责原则已经对此有所强制。而这一法侧更强调细节。
迪米特法测中明确规定了哪些是朋友。除朋友之外,所有算法均不可以与朋友之外的数据对话。迪米特法则朋友的条件有:
1)当前对象本身
2)以参数形式传入本对象中的对象
3)当前对象的实例变量直接引用的对象
4)当前对象如果是一个聚集,那么,聚集中的元素也是朋友
5)当前对象所创建的对象
可以看出,迪米特法则有助于我们在编码时清楚界定核心与具体。并协助我们创建最松的耦合关系。
IoC: The Inversion of Conntrol 控制倒置原则
控制倒置原则是指:不要调用我,让我来调用你。实际上就是指核心调用具体的一个模式。
这就是说,核心调用具体,并不是天生就有的,而是我们针对具体问题而做的设计。
这里,实际上产生了两个控制权的倒转:
第一,调用控制权倒转。由核心代码获得。
第二,流程控制权与具体实现控制权倒转,由具体代码获得。
具体而言,如果是让用户直接使用的类,调用控制权上由具体代码掌控的。而流程控制权与具体实现控制权已不存在,或者说已被类的编写者使用。
但当你要继承一个抽象类,或实现一个接口,则就产生了对应的控制倒置。
有人说,控制倒置原则与依赖倒置原则是同义原则。实际上二者并不是等同的。因为,当然,这二者所说的实际是同一问题的两个不同的层面。
控制倒置原则的要求是,交还具体代码的控制权,并强行使用调用控制权。这就是说,凡不属于核心代码的流程控制的一切,均交给具体代码处理。这样一来,我们就更易于处理核心调用具体时对抽象类或接口的定义。
有人说,弄通SOLID原则,或者再加上这三大原则,那么,23个设计模式根本不需要再看了。理论上来讲是这样的。但实际上,如果不背九九乘法表,能计算乘法的,此人是天才。接下来,我们要开始进一步讨论具体的23个设计模式了。不过,有些不同的是,这里的讨论,是没有代码示例的。如同几何老师只讲定理,不给出例题。因为,相对于设计模式,所有“例题”都是与实际脱钩的。我们的目标,是希望没有“例题”的讨论,更加有利于能够运用到实际当中。
{注:文中一切,均属于本人理解,或本人的观点。因本人水平有限,所以,如果您发现错漏,欢迎指正}
(待续)
上一篇: 本田和京都大学合作开发人类协同式AI
下一篇: 自动化测试