您的位置:首页 > 其它

OO的五大原则

2010-04-08 14:18 253 查看
本文转载自:http://hi.baidu.com/lzycome/blog/item/a15e63d387421cd6a8ec9a64.html

如需转载,请注明出处,谢谢。

一 单一职责原则:

类的单一职责是说一个类应该只做一件事情,如果类中某个方法或属性与它所要完成的职责无关或是为了完成另外的职责那么这样的设计就不符合类的单一职责。而这样的设计的缺点是降低了类的内聚性增强了类的耦合性,另外一个很客观的问题是当我们使用这个类时把我们原本不需要的功能也带到了我们的代码中,从而是文件变大,增加内存开销。包括里面定义的变量越多越庸肿.

二 开闭原则

根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。

三 里氏替换原则

不是鸟类都会飞,企鹅要继承基类(超类)飞的行为或状态时,要传入条件,使基类中 "飞" 不起来

  Pre-condition:

  每个方法调用之前,该方法应该校验传入参数的正确性,只有正确才能执行该方法,否则认为调用方违反契约,不予执行。这称为前置条件(Pre-condition)。

  Post-Condition:

  一旦通过前置条件的校验,方法必须执行,并且必须确保执行结果符合契约,这称之为后置条件(Post-condition)。

  Invariant:

  对象本身有一套对自身状态进行校验的检查条件,以确保该对象的本质不发生改变,这称之为不变式(Invariant)。

  以上是单个对象的约束条件。为了满足LSP,当存在继承关系时,子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松;而子类中方法的后置条件必须与超类中被覆盖的方法的后置条件相同或者更为严格

继承并且覆盖超类方法的时候,子类中的方法的可见性必须等于或者大于超类中的方法的可见性,子类中的方法所抛出的受检异常只能是超类中对应方法所抛出的受检异常的子类。

四 依赖倒置原则

DIP原则其实强调的是:不要让不经常发生变化的部分去依赖于经常发生变化的部分。

微软实现了MDD层,留下接口给PDD层实现,就像,底层依赖上层,而不是上层依赖底层,因为上层经常发生变化,另外上层的移植性也强于底层,底层正好相反,不同的系统,不同的硬件都得修改

因为一旦经常发生变化的那部分发生了变化,那不经常发生变化的那部分也要随之变化。这是不合理的设计。更坏的情况是,违反DIP的设计会使你的高层模块很难在不同的场合在被重用,因为此时高层模块的工作是依赖于底层模块的,这种依赖性使高层模块很难独立开来。

五 接口隔离原则

使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。
二、举例说明:
参考下图的设计,在这个设计里,取款、存款、转帐都使用一个通用界面接口,也就是说,每一个类都被强迫依赖了另两个类的接口方法,那么每个类有可能因为另外两个类的方法(跟自己无关)而被影响。拿取款来说,它根本不关心“存款操作”和“转帐操作”,可是它却要受到这两个方法的变化的影响。



那么我们该如何解决这个问题呢?参考下图的设计,为每个类都单独设计专门的操作接口,使得它们只依赖于它们关系的方法,这样就不会互相影了!




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: