族谱网 头条 人物百科

代码重构

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:516
转发:0
评论:0
重构代码图一图二在软件工程学里,重构代码一词通常是指在不改变代码的外部行为情况下而修改源代码,有时非正式地称为“清理干净”。在极限编程或其他敏捷方法学中,重构常常是软件开发循环的一部分:开发者轮流增加新的测试和功能,并重构代码来增进内部的清晰性和一致性。自动化的单元测试保证了重构不至于让代码停止工作。重构既不修正错误,又不增加新的功能性。反而它是用于提高代码的可读性或者改变代码内部结构与设计,并且移除死代码,使其在将来更容易被维护。重构代码可以是结构层面抑或是语意层面,不同的重构手段施行时,可能是结构的调整或是语意的转换,但前提是不影响代码在转换前后的行为。特别是,在现有的程序的结构下,给一个程序增加一个新的行为可能会非常困难,因此开发人员可能先重构这部分代码,使加入新的行为变得容易。一个重构的小范例是修改一个变量的名称使其具有更明确的含义,例如从单个字母的“i”重构为“interestR...

重构代码

代码重构

图一

代码重构

图二

在软件工程学里,重构代码一词通常是指在不改变代码的外部行为情况下而修改源代码,有时非正式地称为“清理干净”。在极限编程或其他敏捷方法学中,重构常常是软件开发循环的一部分:开发者轮流增加新的测试和功能,并重构代码来增进内部的清晰性和一致性。自动化的单元测试保证了重构不至于让代码停止工作。

重构既不修正错误,又不增加新的功能性。反而它是用于提高代码的可读性或者改变代码内部结构与设计,并且移除死代码,使其在将来更容易被维护。重构代码可以是结构层面抑或是语意层面,不同的重构手段施行时,可能是结构的调整或是语意的转换,但前提是不影响代码在转换前后的行为。特别是,在现有的程序的结构下,给一个程序增加一个新的行为可能会非常困难,因此开发人员可能先重构这部分代码,使加入新的行为变得容易。

一个重构的小范例是修改一个变量的名称使其具有更明确的含义,例如从单个字母的“i”重构为“interestRate”(利率,图一)。较复杂的重构是把一段if区块中的代码变为一个子程序(图二)。更复杂一点的重构是用多态性来替换if 条件式。“清理”代码已经发生了几十年,重构中最关键的认知是有意地“清理”代码,透过从已知的纪录里一些常用的重构方法清理代码,把它从增加新功能分开,然后个别的对代码进行测试(任何的行为改变都可能带来错误)。新的实现切合实际需要以改善现有设计,并且不改变原软件的意图或行为。

重构面对业界调适接受方面的挑战。首先,对重构长远的影响需要更深入研究追踪。又,重构存于资料库轮廓(database schema)的商业逻辑层几乎是不可能或者非常困难的。最后,对接口造成影响的重构可能造成程序开发上的困境,除非程序员有对所有用户界面的访问权。例如,程序员若改变某实体中的方法名称,他要么必须对整个专案里头所有连结到旧名的参考都加以编辑,要么屈服于继续维护使用旧名的残株残瓦接口。而该旧名的接口于内部调用该方法的新名。

源流

重构这个术语是从数字与多项式的因式分解类比而来。如,x − 1可以被分解为(x + 1)(x − 1),这样揭示了前面的形式不可见的内部结构(如两个根+1和−1)。同样,在软件重构中,在可见结构上的改变通常会揭示原代码中“隐藏”的内部结构。

上面数学的例子展示了“重构”的问题。一个表示式不尽然客观地或者处处比另一个更好。它们每个强调不同的方程式的观点,故其实用便多多少少随着个别不同使用情况,以及各个数学家个性与风格变动。这个问题于软件开发领域亦然;个别程序员可能对某既定算法理想的程序形式实现会有不同的意见。

为了简化测试,重构是分步骤完成的。当重构结束后,任何行为上的变化无疑都是错误并可透过除错该程序的新行为个别修正。

马丁·福勒的著作《重构》是一个经典参考书。虽然重构已经非正式的使用了很多年了,William F. Opdyke在1993年的博士论文却是第一篇著名的关于的重构的文章,即使所有的理论与机制长久以来就以程序转换系统存在。所有这些资源提供了一种常用重构方法的型录索引──所有重构方法需要描述,包括怎样辨识你需要(或者不需要)套用该方法,以及如何套用的问题。

重构方法简单列表

下面是非常不完整的代码重构清单。长一点的清单可以在福勒的重构书找到。因为研究者们继续努力不懈的发明以及实现重构,完整清单可能永远都不存在。

封装成员变量(Encapsulate Field)—将仅限于本类使用的变量重写成私有(private)成员变量,并提供访问方法(accessor method)。这种重构方式可以将与外部调用者无关的变量隐藏起来,减少代码的耦合性,并减少意外出错的概率。

提取方法(Extract Method)—意思是将大段代码中的一部分提取后,构成一个新方法。这种重构可以使整段程序的结构变得更清晰,从而增加可读性。这也对函数(Function)通用。

一般化类型(Generalize Type)—将多个类/函数共用的类型抽象出可以公用的基类(base class),然后利用多态性追加每个类/函数需要的特殊函数。这种重构可以让结构更加清晰,同时可以增加代码的可维护性。

函数归父(Pull Up)—或译函数上移,指的是方法从子类移动到父类。

函数归子(Push Down)—或译函数下移,指的是方法从父类移动到子类。

方法更名(Rename Method)—将方法名称以更好的表达它的用途。

代码重构自动化

许多软件编辑器与集成环境支持重构自动化,又称为重构浏览器。枚举如下:

IntelliJ IDEA(Java专用)

Eclipse给Java用的开发包(JDK)

NetBeans(Java专用)

Visual Studio 2005(.NET专用)

CodeGear Delphi

Bicycle Repair Man(Python专用,可与emacs与vi共用)

Refactoring Browser,Smalltalk专用

辞源

首先使用“重构”一辞于出版文献是于一篇文章:Refactoring: An Aid in Designing Application Frameworks and Evolving Object-Oriented Systems, Proceedings of the Symposium on Object Oriented Programming Emphasizing Practical Applications (SOOPPA),1990年9月,由William F. Opdyke与Ralph E. Johnson联名出版。William Opdyke的博士论文于“重构:对象导向框架”,伊利诺大学,1992年出版。“重构”术语几乎至其后确定。

就英文新造字学来说,代码重构(Refactoring)清楚地来自数学上的分解(factoring)。

参见

代码评审

同行评审

软件设计模式

关注点分离

测试驱动开发

参考书目

马丁·福勒:《重构:改进现有代码的设计》,Addison-Wesley Professional 1999, ISBN 978-0-201-48567-7

William C. Wake:《重构练习册》,Addison-Wesley, ISBN 978-0-321-10929-3

Joshua Kerievesky:《重构到模式》,Addison-Wesley, ISBN 978-0-321-21335-8


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 伪代码
参见流程图
· 源代码
作用源代码主要功用有如下2种作用:生成目标代码,即计算机可以识别的代码。对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员,都忽视软件说明的编写;因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。需要指出的是,对于编译语言来说,例如C/C++/Java,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。但是目前有许多流行的脚本语言,例如Perl/Python都不需要重新编译,修改完代码可以直接执行看到修改的结果。代码组合源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分...
· 代码混淆
白盒密码白盒密码(White-boxcryptography)是指够抵抗白盒攻击的密码算法,以及对应实现。常见的实现方式是借助高强度的代码及算法混淆。
· 目标代码
目标文件格式目标文件用以存放目标代码和由编译器或汇编器生成的相关数据的计算机文件格式称为目标文件格式。目标文件格式有许多不同的种类。最初每种类型计算机都拥有自身独特的格式,但随着Unix和其他可移植操作系统的问世,人们定义了例如COFF和ELF这些格式,并在不同的系统上使用它们。通常,链接器的输入和输出使用相同的文件格式,库文件和可执行文件格式也是一样使用相同的格式。设计或选择一种目标文件格式是计算系统整体设计的关键部分。它影响着链接器的性能并因此影响着程序员在开发时的总耗时;如果格式是用于可执行文件,那么格式的设计还会影响程序的开始运行花费的时间,以及影响到系统对用户请求的反应速度。大部分目标文件格式以区块的方式来组织,每一区块中都装载着同种数据。在虚拟内存系统需要这些块的时候,它可以通过将这些块分页后调入,无需进一步地处理就可使用。最简单的目标文件格式是DOS的COM文件格式(OBJ文...
· 通用产品代码
历史UPC码是在IBM公司工程师诺曼·伍德兰的环形码基础上诞生的。1966年,美国国家食物连锁协会(NationalAssociationofFoodChains(NAFC))要求研制一种加快货物验收速度的设备,国家收款机(NationalCashRegister,IBM公司的前身)在1967年开发出了用来替代伍德兰德牛眼码的一种新式同心圆环码。1970年夏天,应国家食物连锁协会要求,Logicon公司开发出了食品工业统一码(UniversalGroceryProductsIdentificationCode,UGPIC),依据IBM乔治·J·劳雷尔(英语:GeorgeJ.Laurer)设计方案。很快,美国超市AdHoc组织在Logicon公司建议下制造了UPC码。美国均匀码理事会在1973年建立了UPC码系统,并且实现了该码制标准化。UPC码首先在杂货零售业中试用,1974年6月25日,...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信