幸运星空

Lucker的程序人生

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

OO最基本的7大原则:

单一职责原则:SRP,一个类应该仅有一个引起变化的原因,不同变化原因的职责不要封装在一起
开放封闭原则:OCP,软件实体应当对修改关闭,对扩展开放
依赖倒置原则:DIP,依赖于抽象,不依赖于具体,因为抽象相对稳定
接口隔离原则:ISP,尽量应用专门接口,接口应该面向用户,将依赖建立在最小接口上
Liskov替换原则:LSP,子类应能替换成基类
合成/聚合复用原则:CARP,在新对象是聚合已有对象,使之成为新对象的成员,从来通过操作这些对象达到复用的目的
迪米特法则:LoD,又叫最小知识原则,指软件实体应该尽可能少和其他软件实体发生相互作用

单一职责原则:

该原则的核心思想就是:一个类最好只做一件事,只有一个引起它变化的原因。职则就是引起它变化的原因。遵循这一原则的关键不在于功能点的多少,而在于引起类变化的原因的个数。对于违背这一原则的类可以通过重构类,采用Facade模式或Proxy模式来分离职责,通过基本的Extract Interfact,Extract Class,Extract Mothod进行梳理。

注意:避免将相同职则分散在不同类中同样和避免一个类实现多个职责一样重要。只需要修改一小点就可以满足。

例如:数据库操作中将身份验证和数据操作两个职责分开,分别实现单一功能,当任一部分发生变化时,

开放封闭原则:

开放封闭原则是面向对象设计的核心原则,该原则的核心思想就是:对扩展开发,对修改封闭。实现这一原则的就是要做到对抽象编程而不是对具体编程,其基本思路就是通过继承(实现继承和接口继承)和多态机制,实现对抽象体的继承,通过覆写其方法来改变固有行为,扩展新的方法。对于违背这一原则的类可以通过重构来改善,采用Template Method模式或Strategy模式,将经常发生变化的状态封装为一个类。

对扩展开放:当有新的需求或变化时,可以对现有代码进行扩展。
对修改封闭:当类的设计完成,就可以独立完成其工作,而不要对类再进行任何修改。

例如:银行业务办理过程中,将存款,取款,汇款等业务放在不同的类中(单一职责原则),并实现同一个接口,处理时根据客户不同的目的,调用同一接口实现不同的操作(多态),业务扩展时,只需要增加一个新类,实现前面的接口,而不必修改原有的类。

依赖倒置原则:

通过抽象机制有效解决层与层之间的关系,降低耦合粒度,实现对抽象的依赖是依赖倒置原则的核心思想。具体体现为:高层模块不依赖于底层模块,二者都依赖于抽象,而抽象不依赖于具体,具体却要依赖于抽象。依赖于抽象就是要对抽象编程,而不是对具体编程。

当两个模块存在紧耦合时,最好的办法就是分离接口和实现:在依赖之间定义一个抽象的接口,使高层模块调用接口的方法,而低层模块则实现接口方法,以此来达到依赖于抽象的目的。

例如:上述银行业务办理中,业务处理方式依赖于具体客户的类型(违背了依赖倒置原则),可以将客户类分离出一个抽象的接口和若干个不同类型的客户类,业务处理类只依赖于该抽象接口。当有新的客户类型增加时,只需要实现该接口就行了。

接口隔离原则:

该原则的核心思想是:使用多个小的专门的接口而不是一个大的总接口。接口应该是内聚的,不要胖接口,一个类的别一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,造成接口污染。接口隔离原则强调了接口的单一性。对于违背这一原则的可以采用以下两种方式:
1,委托分离:增加一个新的类型来委托客户请求,隔离客户和接口的直接依赖
2,多重继承分离:通过接口多继承来实现客户请求(推荐)

例如:一个使用电脑的接口具三个方法:学习,工作和娱乐,如果一个小孩类继承了该接口,就可能造成接口污染--小孩不需要实现工作这一方法。解决的方法是将当前这个胖接口分了成三个小接口,小孩类继承其中的学习接口和娱乐接口就可以了。

Liskov原则:

该原则是关于继承机制的原则,其核心思想就是:子类必须能替换其基类。它保证了继承复用的可靠性。

违背Liskov原则必然导致违背开放封闭原则,

posted on 2009-01-05 20:48  Lucker  阅读(219)  评论(0编辑  收藏  举报