面向对象编程原则

  1. 单一职责原则
  2. 开闭原则OCP:模块应该对扩展开放,但是对修改关闭。

例如需要调用各种类型的传感器进行状态检查。面向对象方法可以设计为父类Sensor作为对外的接口:read();enable();disable(),然后子类是各种具体的传感器,子类中重写这些方法。当需要添加新的传感器时,只需要增加新的子类,父类不用修改,对外的接口不变。不会影响其它传感器的功能。如果是面向过程方法,比较好的的方法是,实现一个调度函数,里面根据不同的传感器类型,调用对应的传感器处理函数。但是这样每次增加传感器都需要修改这个调度函数,修改不当时可能会导致这个调度函数的功能不正常,影响其它传感器的工作。

3、liskov里氏替换原则(LSP):子类可以替换它们的父类。面向对象的设计关注的是对象的行为,它是使用“行为”来对对象进行分类的,只有行为一致的对象才能抽象出一个类来。我经常说类的继承关系就是一种“Is-A”关系,实际上指的是行为上的“Is-A”关系,用“Act-As”来描述更合适。从属性上来讲正方形是一种长方形,但是如果有一个方法是画长宽比是2:1的长方形,那么这个方法显然不适用于正方形。所以正方形不能作为长方形的子类。里氏替换原则目的就是要保证继承关系的正确性。我们在实际的项目中,是不是对于每一个继承关系都得费这么大劲去斟酌?不需要,大多数情况下按照“Is-A”去设计继承关系是没有问题的。只有极少的情况下,需要你仔细处理一下。这类情况对于有些开发经验的人,一般都会觉察到,是有规律可循的。最典型的就是使用者的代码中必须包含依据子类类型执行相应的动作,就说明违反了里氏替换原则。

4、依赖倒置原则(Dependence Inversion Principle,DIP)是客户模块要依赖于抽象接口,不要依赖于具体实现。上面OCP的例子也适用于这里。建议除了is-a不要使用继承。之所以叫做依赖倒置是因为这里底层组件依赖于高层的抽象。一般的依赖都是由上向下的。比如工厂模式就使用了依赖倒置原则。

5、合成复用原则(Composite Reuse Principle, CRP):尽量使用对象的组合,而不是继承来达到复用的目的。这样降低了类与类之间的耦合性,一个类的变化对其它类造成的影响相对较少。has-a的关系使用组合来表达。通常将新类中嵌入的现有类的对象声明为private。但是如果组合不仅仅是底层设计的一部分,也是问题分析的一部分,那么将嵌入类的对象声明为public将有助于客户端理解和使用类。

6、迪米特法则(Law of Demeter简写为LoD)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,只和你的密友谈话,减少类之间的依赖。比如外观模式就应用了迪米特法则。

7、接口分离原则,对不同的客户端使用独立的接口。为的是当一个客户端有特殊要求而修改接口时,不会影响其它客户端的功能。但是这样重复太多,需要根据实际情况进行斟酌。可以将所有客户端都使用的相同的方法放在父类中,子类中放置为不同的客户端提供的不同的方法。如果有子类有需求修改父类中的方法,则在对应子类中重写这个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值