单一职责原则
这个原则强调的是“当设计一个类时,该类就应该只负责一件事”。
一个类最好只负责一个功能的实现,但是具体的功能如何划分和归属呢?随着程序开发的进度不断深入,一个功能也可能增加新的子功能,单个类负责太多的功能实现,会导致类难以维护,也会使人难以了解类的主要功能,最后可能会导致:让整个项目都过度依赖这个类,让这个项目或者类失去弹性(不够灵活)。
通过不断的“类重构”,将类中与实现相关的功能的部分抽取出来,另外封装成新的类,之后再通过组合的方式加入到类中,就能慢慢符合类的单一职责化的要求,也就是项目中的每一个类只负责单一功能的实现。
举例
小明建了一个西瓜类,一开始只有西瓜的产地,品种,甜度等属性信息,后来随着项目的需要,又陆续为其添加了切西瓜,勺子舀西瓜,西瓜拼盘等不同吃法,这时最好将吃西瓜这个动作单独作为一个类抽象封装出来,让这个类加到原来的西瓜类中当一个成员或者属性,这样更容易维护。
开闭原则
这个原则强调的是“对扩展开放,对修改关闭”,意思就是说,如果你想加新功能,最好不要修改之前的类(除非是修正错误),而是设计时就将功能接口化,将一些类的操作方法向上提升,抽象化为接口,将功能的实现下移到子类中,有什么新功能增加子类就行了。
举例
小明的西瓜不仅要吃,还要喝,小明想增加西瓜汁的喝法,虽然按照单一职责原则可以创建一个喝西瓜的类,但是还是要把对象加到西瓜类里,才能关联起来,不妨为吃喝西瓜设置一个父类:享用西瓜类,让吃喝变为两个子类,让享用类与西瓜关联,这样以后再有什么西瓜的玩法,甚至做奥利给西瓜,都能直接添加子类了。
里氏替换原则
这个原则强调的是“子类必须能够替换父类”,父类通常是接口类或者可被继承的类,父类中一定包含了可被子类重新实现的方法,而客户端使用的操作接口当然也是走父类的接口函数,客户端不应该知道,自己使用的对象到底是哪个子类,这与开闭原则实际上是相向而行的。
举例
客户端弄到了一个好吃的大西瓜,这个西瓜内部带了一个勺子(关联的吃西瓜的子类是用勺子吃类),但是客户端不知道,客户端只知道自己要吃西瓜,但其实吃的时候顺其自然拿起了勺子。
依赖倒置原则
这个原则强调的是“高层模块不应该依赖于低层模块,两者都应该依赖于抽象概念。”
以及“抽象接口不应该依赖实现,实现应该依赖抽象接口”
一般来说,生活中有很多高层依赖低层的例子,例如组装汽车的时候,汽车的组建依赖各个低层模块的相互配合,加油的时候加什么种类的油自己说了不算,得引擎模块说了算,这就是依赖了低层模块。
而计算机规定,你只有正确规格的usb接口,才能连接到主机上,所以所有移动设备usb的连接线都遵循了这一个要求,而这次是计算机(高层模块)说了算,就属于依赖倒置了,同时实现也依赖了抽象接口。
接口隔离原则
这个原则强调的是“客户端不应该被迫使用他们用不到的接口方法。”
当一个类负责主要功能,就会随着时间累积而增加许多接口方法,而客户端则必须小心翼翼的使用其中的方法,因此,必须通过一些方法减少不必要的接口方法出现在类中。
网友评论