软件重构方法
抽取
1.抽象模式:通过将代码中的共性抽象出来,形成一种通用的模式,使得代码更加通用化、可扩展和可重用。
2.提炼函数/方法:将一个函数/方法中的一部分代码提取出来,形成一个新的函数/方法,以减少代码的重复和冗余。
3.提炼类(Extract Class)和提炼超类(Extract Superclass):
提炼类是指将一个类中的一部分功能提取出来,形成一个新的类,以减少原来类的职责,提高代码的可维护性和可读性。
提炼超类是指将多个类中相同的特性和行为提取出来,形成一个新的超类,以避免代码的重复和冗余,同时也可以提高代码的扩展性和可维护性。
两者的区别在于提炼类是将一个类的一部分功能拆分成一个新的类,而提炼超类是将多个类中的共性提取出来形成一个新的超类。
4.合并重复代码:将代码中重复出现的部分合并起来,形成一个共用的方法或类,以避免代码的冗余。
5.替换算法:将一个算法替换成另一个更加高效的算法,以提高代码的性能和可读性。
6.拆分模块:将一个大模块拆分成多个小模块,以减少模块之间的耦合度和提高代码的可维护性。
内联
内联方法(Inline Method)是一种重构手段,它的目的是将一个方法的所有代码直接替换到调用它的地方,以减少方法调用的开销和提高代码的可读性。
内联方法可以避免一些不必要的方法调用,尤其是在一个方法只有很少的代码行数时,如果不内联这个方法,每次调用都需要发生一次方法调用的开销,这样会影响程序的性能。此时,可以使用内联方法将这个方法的代码直接替换到调用它的地方,以消除这种开销。
内联方法的另一个好处是可以提高代码的可读性,因为将方法的代码直接替换到调用它的地方,可以使代码更加直观和易于理解。
需要注意的是,在内联方法之前,需要先确保这个方法没有被其他方法调用,否则内联这个方法可能会导致其他方法出错。此外,还需要考虑代码的可读性和维护性,如果内联方法会导致代码变得复杂或难以维护,就不应该采用这种重构手段。
重命名
重命名是一种常用的重构手法,其目的是为了使代码更加易于理解和维护,提高代码的可读性和可维护性。重命名可以针对变量、函数、类、方法等程序元素进行。
重命名的步骤通常如下:
找到需要重命名的程序元素:根据代码的复杂程度和具体的需求,找到需要重命名的变量、函数、类、方法等程序元素。
执行重命名:使用重构工具或手动修改代码,将需要重命名的程序元素进行修改。
处理依赖项:根据具体情况,需要对重命名的程序元素的引用进行修改。例如,对于重命名变量,需要对所有引用该变量的地方进行修改。
测试代码:在修改代码之后,需要对代码进行测试,确保修改不会影响代码的运行结果。
重命名可以使代码更加易于理解和维护,它可以让变量、函数、类、方法等程序元素的名称更加清晰和具有表达力,同时也可以避免名称冲突和歧义。但是,在进行重命名时,也需要注意一些问题,比如重命名的名称选择、重命名的程序元素的引用等
移动
重构手法的移动指的是将代码元素(如类、方法、字段、变量等)从一个位置移动到另一个位置,以提高代码的组织结构和可读性。代码移动的场景包括:将方法或类移动到其逻辑上更合适的位置、将相关的字段和方法移动到同一个类中、将一个类或接口的所有子类或实现类移动到一个包或命名空间中等。
函数上移(反 函数下移)。字段上移(反 字段下移)
下面是代码移动的一些常见步骤:
选择要移动的代码元素:需要对代码进行仔细分析,找出哪些元素应该被移动,包括方法、字段、变量、类、包等。
执行移动操作:使用重构工具或手动修改代码,将选定的代码元素移动到适当的位置。
处理依赖关系:在移动代码元素之后,需要处理代码元素之间的依赖关系,包括修改引用该代码元素的其他代码元素、修改调用该代码元素的代码等。
测试代码:在进行代码移动之后,需要对代码进行测试,确保修改不会影响代码的正确性和稳定性。
父类和超类:
父类(Parent Class)通常是指一个类被其他类所继承时,被继承的那个类。子类(Subclass)继承了父类的所有属性和方法,并且还可以添加自己的属性和方法。父类是一个广义的概念,可以有多个子类继承自同一个父类。
超类(Superclass)通常是指类的层次结构中最顶层的类。在一些编程语言中,所有的类都继承自某一个超类,比如Java中所有的类都直接或间接地继承自Object类。超类是一个更加抽象和具有普适性的概念,它可以用来定义一些通用的属性和方法,以便子类继承和重用。