1.软件设计的整体目标
软件设计的整体目标是可维护性与可复用性,可维护性表示软件能够被理解、改正、适应与扩展。可复用性表示软件能够易于扩展和修改,更易于被复用。设计模式中常见的基本原则主要包括:单一职责原则、开放封闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成复用原则、迪米特法则。
2.单一职责原则
单一职责原则的定义:一个对象应该只包含一个的职责,并且该职责应该被完整地封装在一个类中。
单一职责原则的作用:控制类的力度。如果一个类实现的功能越多,那么它被复用的可能性就越小。例如在一个Car类中定义了很多个接口,现在有另外一个Person类想调用Car类中的某个接口。此时,调用就会很不方便。从另一个角度来说,如果一个类实现的功能越多,各个功能就很有可能耦合在一起。你修改了其中的一个功能也就会引起其他功能的改变。因此,应该将这些功能进行分离,不同的功能封装在不同的类中。最终,这样做才能符合“高内聚、低耦合”的基本要求。
3.开放封闭原则
开放封闭原则的定义:一个软件模块或者一个函数应该尽量在不修改原有代码的基础上进行功能的扩展。
开放封闭原则的作用:由于软件设计过程中需求可能会不断变化,因此也会对原有代码进行不断扩展。假如直接对原有代码进行修改,那么不仅代码冗余、效率低下,还会不利于代码的重构。如果软件设计遵循了开放封闭的原则,那么扩展起来就会比较安全,不会影响到原有的功能。例如:python中的语法糖—装饰器,它的核心思想就是遵循了开放封闭原则。
4.里氏代换原则
里氏代换原则的定义:所有引用基类的地方必须能透明地使用其子类的对象。
里氏代换原则的作用:在软件的设计过程中,使用子类对象来替换基类对象是可以的。但是,如是使用基类对象来替换子类对象则不可以。由于子类继承自基类,基类有的成员方法和成员属性子类都有。但是子类可有新增自己的方法和属性,而新增的方法和属性基类是没有的。尽可能地使用基类类型来对对象进行定义,而在运行时再确定子类类型,然后用子类对象替换基类对象。代码设计时,应该将基类设计为抽象类或接口,子类继承基类并实现在基类中声明的方法。运行时,子类对象替换基类对象,可能很方便的扩展系统功能。
5.依赖倒置原则
依赖倒置原则的定义:高层模块(基类或抽象类)不应该依赖低层模块(子类),它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
依赖倒置原则的作用:依赖倒置原则针对于接口编程,要求在代码中传递参数时,尽量引用层次高的类(即用接口或抽象类来实现声明变量类型、参数类型声明、方法返回类型声明及数据类型转换等,而不要使用具体的类)
6.接口隔离原则
接口隔离原则的定义:客户端不应该依赖那些它们不需要的接口。
接口隔离原则的作用:当一个接口太大时,应该将它们根据需求分割成多个更小的接口,每个接口仅负责一个相对独立的功能。一般而言,在接口中仅包含为某一类用户定制的方法即可。
7.合成复用原则
合成复用原则的定义:优先使用对象组合,而不是通过继承来达到复用的目的。
合成复用原则的作用:在软件设计的过程中,优先使用关联、聚合和组合关系,尽量少用继承。对象组合可以使系统更加灵活,降低类与类之间的耦合程度。
8.迪米特法则
迪米特法则的定义:每个软件单位对其他单位都只有最少的知识,而且局限于那些对本单位密切相关的软件单位。
迪米特法则的作用:一个软件实体应该尽可能少的与其他实体发生相互关系。如果一个系统符合迪米特法则,那么当修改系统中某个功能模块时就会尽量小的影响其他功能模块。因此,在类的设计上应该注意:尽量创建松耦合的类,类之间的耦合程度越低,越有利于复用;每一个类都应该降低其成员变量和成员函数的访问权限。