1 单一职责原则
单一职责原则(Single Responsibility Principle, SRP).一个类只有一个引起它变化的原因,简单的讲就是一个类只做一件事。如果一个类有一个以上的职责,这些职责会耦合在一起,当一个职责发生变化时,可能会影响其他的职责。准守单一职责原则,每个类都有比较单一的职责,这就是高内聚,低耦合。单一职责原则的难点在于职责的划分会依靠个人的经验来界定。
在Android的Volley框架中,HttpStack只有performRequest()一个方法,它的职责是执行网络请求并返回Response。如果把Response的解析等工作也放在这个类中,那么就违背了单一职责原则。但是单一职责原则不是说类中只有一个函数,而是说这个类中的函数所做的工作是高度相关的。
优点:
- 类的复杂度降低
- 可读性提高
- 可维护性提高
- 变更引起的风险降低
缺点:
- 职责的界定依靠个人主观性
2 里氏替换原则
面向对象的语言的三大特点是封装、继承、多态。里氏替换原则就是依赖继承、多态这两大特性。里氏替换原则表示所有用基类、接口的地方都可以使用其子类来代替,也就是说确保超类所有的性质在子类中都能成立。然而又子类的地方,父类就不一定能适应了。
在Volley框架中,我们需要将定义好的Request放入到请求队列RequestQueue中, 而在RequestQueue的add()函数中,参数是StringRequest、JsonRequest等类的基类Request, 即任何父类出现的地方都可以用子类来代替。这样保证了程序的可扩展性,当有一个新的需求,如Gson解析时,只需要重新定义一个新的GsonRequest类,加入请求队列RequestQueue中就可以了。
优点:
- 基类代码共享
- 易于扩展
- 提高产品与项目的开放性
缺点:
- 继承是侵入性的。只要继承,就必须继承父类所有的属性和方法。
- 增强了耦合性。当父类中的属性或方法改变时,必须考虑子类的修改。
3 依赖倒置原则
依赖倒置原则就是要依赖于抽象,不要依赖于具体。简单的话说就是要求对抽象进行编程,不要对实现进行编程,这就降低了客户与模块之间的耦合。模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系。
还是上边Request的例子,请求队列RequestQueue的add()函数的参数是Request超类。在进行网络请求时,HttpStack有两个子类: HttpClientStack 、HurlStack, 而在定义请求队列时的参数是超类HttpStack,然后可以根据不同的版本情况选择不同的子类(实现类)。
优点:
- 可扩展性好
- 降低耦合度
4 开闭原则
开闭原则,即对扩展开放,对修改关闭。当软件发生变化时,我们应尽量通过扩展的方式来实现变化,而不是修改已有的代码。
在进行网络请求时,服务器返回的数据有不同的格式,有String类型、XML类型、Json类型、图片等等。Volley的Request符合开闭原则。Volley没有对不同的返回值修改原有的解析函数,而是扩展不同的类,如StringRequest、JsonRequest来解析不同的返回类型。
优点:
- 增加稳定性
- 增加可扩展性
5 接口隔离原则
接口是我们设计时对外提供的契约,通过分散定义多个接口,可以预防未来变更的扩散,提高系统的灵活性和可维护性。
要求在接口中尽量少公布public方法,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问。
接口是对外的承诺,承诺地越少对系统开发越有利,变更的风险也就越少,同时也有利于降低成本。
优点
- 降低耦合度
- 隐藏实现细节
- 提高代码可读性
6 迪米特原则
迪米特原则又称最少知识原则,虽然名字不同,但描述的同一个原则,一个对象应该对其他对象有最少的了解。通俗的讲,一个类应该对自己需要耦合或调用的类知道的最少。类的内部如何实现、如何复杂都与调用者或者依赖者没有关系,调用者或者依赖者值需要知道它需要的方法即可,其他一概不关心。
类和类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
迪米特原则还有一个英文解释: Only talk with immedate friend(只与直接朋友通信).当一个对象与其他对象有耦合关系时,两个对象之间就会成为朋友关系。
优点:
- 低耦合
- 降低复杂度
- 增加稳定性