点滴感悟与总结!
1.单一职责原则:一个对象一个只包含单一的职责,并且该职责被完整的封装在一个类中(尽量降低系统耦合)
(实现高内聚,低耦合的指导方针)
分析:一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而一个类承担的职责越多,相当于将这些职责耦合在一起,当其中一个职责发生变化的时候会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责分装在不同的类中,如果多个职责总是发生改变,则可将他们封装在同一类中
2.开闭原则:软件实体应该对扩展开发,对修改关闭(尽量在不修改原有代码的基础上进行扩展)
(可复用的基石)
分析:定义一个相对稳定的抽象层,而将不同的实现行为转到实现层中完成,方便复用与扩展
3.里氏代换原则:所有引用基类的地方必须能够透明的使用其子类对象
(实现开闭原则的重要方式之一)
分析:里氏代换原则表明:在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实题使用的是一个子类对象,那么它不一定能够使用基类对象,所以为了符合里氏代换原则我们应该:在程序中尽量使用基类对象来进行定义,而在运行时再确定其子类类型,用子类对象来代替父类对象,比如将父类设计为抽象类或者接口,让子类基础父类或者实现父类接口,并实现在父类中声明的方法,在运行时子类实例替换父类实例,可以很方便的扩展系统功能,无须修改原有子类的代码,增加的新功能可以通过一个新的子类实现
4.依赖倒转原则:高层模块不应该依赖低层模块,他们都应该依赖抽象,抽象不应该依赖细节,细节应该依赖抽象(就是要求针对接口编程,而不是针对实现编程)
分析:依赖倒转原则要求在代码中传递参数或者关联关系中尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明,参数类型声明,方法返回类型声明以及数据类型转换等,而不要用具体类来做这些事情
在引入抽象层后,系统将具有很好的灵活性,在程序中尽量使用抽象层进行编程,而将具体类写在配置文件中,这样如果系统的行为发生变化,只需要对抽象层进行扩展,并修改配置文件,而无需修改原有的系统代码,在不修改的情况下扩展系统功能,满足开闭原则的要求
在实现依赖倒转原则时需要针对抽象层进行编程,而将具体类的对象通过依赖注入的方式注入到其他对象当中,依赖注入是指当一个对象要与其他对象发生依赖关系时采用抽象的形式来注入锁依赖的对象,常用的注入方式有3种,分别是构造注入,设值注入和接口注入,构造注入是通过构造函数来传入具体类的对象,设值注入是通过setter方法来传入具体类的对象,而接口注入是指通过在接口中声明业务的方法来传入具体类的对象,这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象
5.接口隔离原则:客户端不应该依赖那些它不需要的接口
分析:根据接口隔离原则,当一个接口太大时需要将他分割成一些更细小的接口,使用该接口的客户端仅需指导与之相关的方法即可,每一个接口承担一种相对独立的角色,不干不该干的事,该干的事都要干
这里接口含义的定义有两种:
1).指一个类型所具有方法特征的集合,逻辑上的抽象
2).指某种语言具体的接口,比如java
当理解成第一种含义时,可以把接口理解为角色,即每个角色都有它特定的一个接口,此时该原则可以叫做角色隔离原则
当理解成第二种含义时,就是为客户端提供尽可能小的单独接口,因为实现一个接口需要实现该接口中定义的所有方法,因此大的接口使用起来不一定方便,接口应该尽量细化,接口中的方法也应该尽量少,每个接口中只包含一个客户端所需的方法即可,这种机制也叫做定制服务
6.合成复用原则:优先使用对象组合,而不是通过继承来达到复用的目的
分析:在面向对象的设计中可以通过两种方法在不同的环境中复用已有的设计和实现,即通过组合/聚合或通过继承,但应该首先考虑组合/聚合,组合/聚合可以使系统更加的灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对比较小,其次才考虑继承,在使用继承时要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此要谨慎使用继承复用
7.迪米特法则:每一个软件单位对其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
(降低单位间通信的宽带与深度)
分析:迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用,如果一个系统符合迪米特发则,那么当其中一个模块发生修改时就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间的通信限制,迪米特法则就是要降低系统的耦合度,保持类与类之间松散的耦合关系
如果一个对象必须要调用另一个对象的方法,可以通过第三者转发这个调用,简而言之,就是通过引入一个合理的第三者来降低现有对象间的耦合度(中间件)
需要注意的地方:
1.在类的划分上,应该尽量创建松耦合的类,这样改类被修改时对关联的类不会造成太大的影响
2.在类的结构设计上,每个类都应该降低其成员变量和成员函数的访问权限
3.在类的设计上,一个类应该设计成不变类
4.对其他类的引用上,一个对象对其他对象的引用应该降到最低
总结:7大发则,归根结底还是要实现高内聚低耦合,方便复用与扩展。。。。。
目前没有大型项目的经验,对7大法则的理解还比较浅显(2019/03/15)