当前位置: 首页 > article >正文

软件重构方法

抽取

1.抽象模式:通过将代码中的共性抽象出来,形成一种通用的模式,使得代码更加通用化、可扩展和可重用。

2.提炼函数/方法:将一个函数/方法中的一部分代码提取出来,形成一个新的函数/方法,以减少代码的重复和冗余。

3.提炼类(Extract Class)和提炼超类(Extract Superclass):
提炼类是指将一个类中的一部分功能提取出来,形成一个新的类,以减少原来类的职责,提高代码的可维护性和可读性。
提炼超类是指将多个类中相同的特性和行为提取出来,形成一个新的超类,以避免代码的重复和冗余,同时也可以提高代码的扩展性和可维护性。
两者的区别在于提炼类是将一个类的一部分功能拆分成一个新的类,而提炼超类是将多个类中的共性提取出来形成一个新的超类。

4.合并重复代码:将代码中重复出现的部分合并起来,形成一个共用的方法或类,以避免代码的冗余。

5.替换算法:将一个算法替换成另一个更加高效的算法,以提高代码的性能和可读性。

6.拆分模块:将一个大模块拆分成多个小模块,以减少模块之间的耦合度和提高代码的可维护性。

内联

内联方法(Inline Method)是一种重构手段,它的目的是将一个方法的所有代码直接替换到调用它的地方,以减少方法调用的开销和提高代码的可读性。

内联方法可以避免一些不必要的方法调用,尤其是在一个方法只有很少的代码行数时,如果不内联这个方法,每次调用都需要发生一次方法调用的开销,这样会影响程序的性能。此时,可以使用内联方法将这个方法的代码直接替换到调用它的地方,以消除这种开销。

内联方法的另一个好处是可以提高代码的可读性,因为将方法的代码直接替换到调用它的地方,可以使代码更加直观和易于理解。

需要注意的是,在内联方法之前,需要先确保这个方法没有被其他方法调用,否则内联这个方法可能会导致其他方法出错。此外,还需要考虑代码的可读性和维护性,如果内联方法会导致代码变得复杂或难以维护,就不应该采用这种重构手段。

重命名

重命名是一种常用的重构手法,其目的是为了使代码更加易于理解和维护,提高代码的可读性和可维护性。重命名可以针对变量、函数、类、方法等程序元素进行。

重命名的步骤通常如下:

找到需要重命名的程序元素:根据代码的复杂程度和具体的需求,找到需要重命名的变量、函数、类、方法等程序元素。

执行重命名:使用重构工具或手动修改代码,将需要重命名的程序元素进行修改。

处理依赖项:根据具体情况,需要对重命名的程序元素的引用进行修改。例如,对于重命名变量,需要对所有引用该变量的地方进行修改。

测试代码:在修改代码之后,需要对代码进行测试,确保修改不会影响代码的运行结果。

重命名可以使代码更加易于理解和维护,它可以让变量、函数、类、方法等程序元素的名称更加清晰和具有表达力,同时也可以避免名称冲突和歧义。但是,在进行重命名时,也需要注意一些问题,比如重命名的名称选择、重命名的程序元素的引用等

移动

重构手法的移动指的是将代码元素(如类、方法、字段、变量等)从一个位置移动到另一个位置,以提高代码的组织结构和可读性。代码移动的场景包括:将方法或类移动到其逻辑上更合适的位置、将相关的字段和方法移动到同一个类中、将一个类或接口的所有子类或实现类移动到一个包或命名空间中等。
函数上移(反 函数下移)。字段上移(反 字段下移)
下面是代码移动的一些常见步骤:

选择要移动的代码元素:需要对代码进行仔细分析,找出哪些元素应该被移动,包括方法、字段、变量、类、包等。

执行移动操作:使用重构工具或手动修改代码,将选定的代码元素移动到适当的位置。

处理依赖关系:在移动代码元素之后,需要处理代码元素之间的依赖关系,包括修改引用该代码元素的其他代码元素、修改调用该代码元素的代码等。

测试代码:在进行代码移动之后,需要对代码进行测试,确保修改不会影响代码的正确性和稳定性。

父类和超类:
父类(Parent Class)通常是指一个类被其他类所继承时,被继承的那个类。子类(Subclass)继承了父类的所有属性和方法,并且还可以添加自己的属性和方法。父类是一个广义的概念,可以有多个子类继承自同一个父类。

超类(Superclass)通常是指类的层次结构中最顶层的类。在一些编程语言中,所有的类都继承自某一个超类,比如Java中所有的类都直接或间接地继承自Object类。超类是一个更加抽象和具有普适性的概念,它可以用来定义一些通用的属性和方法,以便子类继承和重用。


http://www.kler.cn/news/9942.html

相关文章:

  • Nacos 性能报告
  • 2023-04-14 lua + C动态库交叉debug
  • 逆向入门--何为OEP
  • 故障注入的方法与工具
  • 【GITLab】docker部署GitLab
  • 如何在ubuntu上搭建minio
  • 灌区量测水系统
  • C++ Primer第五版_第十一章习题答案(31~38)
  • 程序员必用的6个代码对比神器附下载地址
  • Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等
  • NumPy 初学者指南中文第三版:1~5
  • 【三十天精通Vue 3】 第三天 Vue 3的组件详解
  • 一位腾讯在职7年测试工程师的心声...
  • 为什么会有JMM?从0到1一次性说清楚
  • Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)
  • 笔记 | python蓝桥算法复习(预习)基础知识
  • 快排非递归 归并排序
  • spring(七):事务操作
  • docker 安装nocas
  • 亚马逊云科技Amazon Linux 2023正式发布,将为您提供长期支持
  • 使用Xftp连接Windows7虚拟机
  • webgl-图形非矩阵旋转
  • GooglePlay马甲包过审详细流程
  • Java基础(六)面向对象编程(进阶)
  • 2023-04-14 算法面试中常见的查找表问题
  • Available-Python-Tuf
  • ChatGPT大规模封号+停止注册?最火概念会凉吗?
  • 【Camera HW介绍】
  • AI绘画——Stable Diffusion模型,变分自编码器(VAE)模型 , lora模型——调配设置与分享
  • shell的简单信息-执行、变量命名、变量的数据类型