前言:
大家都知道,设计模式除了常用的23种设计模式以外,还有非常重要且经典的6大原则:
-
单一职责原则
-
里氏替换原则
-
依赖倒置原则
-
接口隔离原则
-
迪米特原则
-
开闭原则
这六大原则是那些著名的程序员经过相当长的一段时间的开发经验总结出来的,遵循这六大原则,能够潜移默化地改变着我们的思维,能够帮助我们码出高可扩展、高可维护性的优秀代码,能提高代码的可阅读性,保证了代码的可靠性。所以想要作为一名合格,优秀的程序猿,一定要掌握这六大开发原则,并运用到平时的代码开发中。下面分别介绍一下这六大原则。
-
单一职责原则
每个类/接口/方法都应该有一个单一的功能。单一职责原则适用的范围有接口、方法、类。按大家的说法,接口和方法必须 保证单一职责,类就不必保证,只要符合业务就行。
设计接口/方法的时候,一定要规范的按照功能逻辑来开发这几,做到一个接口/方法只做一件事,杜绝将几种功能逻辑封装到同一个接口/方法中,然后通过判断参数去执行不同的功能。
而对于类来说,一个类应该是负责一个实体的行为,或同类实体的一方面行为,不能将不同类的不同行为封装到一个类中,那样阅读性非常差,扩展性也很差。
优点:
1. 降低了类的复杂性,各个类/接口/方法职责都清晰明确的分开了
2. 提高了代码的可读性和可维护性。
3. 代码改变引起的风险降低, 一个接口/方法的修改基本上只会影响到其自身的实现类或调用类,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助
-
里氏替换原则
子类型必须能够替换它们的基类型。一个软件实体如果使用的是一个基类,那么当把这个基类替换成继承该基类的子类,程序的行为不会发生任何变化。软件实体察觉不出基类对象和子类对象的区别。
简单来说就是父(父类)子(继承类)关系中。儿子要会父亲的所有的东西,儿子活得再烂也要有父亲的水平。并且父亲会的,儿子不能搞创新改变父亲的东西,如果想搞创新,那么自己新写方法来实现自己的能力。
优点:
1. 子类可以形似父类,但又异于父类,“龙生龙,凤生凤,老鼠生来会打洞” 是说子拥有父的“种”
2. 代码共享,减少重新创建并实现重复功能的工作量,提高代码的重用性(每个子类都拥有父类的方法和属性)
3. 提高代码的可扩展性,实现父类的方法后不但继承了父亲的本领,还可以自己自由创作。很多开源框架的扩展接口都是通过继承父类来完成的
4. 提高产品或项目的开放性。
缺点:
1. 继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
2. 降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界 中多了些约束;
3. 增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。
-
依赖倒置原则
抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
依赖倒置原则可以实现多样性。例如统一用接口“鸟”作为参数,统一调用“鸟”的fly方法,但是传入的则是鸵鸟,企鹅,燕子等不同的具体实例,那么fly的表现形式就不同了,但是你又不需要修改调用代码,因为你是根据接口编程的。
再比如下面这张图:
第一种实现方式的缺点是:Mother只能阅读Book,如果想要看报或者其他类型的书籍就看不了了
第二种实现方式是应用了 依赖倒置原则,我们可以看到,我们只要传一个实现了IReader接口/抽象类的类并实现接口方法或抽象方法,然后将实体传给Mother就行了,提高了扩展性。
优点:
1.当需求变更的时候,可以很灵活的进行扩展,而不用破坏开闭原则。
还有,要实现依赖倒置原则,要有『面向接口编程』这个思维,掌握好这 个思维后,就可以很好的运用依赖倒置
-
接口隔离原则
建立单一接口,不要建立庞大臃肿的接口,尽量根据实际情况,具体业务具体分析,细化接口,接口中的方法尽量少。
接口隔离原则跟单一职责原则很像,都是为了精细化管理,将功能尽可能的细化。这样,当某个功能出现问题的时候,可以快速的定位问题,并且在最小范围内修复,功能的扩展也是一样的。但是,接口也不能无限的小,那样会产生大量的接口,造成设计过于负责。
-
迪米特原则
一个软件实体应当尽可能少地与其他实体发生相互作用。,类的内部如何实现、如何复杂都与调用者或者依赖者没关系,调用者或者依赖者只需要知道他要调用的方法即可,其他的一概不关心。简单来说就是:不要和“陌生人”说话、只与你的直接朋友通信
优点:
1.迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系,简称高内聚,低耦合
-
开闭原则
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。开闭原则可以在保证我们代码的质量的前提下,实现功能的扩展,减少开发难度。
开闭原则放最后来介绍是有原因的,细心的同学仔细想想,只要前面五种原则都遵循了,那么开发出来的代码自然就遵循了开闭原则
总结:
-
单一职责原则告诉我们实现类要职责单一
-
里氏替换原则告诉我们不要破坏继承体系
-
依赖倒置原则告诉我们要面向接口编程
-
接口隔离原则告诉我们在设计接口的时候要精简单一
-
迪米特原则告诉我们要降低耦合
-
开闭原则是总纲,告诉我们要对扩展开放,对修改关闭
这篇文章要是对你有帮助的话,记得点个赞!