软件重构
重构工具箱
- 抽取方法:将代码段提取出来,形成单独的函数
- 抽取类:将函数或代码段提取出来,形成单独的类
- 抽取接口:将相似的,或者同类型的代码抽取出来形成接口,以及接口下的多个实现
重构的步骤
第一步:分解大函数
对于超级大函数,解决的最有效的方法就是分解,按照功能一步一步的进行分解,还原其应有的优化结构。这个过程我们常用的重构方法是“抽取方法”
对于重复的代码,应抽取到一个统一的函数中为其他各处所调用
一些块操作的语句,如条件语句、循环语句、try语句,都可能成为抽取函数的标志
常见的问题:
将代码从原函数中抽取出来形成新的函数,数据只能通过参数和返回值进行交互,这将给我们带来诸多麻烦
第二步:拆分大对象
拆分大对象采用”职责驱动设计“思想:就是要求我们设计的所有类和接口都要有自己的职责定义。儿类和接口内部的所有方法和属性都要围绕着该职责来进行,它们都是高度相关的。每个类和接口绝不去做跟自己职责无关的事情
拆分大对象采用的重构方法为抽取类
第三步:提高代码复用率
当重复代码存在于同一对象时-抽取方法
当重复代码存在于不同对象中时-抽取类
不同对象中复用代码的另一种方法-封装成实体类
当重复代码所在类具有某种并列关系时-抽取父类
当出现继承泛滥时-将继承转换为组合,将代码不同的部分封装到一个统一接口下的多个实现类中
第四步:发现程序可扩展点
系统的可扩展设计和需求变更是一对“鸡生蛋还是蛋生鸡的问题”,《大话重构》中建议不要过早的实现可扩展设计,因为可扩展设计基本上都有加大程序的复杂度、降低系统性能的负作用。我们完全可以在新需求需要可扩展设计时再进行这样的设计
第五步:降低程序的依赖度
依赖反转原则:
- 高层次模块不应该依赖低层次模块。两者都应该依赖接口
- 抽象接口不应该依赖具体实现,具体实现应该依赖抽象接口
(通常称靠近人机交互端的为高层次,靠近硬件设备端的为低层次)
设计应当依赖于抽象而不是依赖于实现就是要根据它所依赖的接口去实现类,到底由谁来创建接口的实现类呢,当然不是客户程序,而是由工厂类去创建那些实现类
放在工厂中的对象,我们称为产品,它们每一个都有自己的产品名称,这个名称是唯一的,通过产品名称我们可以方便的查找到该产品。最后,每个工厂都有一个方法为它的客户程序提供工厂中的产品
当客户程序需要某个实现类时,则通过某个关键字询问工厂,由工厂去寻找这个类,创建它,并将它的一个实例返回给客户程序,这就是工厂模式的实质
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!