六大基本设计原则:
1、单一职责原则
2、里氏替换原则
3、依赖倒置原则
4、接口隔离原则
5、迪米特原则
6、开闭原则
单一职责原则(Srp)
定义:应该 有且仅有一个原因引起类的变更。即单一职责原则要求一个接口或类只有一个原因引起变化,也就是一个接口或类只有一个职责,他就负责一件事情。
职责是很难定义的一个概念 ,我们把握一个度,就是合理的划分职责,不能耦合度 太强,也不能拆分的类太多。(原则是死的,人是活的)
好处:
1、类的复杂性降低,实现什么职责都有清晰明确的定义;
2、可读性提高;
3、可维护性提高;
4、变更引起的风险降低,变更是必不可少的的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他接口无影响,这对系统的扩展性、维护性都有非常大的帮助。
里氏替换原则
定义:只要父类出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本不需要 知道父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
在面向对象的语言中,继承是必不可少;
继承的优点为:
1、代码共享,减少创建的类的工作量,每个子类都拥有父类的方法和属性;
2、提高代码的重用性;
3、子类可以形似父类,但又异于父类;
4、提高代码的可扩展性;
5、提高产品或者项目的开放性
缺点:
1、继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
2、降低了代码的灵活性。子类 必须拥有父类的属性和方法,让子类的自由世界中多了些约束;
3、增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改 ,而且在缺乏规范的环境下,这种修改可能让大段2的代码需要重构;
依赖倒置原则(大项目必须)
定义:
1、高层模块不应该依赖低级模块,两者都应该依赖其抽象;
2、抽象不应该依赖细节;
3、细节应该依赖抽象;
高层模块和低级模块的定义:每一个逻辑的实现都是由原子逻辑组成的,不可分割的 原子逻辑就是低级模块,原子逻辑再组装就是高级模板;
抽象:指接口或抽象类,两者都是不能直接被实例化的;
细节:细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以被实例化,也就是可以加上一个关键字 new产生的 一个对象。
依赖倒置原则的表现:
1、模块间的依赖 通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系就是通过接口或者 抽象类产生的 ;
2、抽象或实现类不依赖于实现类;
3、实现类依赖接口 或抽象类;
也就是面向接口编程;
依赖倒置的本质就是通过抽象(接口或抽象类),使各个类或模块实现彼此独立,不相互影响,实现真正的松耦合;
在项目中的体现:
1、每个类尽量都有接口或实现类 ,或者抽象类或接口两者都具备;
2、变量的表面类型尽量是接口或抽象类;
3、任何类都不应该从具体类派生;
4、尽量不要覆写基类的方法 ;
5、即合理实体化原则使用;
接口隔离原则
接口类型:
1、实例接口:在 Java中声明一个类,然后用new关键字产生一个实例,,他是对一个类型的事物的描述,这是一种接口;例如你定义了一个Person类,然后使用Person zhangsan = new Person();产生一个实例,这里Person类就是zhangsan 的接口;
2、类接口:Java中经常使用的interface关键字定义的接口;
隔离定义:
1、客户端不应该依赖它不需要的接口;依赖它需要的接口客户端需要什么接口就 提供什么接口,把不要的接口剔除掉,这就需要对接口进行细化,保证其纯洁性;
2、类间的依赖关系应该建立在最小的接口上;它是要求接口最小 ,也是要求接口细化,接口纯洁;
即建立单一接口,不要建立臃肿庞大的接口,通俗来讲就是接口尽量细化,同时接口中的方法尽量的少;单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑的划分。而接口隔离原则要求的是接口的方法尽量的少,注意区分。
最佳实践:
接口隔离原则是对接口的定义,同时也是对类的定义,接口 和类尽量使用原子接口和类;
1、一个接口只服务于一个子模块或业务逻辑;
2、通过业务逻辑压缩接口中的public方法
3、已经被 污染了的接口,尽量去修改,若变更的风险较大,则采用适配器模式进行转化处理;
4、了解环境,拒绝盲从不要盲目的模仿网上的代码,要深入了解逻辑,设计出最好的接口。
迪米特法则
定义:一个对象应该对其他对象 有最少的了解,通俗来讲,一个类应该对自己需要耦合或 调用的类知道的最少,被耦合或调用的类的内部是如何复杂和我没有关系;
1、只与直接的朋友交流:
迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了之后 ,类的复用率才可以提高。
开闭原则
定义:
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭;(一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化)
软件实体包括:
1、项目或软件产品中按照一定的逻辑规则划分的模块
2、抽象和类
3、方法