持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
简介
面向对象设计原则也是我们在学习设计模式的基础,在开发过程中使用这些原则能够提高软件的可维护性以及可复用性,也能使系统更加灵活可用。
单一职责原则
单一职责即是一个对象应该只包含单一的职责,而且该职责必须完整的被包装在一个类中,也就是说一个类的内容定义应该只包含该类所需执行的业务,其他的业务应由其他类去处理。
一个类承担的职责越多,那么这个类被复用的可能就越小,因为它做承担的业务内容多,正常情况下仅有少量业务代码能够被复用,如果遇到这种情况可能就需要做适当的拆分,使可复用的业务独立一个类出来。
开闭原则
开闭原则既是一个实体类或接口对外开放,而本身的属性直接修改操作则对外关闭。也就是说在一个业务模块设计时,应该使这个模块的基本属性不被修改的情况下能够进行扩展。
在面向对象编程中,通常开发人员都会对系统业务进行抽象化的设计,为了满足开闭原则,仅需对外提供抽象接口,调用者不需要知道抽象接口具体的实现内容是什么,只需关注抽象接口的使用即可。
里氏替换原则
里氏替换原则表示如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为依然没有发生变化,那么类型S是类型T的子类型。换一种简单的说法就是能够引用父类的地方就能够替换成子类的对象去使用。
里氏替换原则也是实现开闭原则的一种方式,开发过程中往往我们只需根据父类去引用,而不会直接拿子类的实现去引用,而是在程序运行的时候程序再自动确定其子类类型来替换父类对象去执行业务。
依赖倒转原则
依赖倒转原则表示高层模块不应该直接去依赖低层模块,而是依赖抽象接口,抽象不应该依赖细节实现,而细节必须依赖抽象,也就是我们常说的面向接口编程。
开发过程中某个业务代码需要依赖其他业务的抽象类或接口,而不应该依赖其实现类,针对接口进行编程而不是针对具体类编程。这就是我们service层为什么还要有一个service的实现层,开发过程中都是依赖service接口而不直接依赖接口实现类。
接口隔离原则
接口隔离原则表示客户端(调用方)不需要依赖那些不需要的接口,如果一个接口越来越大,那么将需要把该接口划分为几个小接口,哪些接口客户端需要使用则进行依赖,多余的接口就可以排除依赖进行接口隔离。
实质上每个接口应该承担相对独立的一种角色,只做本接口该做的事,其他的事就交给其他接口去处理。往往在开发过程中很多开发人员为了方便会把业务源源不断的往一个接口里面添加,省去了新建接口添加依赖的操作,最终的结果就是许多看似相同实则不同的业务都混在一起,在后期维护过程中往往需要付出更大的代价。可能有的同学又会说那如果一个业务确实代码量就是巨大呢,那么这时候我们还可以针对该业务再进行二次拆分,将业务细化再细化。
合成复用原则
合成复用原则的定义是尽量使用对象组合,而不应该是使用继承来达到复用的目的。
对象的组合能够使系统变得更加灵活,类与类之间的耦合度就会降低许多,一个类中的变化相对其他类造成就影响就会变小,所以通常都应优先使用对象进行组合。也不是说不能使用继承,在使用继承时应严格遵守里氏替换原则来减少系统的复杂度,这样的开发模式也能够让开发者更加容易理解,同时系统的可维护性也会变得更好。
迪米特法则
迪米特法则有另一种叫法称之为最少知道原则,它强调的是不要和“陌生人”说话,只跟朋友说话。在这里朋友指的就是成员变量或者方法的入参出参,就是说不应直接与外部的对象属性进行沟通。
在开发过程中应当尽量创建松耦合的类,降低类鱼类之间的耦合度,这样就能够减少一个类被复用时产生的影响,类设计上应当减少成员变量被外部访问的权限。
总结
面向对象编程中最重要的还是在保证代码可读性的同时,还需要支持代码的可维护性以及可复用性。软件能够被良好的复用即能提高开发效率,提高开发质量同时又能节约开发成本。