单⼀职责原则 (Single Responsibility Principle)
定义:顾名思义,单⼀职责的原则是说⼀个类直负责⼀项职责(操作)。如果⼀个类负责多个职责,其中⼀项职责发⽣变化就需要修改整个类,这可能会导致其他的职责运⾏错误。⼀个类,只应该有⼀个引起它变化的原因。其优点有:
可以降低类的复杂度,⼀个类只负责⼀项职责,其逻辑肯定要⽐负责多项职责简单的多;提⾼类的可读性,提⾼系统的可维护性;
变更引起的风险降低,变更是必然的,如果单⼀职责原则遵守的好,当修改⼀个功能时,可以显著降低对其他功能的影响。
⾥⽒替换原则 (Liskov Substitution Principle)
定义:⾥⽒替换的意思是说所有引⽤基类的地⽅必须能透明地使⽤其⼦类的对象。这种情况在代码中随处可以,我们在类中使⽤基类进⾏定义,⽽在运⾏时使⽤⼦类对象,为了确保代码运⾏正常,在实现⼦类时要注意以下⼀些地⽅:
⼦类可以实现⽗类的抽象⽅法,但不能覆盖⽗类的⾮抽象⽅法;⼦类中可以增加⾃⼰特有的⽅法;
当⼦类的⽅法重载⽗类的⽅法时,⼦类⽅法的输⼊参数要⽐⽗类⽅法的输⼊参数更宽松;
依赖倒置原则 (Dependence Inversion Principle)
定义:抽象不应该依赖于细节,细节应当依赖于抽象。换⾔之,要针对接⼝编程,⽽不是针对实现编程。依赖倒置原则要求我们在程序代码中传递参数时或在关联关系中,尽量引⽤层次⾼的抽象层类,即使⽤接⼝和抽象类进⾏变量类型声明、参数类型声明、⽅法返回类型声明,以及数据类型的转换等,⽽不要⽤具体类来做这些事情。依赖倒置原则的本质就是通过抽象(接⼝或抽象类)使各个类或模块的实现彼此独⽴,不互相影响,实现模块间的松耦合。在编写代码中落到实处,需要注意以下⼀些地⽅:
每个类尽量都有接⼝或抽象类,或者抽象类和接⼝两者都具备;变量的表名类型尽量是接⼝或者抽象类;尽量不要覆写基类的⽅法;结合⾥⽒替换原则使⽤。
由于 Python 是⼀门动态语⾔,在传递参数时不需要定义具体类型,所以依赖倒置原则其实⼀定程度上已经内嵌在了 Python 语⾔中。
接⼝隔离原则 (Interface Segregation Principle)
接⼝隔离原则提⽰我们客户端不应该依赖它不需要的接⼝,⼀个类对另⼀个类的依赖应该建⽴在最⼩的接⼝上。根据接⼝隔离原则,当⼀个接⼝太⼤时,我们需要将它分割成⼀些更细⼩的接⼝,使⽤该接⼝的客户端仅需知道与之相关的⽅法即可。每⼀个接⼝应该承担⼀种相对独⽴的⾓⾊,不⼲不该⼲的事,该⼲的事都要⼲。
看到这⾥你们或许认为接⼝隔离原则与单⼀职责原则是相同的。其实接⼝隔离原则与单⼀职责原则的审视⾓度是不相同的,单⼀职责原则要求的是类和接⼝职责单⼀,注重的是职责,这是业务逻辑上的划分,⽽接⼝隔离原则要求接⼝的⽅法尽量少。在使⽤接⼝隔离原则时,我们需要注意控制接⼝的粒度,接⼝不能太⼩,如果太⼩会导致系统中接⼝泛滥,不利于维护;接⼝也不能太⼤,太⼤的接⼝将违背接⼝隔离原则,灵活性较差,使⽤起来很不⽅便。⼀般⽽⾔,接⼝中仅包含为某⼀类⽤户定制的⽅法即可,不应该强迫客户依赖于那些它们不⽤的⽅法。
迪⽶特原则 (Law of Demeter)
定义:⼀个对象应该对其他对象有最少的了解。通俗地讲,⼀个类应该对⾃⼰需要耦合或调⽤的类知道得最少,你(被耦合或调⽤的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的公开⽅法,我就调⽤这么多,其他的我⼀概不关⼼。迪⽶特法则指导我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发⽣任何直接的相互作⽤,如果其中的⼀个对象需要调⽤另⼀个对象的某⼀个⽅法的话,可以通过第三者转发这个调⽤。简⾔之,就是通过引⼊⼀个合理的第三者来降低现有对象之间的耦合度。可以看到迪⽶特原则在代理模式和外观模式中都有被使⽤。
开闭原则 (Open Closed Principle)
定义:软件实体应该对扩展开放,对修改关闭,其含义是说⼀个软件实体应该通过扩展来实现变化,⽽不是通过修改已有的代码来实现变化。根据开闭原则,在设计⼀个软件系统模块(类,⽅法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。遵循开闭原则的系统设计,可以让软件系统可复⽤,并且易于维护。这也是系统设计需要遵循开闭原则的原因:
稳定性:开闭原则要求扩展功能不修改原来的代码,这可以让软件系统在变化中保持稳定。
扩展性:开闭原则要求对扩展开放,通过扩展提供新的或改变原有的功能,让软件系统具有灵活的可扩展性。
因篇幅问题不能全部显示,请点此查看更多更全内容