第6章面向对象程序设计基本原则

6.1 概述

2002年出版的《敏捷软件开发:原则、模式与实践》(Robert C.Martin著)一书中,总结了十一种面向对象设计的重要法则,其中流传最广、应用最多的有7种,也就是我们常见的,首字母大写为SOLID的5大原则(SRP、OCP、LSP、ISP、DIP),以及合成复用原则(Composite Reuse Principle,CRP)与迪米特法则(Law of Demeter,LoD),

第6章面向对象程序设计基本原则_第1张图片6.2 单一责任原则(SRP)

单一责任原则(Single Responsibility Principle,SRP)是指一个类或者模块只应该负责一个功能领域的相应职责。“A class should have only one reason to change”。

功能单一的原因是,职责负担过多的类被修改的概率会很大,把多个功能放在同一个类中,每次修改一个功能,很可能会影响到同一个类中的另一个功能,软件的可维护性就会大大降低。

第6章面向对象程序设计基本原则_第2张图片

第6章面向对象程序设计基本原则_第3张图片

单一责任原则是为了保证创建职责单一、功能明确的基础类。而更加复杂的类则应该由这些类进行组合(即一个类是另一个类的属性),或者配合接口使用。
单一责任原则的主要目的是在设计类时,要保证“一个类应该有且只有一个职责”,类中可以有多个方法,但这些方法必须是为了这同一个职责服务的,其设计目标就是我们常说的“高内聚”。

6.3 开放封闭原则(OCP)

开放封闭原则(Open-Closed Principle,OCP)指的是,对于一个类或者模块,如果在业务需要修改或者功能需要扩展时,应尽可能地保证在只通过新添加代码,而不是修改原有代码的情况下完成。

当向模块添加字段或方法时,不可避免地需要对调用这个模块的程序进行修改,解决方式是现存的接口或抽象类对于修改原有的方法和属性是封闭的,但对新添加的方法和属性则是开放和允许的。

以物料类型mara-mtart为例。

业务流程。

第6章面向对象程序设计基本原则_第4张图片

OCP方案:,首先将业务抽象为三层,第一层为物料对象生成工厂类,相当于主程序中的操作者,用于创建物料类的对象实例。第二层为抽象的物料类,由物料对象生成工厂类直接调用。第三层是具体的物料类,代表具体的物料类型,可以不断地从抽象类中继承和添加新的子类,具体的解释如表6-2所示。

第6章面向对象程序设计基本原则_第5张图片

创建第二层 抽象类:

第6章面向对象程序设计基本原则_第6张图片

第6章面向对象程序设计基本原则_第7张图片

创建第三层的子类

分别为“成品物料类”ZCL_MATERIAL_FIN和“原料物料类”ZCL_MATERIAL_RAW,这一层是最底层的实现类,代表了具体的实现方法,如果有新的业务添加时,也是在这一层创建新的类。

成品子类

第6章面向对象程序设计基本原则_第8张图片

第6章面向对象程序设计基本原则_第9张图片

第6章面向对象程序设计基本原则_第10张图片

第6章面向对象程序设计基本原则_第11张图片

原材料子类

第6章面向对象程序设计基本原则_第12张图片

第6章面向对象程序设计基本原则_第13张图片

第6章面向对象程序设计基本原则_第14张图片

创建简单工厂类 ZCL_MATL_SPL_FACTORY

第6章面向对象程序设计基本原则_第15张图片

第6章面向对象程序设计基本原则_第16张图片

第6章面向对象程序设计基本原则_第17张图片

第6章面向对象程序设计基本原则_第18张图片

调用类的报表程序

第6章面向对象程序设计基本原则_第19张图片

运行结果

第6章面向对象程序设计基本原则_第20张图片

第6章面向对象程序设计基本原则_第21张图片

代码重构的好处

第6章面向对象程序设计基本原则_第22张图片

新增类:

第6章面向对象程序设计基本原则_第23张图片

复制第三层的类

第6章面向对象程序设计基本原则_第24张图片

改代码,

第6章面向对象程序设计基本原则_第25张图片

改控制表

第6章面向对象程序设计基本原则_第26张图片

6.4 里氏替换原则(LSP)

LSP的原定义比较复杂,一般对里氏替换原则的解释为:子类对象能够替换父类对象,而程序逻辑不变。

不符合LSP的最常见的情况是父类和子类都是可实例化的非抽象类,且父类的方法被子类重新定义,这一类的实现继承会造成父类和子类之间的强耦合,也就是实际上并不相关的属性和方法牵强附会在一起,这样会不利于程序的扩展和维护。

before

第6章面向对象程序设计基本原则_第27张图片

After

第6章面向对象程序设计基本原则_第28张图片

符合LSP的设计就是:尽量不要从可实例化的父类中继承,而是尽量将父类设计为抽象类或者接口,让子类继承父类或者实现父类接口。
如果一个子类的对象会在父类出现的地方出现运行错误,则表明该子类不应该从该父类继承,也就是说,我们应该考虑重新进行系统类关系的设计。
符合里氏替换原则的类继承是不会对已有的架构引入新的错误的,这也是开放封闭原则的前提(只有符合了LSP,系统才可能符合OCP)。

6.5 接口分离原则(ISP)

接口分离原则(Interface Segregation Principle,ISP)指的是,在程序中,应该使用多个最小化的、专门的接口,而不是使用一个集合了所有功能的复杂的接口。

before

第6章面向对象程序设计基本原则_第29张图片

after

第6章面向对象程序设计基本原则_第30张图片

6.6 依赖倒置原则(DIP)

依赖倒置原则(Dependency Inversion Principle,DIP)指的是,高层的模块不应该依赖于底层的具体的实现,而是要依赖于抽象。

before

第6章面向对象程序设计基本原则_第31张图片

after

第6章面向对象程序设计基本原则_第32张图片

6.7 合成复用原则(CRP)

.合成复用原则(Composite Reuse Principle,CRP)指的是,在面向对象的设计中,要尽量使用对象组合,而不是通过继承来达到代码复用的目的。

before VS after

第6章面向对象程序设计基本原则_第33张图片

 6.8 迪米特法则(LoD)

迪米特(得墨忒耳)法则(Law of Demeter,LoD)指的是,一个类应当尽可能少地与其他类发生相互作用,该法则又称为最少了解原则(Least Knowledge Principle,LKP)。

before VS after

第6章面向对象程序设计基本原则_第34张图片

总结:

第6章面向对象程序设计基本原则_第35张图片

你可能感兴趣的:(开发语言,python,java)