低耦合,高内聚
1.单一职责原则
原则思想:一个方法只负责一件事情。
描述:单一职责原则很简单,一个方法一个类只负责一个职责,各个职责的程序改动,不影响其实程序。这是常识,几乎所有程序员都会遵循这个原则。
优点:降低类和类的耦合,降低类的复杂度,提高可读性,增加可维护性和可扩展性,降低可变性的风险。类的方法足够少,也可在方法尚做单一职责原则。
实例:当对db_user_info表进行增删查改的类UserInfoReposiotry,仅对db_user_info操作而不对其他表进行操作;交通工具类A,行驶方法run(),区分飞机和轮船、小汽车,可以将类A改造成A1A2A3,来代表不同三个交通工具,或者在类A新增方法runflg(),runwarter()两个方法。
2.接口隔离原则
原则思想:类和类之间应该建立在最小接口的上
描述:类A通过接口依赖B,类C通过接口依赖D,如果接口类A和类B不是最小的接口,则依赖的类B和类D必须要实现他们不需要的方法。
优点:提高程序的灵活度,提高内聚,减少对外交互,使得最小的接口做最多的事情。
实例:接口A有方法a/b/c/d/e,实现类B和实现类C实现接口A功能点,类M依赖类B执行方法a/b/c,类N依赖类C执行方法a/d/e,这违法了接口隔离原则,改造方法是将接口A拆分成,接口A1实现a,接口A2实现b/c,接口A3实现d/e,实现类B实现接口A1A2,实现类C实现接口A1A3,类N依赖接口A1A2,类M依赖接口A1A3;(单继 承,多现实)
3.依赖倒置原则
原则思想:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象(抽象类或接口),抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
描述:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
优点:可以减少需求变化带来的工作量,做并行开发更加友好。
实现:类Person有receive方法接收类Email,类Email有接收Email消息方法getInfo,当需要接收手机消息,改动很大;采用依赖倒置原则改造,新增接口IRecevice有方法getInfo方法,类Email实现getInfo方法,而类Person与接口IRecevice耦合,把IRecevice当做参数,当需要新增其他消息类型,则实现接口IRecevicec并实现getInfo方法;(面向接口编程 ,变量引用和实际对象有缓冲层)
4.里氏替换原则
原则思想:使用的基类可以在任何地方使用继承的子类,完美的替换基类。
描述:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类可以增加持有的方法,子类中可以增加自己持有的方法。
优点:增加程序的健壮性,即使增加了子类,原有的子类可以继续运行,互不影响。
理解:A类与B类大体相同属性和方法,可以提取公共属性和方法到Base类当中,该原则主要运用于OO中继承关系;总结来说,所有引用基类的地方必须能透明地使用其子类的对象,在子类中尽量不要重写父类的方法;
5.开放封闭原则(OCP)
原则思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化。
描述:一个软件产品在生命周期内,都会发生变化,既然变化时一个既定的事实,我们就应该在涉及的时候尽量适应这些变化,以提高项目的稳定性和灵活性。
优点:单一原则告诉我们,每个类都有自己负责的职责,里氏替换原则不能破坏继承关系的体系。
理解:一个软件实体如类,模块和函数应该对扩展开发(对提供方),对修改关闭(对使用方)。用抽象构建框架,实现扩展细节;当软件需要变换时,尽量通过扩展软件实体的行为来实现变换,而不是通过修改已有代码来实现;
实例:绘制图类A,拥有根据不同图片绘制不同图形的方法,把不同图形类DBC当做方法参数进行传参判断类型后,调用对应方法绘制图形,违反了OCP原则,需要将图形抽象成抽象图形类Shape,不同图形ABC继承抽象图形类,实现绘制抽象方法draw,绘制图类A与抽象图形类Shape耦合,把不同图形类ABC作为参数,实现绘制方法绘制不同图片;
最基础
6.迪米特法则
原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦
描述:一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。
优点:低耦合,高内聚。
理解:最少知道原则,只与“直接朋友”通信;直接朋友,成员变量,方法参数,方法返回值中的类为直接朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部;降低类与类的耦合,减少陌生朋友类的依赖;
7.合成复用原则
原则思想:尽量使用合成/聚合的方式,而不是使用继承;
理解:多使用组合和聚合,少用继承关系;