重构或代码重构被定义为在不增加新功能或不改变代码外部行为的情况下改进现有计算机代码的系统过程。目的是在不更改软件功能的情况下更改代码的实现,定义,结构。它在不更改软件实际功能的情况下提高了软件的可扩展性,可维护性和可读性。
当代码可以正常工作时,为什么还要重构代码?
重构的目的不是添加新功能或删除现有功能。重构的主要目标是使代码在将来更易于维护,并且可以消除技术债务。我们之所以进行重构,是因为我们了解,很难在第一时间就完成正确的设计,而且重构还为您带来以下好处:
- 代码大小通常会减少
- 令人困惑的代码重组为更简单的代码
以上两个优点极大地提高了所需的可维护性,因为需求总是不断变化。
我们什么时候重构?
- 在添加新功能之前,请确保您的设计和当前代码“良好”,这将有助于更轻松地编写新代码。
- 当您需要修正错误时
- 当您进行同行评审时
- 在代码审查期间
如何识别要重构的代码?
马丁·福勒(Martin Fowler)建议使用“代码气味”来识别何时何地进行重构。代码异味是代码中的不良行为,就像代码中的不良模式一样。重构和代码气味是帮助我们识别设计和实现问题的一些技术。它还有助于我们将已知的解决方案应用于这些问题。
重构技术:
存在着70多种重构技术。但是,我们将仅讨论一些更常见的问题。
- 提取方法–
当我们有一个可以组合在一起的代码时。例子:
def student(): getgrades() # details name = input() class = input()
可以将其重构为:
def student(): getgrades() getdetails() def getdetails(): name = input() class = input()
- 用查询替换临时文件–
当我们使用临时变量保存表达式的结果时。例子 :
SI = P * R * T / 100 if(SI > 100): return SI else: return SI * 1.5
可以将其重构为:
def SI(): return P * R * T / 100 if(SI() > 100): return SI() else: return SI()*1.5
- 封装领域–
它涉及提供用于读取/写入数据而不是直接访问数据的方法。例子 :
class A: variable This could be refactored as: class A: self.variable getvariable() setvariable()
- 内联方法-
当我们有一个比方法本身更明显的方法主体时。例子 :
class PizzaDelivery: def getgrades(self): return 'A' if self.moretheneight() else B def ismorethaneight(self): return self.number > 8
可以将其重构为:
class PizzaDelivery: def getgrades(self): return self.number > 8 ? A : B
- 移动方法-
当一个函数一个类时,其他类将比该类所在的类更多地使用该类。Class A: #... abc() Class B: #...
可以将其重构为:
Class A: #... Class B: #... abc()
- 用多态替换条件-
当我们有一个条件根据对象类型或属性执行各种操作时。例子 :
=class Bird: # ... def getSpeed(self): if self.type == EUROPEAN: return self.getBaseSpeed() elif self.type == AFRICAN: return self.getBaseSpeed() - self.getLoadFactor() * self.numberOfCoconuts elif self.type == NORWEGIAN_BLUE: return 0 if self.isNailed else self.getBaseSpeed(self.voltage) else: raise Exception("Should be unreachable")
这可以重构为
class Bird: # ... def getSpeed(self): pass class European(Bird): def getSpeed(self): return self.getBaseSpeed() class African(Bird): def getSpeed(self): return self.getBaseSpeed() - self.getLoadFactor() * self.numberOfCoconuts class NorwegianBlue(Bird): def getSpeed(self): return 0 if self.isNailed else self.getBaseSpeed(self.voltage) # Somewhere in client code speed = bird.getSpeed()
笔记 :
- 重构改善了软件的设计。
- 重构使软件更易于理解。
- 重构有助于我们发现程序中的错误。
- 重构有助于我们更快地编程。