面向对象的设计原则

1.单一职责原则
    一个类,最好只做一件事,只有一个引起它变化的原因。
    一个类只有一个引起它变化的原因,否则就应当考虑重构。
    单一职责原则,由引起变化的原因决定,而不由功能职责决定。虽然职常常是引起变化的轴线,但是有时却未必,应该审时度势。
    测试驱动开发,有助于实现合理分离功能的设计。
    可以通过Facade模式或Proxy模式进行职责分离。
    一个类,应该仅有一个引起它变化的原因,不要将变化原因不同的职责封装在一起,而应该隔离。


2.开闭原则

    对扩展开放,对修改关闭。
    实现开闭原则的关键是抽象化,并且从抽象化导出具体实现。
    开闭原则是面向对象设计的主要目标。


3.里氏代换原则

    在使用基类和抽象类的地方,都可以用其子类或实现了该接口的类替换。
    里氏代换原则是继承复用的基石,所有支持继承复用的语言都满足里氏代换原则


4.依赖倒转原则

    要依赖于抽象,不要依赖于具体。
    要针对抽象编程,不要针对实现编程。
    要针对抽象编程的意思是:应当使用抽象和接口进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型的转换等。
    不要针对实现编程的意思是:不应当使用具体类进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型转换等。
    要保证做到这点,一个具体的类应当只实现接口和抽象类中声明的方法,而不应当给出多余的方法。这个比较难。一个具体类总有自己独有的方法。
    倒转依赖强调一个系统内的实体之间关系的灵活性。基本上,如果设计师希望遵守开闭原则,那么依赖倒转原则便是达到要求的途径。
    里氏代换原则是是依赖倒转原则的基础。
    依赖倒转原则是面向对象设计的核心原则,设计模式的研究和应用是以依赖倒转原则为指导原则的。

    依赖倒转原则是面向对象设计的主要机制。


5.接口隔离原则
    使用多个专门的接口比使用单一的总接口要好。
    一个类对另一个类的依赖性应当建立在最小的接口上。

    准确而恰当地划分角色以及角色对应的的接口,是面向对象设计的一个的组成部分。将没有关系的接口合并在一起,形成一个臃肿的大接口,是对角色和接口的污染。


6.合成/聚合复用原则
    意思:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。

    要尽量使用合成/聚合,尽量不使用继承。


7.迪米特法则
    又叫做最少知识原则,就是说,一个对象应当对其他对象有尽可能少的了解。
    优先考虑将一个类设置成不变类。
    尽量降低一个类的访问权限。
    谨慎使用序列化。
    尽量降低成员的访问权限。


什么时候使用继承复用:
    只有当以下Coad条件满足时,才应当使用继承关系:
    1.子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分“Has a”和“Is a”两种关系的不同。Has-A关系应当使用合成/聚合关系描述,而只有Is-A关系才符合继承关系。
    2.永远不会出现需要将子类换成另一个子类的情况。如果设计师不是很肯定一个类会不会在将来变成另一个子类的话,就不应当将这个类设计成当前这个超类的子类。
    3.子类具有扩展超类的责任,而不是具有转换掉(Override)或注销掉超类的责任。如果子类需要大量地转换掉超类的行为,那么这个子类不应当成为这个超类的子类。

    4.只有在分类学角度上有意义时,才可以使用继承,不要从工具类继承。里氏代换原则是可否使用继承关系的准绳。上面的Coad条件以比里氏代换原则更加通俗易懂的方式讲解了继承关系的使用。Coad条件的表达不如里氏代换原则严格,但是一般而言,凡是不符合Coad条件的均不会满足里氏代换原则。


优先使用(对象)组合,而非(类)继承(Favor Composition Over Inheritance)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值