代码重构技术的概念,动机,好处,挑战和技术方法
目录
【引言】
【概述】
【动机】
【重构的好处】
【可维护性】
【可扩展性】
【挑战】
【知识不全,能力所限】
【如何改善】
【测试】
【相关技术】
【硬件重构】
【自动代码重构】
【小结】
【引言】
通过这篇文章我们来研究分析一下代码重构技术研究。
【概述】
在计算机编程和软件设计中,代码重构是指在不改变外部行为的情况下,对现有的计算机代码进行重构的过程。
重构是为了改善软件的设计、结构和实现,同时保留其现有的功能。
重构的潜在优势包括提高代码的可读性和降低复杂度。
这些都可以提高源代码的可维护性,并创建一个更简单、更干净或更有表现力的内部架构或对象模型,从而提高程序的可扩展性。
通常情况下,重构采用了一系列标准化的微观重构,每一个微观重构都是对计算机程序源代码进行微小的修改,这些修改不改变软件的功能需求。
许多开发环境都提供了自动化机制来执行这些基本的重构操作。
对于重构工作:
·如果做得好,可以简化底层逻辑, 降低复杂度,从而帮助软件开发人员发现和修复系统中隐藏或潜伏的错误或漏洞。
·如果做得不好,它可能引入新的bug,或者改变现有的功能。
【动机】
重构的动机通常是因为注意到代码中存在了不好的“味道”。
比如,某些方法非常的长,或者是几个函数的近似重复。
一旦意识到这类问题,可以通过重构源代码,将其转化为一个新的形式,去除这些坏的"味道"。
对于一个较长的函数,可以提取出多个较小的子函数。
或者对于重复的函数,可以把重复的部分放在一个共享函数里面。
这种情况下,如果不进行重构,会导致技术债的积累。而进行重构是消除技术债的方法之一。
【重构的好处】
重构活动的好处一般有两类:
【可维护性】
因为源代码更容易阅读,对于代码作者的意图就更容易把握,所以修复bug就比较容易些。
可能的手段如:
·通过将大型的函数或者组件缩减为一组单独的、命名良好的、单一目的的函数或者组件来实现。
·可以通过将一些方法移到一个更合适的类中。
·或者删除误导性注释来实现。
【可扩展性】
如果应用程序使用了可识别的设计模式,它会更容易扩展应用程序的功能,而且这些设计模式可能提供了一些以前不存在的灵活性。
【挑战】
重构需要提取软件系统结构、数据模型和应用程序内部的依赖关系,以便于获得对现有软件系统知识的了解。
【知识不全, 能力所限】
·有时候,团队的更替或者开发人员的离职,会导致对整个软件系统的理解不充分,对于系统相关的知识可能掌握的不全面。
·进一步的代码重构活动需要额外的努力才能重新获得这些知识。
·重构活动产生的架构方面的修改可能会使软件系统的结构体系进一步恶化。
·恶化会影响体系结构的特性,如可维护性和可理解性,这可能导致软件系统的完全重新开发。
【如何改善】
当使用工具和相关技术提供有关算法和代码执行顺序的数据时,代码重构活动就有了软件智能的保障,为软件系统结构、数据模型和组件内部依赖关系的内部状态提供一种可理解的格式,进而形成更高层次的抽象理解,然后对需要修改的内容和方式形成精炼的视图。
重构的一个不可缺少的步骤就是要有充足的测试案例保证现有功能不被破坏。
【测试】
在重构之前,应该准备好充足的单元测试,以确保程序模块仍然能像预期的那样运行。
单元测试可以给大型的重构工作带来稳定性。
即使是大型的重构工作,也可以通过单一的原子提交来实现。
一个常见的策略是:
·将所有的项目代码存储在一个单一的存储库中,称为monorepo,这可以让安全可靠和原子化的重构跨越多个项目。
·有了单元测试之后,重构就是一个迭代的循环,即先做一个小的程序变换,然后测试确保正确性,然后再做另一个小的程序变换。
·如果在任何一点上测试失败了,最后的小的改动就会被撤销,并以不同的方式再重复进行。
·通过上面这些许多小的步骤,程序就从原来的状态到了你希望的状态。
·为了使这个过程更加实用高效,单元测试必须运行得非常快,不然的话程序员们要花很大一部分时间等待测试结束。
·极限编程和其他敏捷软件开发的拥护者将这项活动描述为软件开发周期中不可分割的一部分。
【相关技术】
以下是一些微重构的例子,其中一些可能只适用于某些语言。许多开发环境为这些微重构提供了自动支持。
例如,程序员可以点击一个变量的名称,然后在上下文菜单中选择"封装字段"进行重构。
然后IDE会提示额外的细节,通常会有合理的默认值和代码修改的预览。
在程序员确认后,它将在整个代码中执行所需的更改。
·有助于更多理解程序结构的技术
o程序依赖关系图--数据和控制依赖关系的显式表示
o系统依赖图--PDG之间过程调用的表示方式
o软件智能----逆向工程的初始状态,以了解现有的应用内的依赖关系。
·可实现更多抽象化的技术
o封装字段--用getter和setter方法
o通用化类型----创建更多的通用类型,让更多的代码共享。
o将类型检查代码改为状态/战略代码
o用多态性取代条件性
·将代码分解成更多逻辑碎片的技巧
o组件化将代码分解成可重用的语义单元,这些语义单元呈现出清晰的、定义明确的、简单易用的接口。
o提取类,将现有类中的部分代码移动到一个新的类中。
o提取方法,将一个较大的方法的一部分提取变成一个新的方法。通过将代码分解成更小的部分,提高代码的可读性。
·改进代码名称和位置的技巧
o移动方法或移动字段--移动到更合适的类或源文件中
o重命名方法或重命名字段----将名称改成一个新的、能更好地揭示其用途的名称
o拉升----在面向对象编程(OOP)中,移到超类中去
o下推--在OOP中,移动到子类
·自动克隆检测
【硬件重构】
虽然重构这个术语最初只指软件代码的重构,但近年来,用硬件描述语言(HDL)编写的代码也正在被重构。
硬件重构这个术语被用作硬件描述语言中代码重构的速记术语。
由于HDLs不被大多数硬件工程师认为是编程语言,所以硬件重构被视为一个独立于传统代码重构的领域。
Zeng和Huss提出了模拟硬件描述的自动重构,在他们的方法中,重构保留了硬件设计的模拟行为。其改进的非功能测量是重构后的代码可以被标准的合成工具处理,而原始代码则不能。
Synopsys的研究员Mike Keating也对数字HDL的重构(尽管是手工的重构)进行了研究,他的目标是使复杂的系统更容易理解,从而提高设计者的工作效率。
【自动代码重构】
许多软件编辑器和IDE都有自动重构支持。
它们既可以重构应用程序代码,也可以重构测试代码,以下是其中几个例子:
·DMS软件重构工具包(支持C、C++、C#、COBOL、Java、PHP等语言的大规模重构)
·基于Eclipse:
oEclipse(适用于Java,并在较小程度上适用于C++、PHP、Ruby和JavaScript。)
oPyDev (适用于Python)
oPhotran (Eclipse IDE的Fortran插件)
·Embarcadero Delphi
·基于IntelliJ的:
oAppCode (用于Objective-C、C和C++)
oIntelliJ IDEA (用于Java)
oPyCharm (用于Python)
oWebStorm (用于JavaScript)
oAndroid Studio (适用于Java)
·JDeveloper (适用于Java)
·NetBeans (适用于Java)
·Smalltalk
·基于Visual Studio的:
oVisual Studio (适用于.NET和C++)
oCodeRush (Visual Studio的附加组件)
oVisual Assist (Visual Studio的插件,支持C#和C++的重构)
·Wing IDE (适用于Python)
·Xcode(适用于C、Objective-C和Swift)
·Qt Creator(适用于C++、Objective-C和QML)
【小结】
本文对代码重构技术的概念,动机,好处,挑战和技术方法进行了学习和探讨,希望对感兴趣的朋友有所裨益。
欢迎讨论。
领取专属 10元无门槛券
私享最新 技术干货