代码重构

来源:互联网 发布:怎么样弄中文域名 编辑:程序博客网 时间:2024/05/21 06:58


维基百科,自由的百科全书
跳转到: 导航, 搜索
跳过字词转换说明

汉漢▼▲为了阅读方便,本文使用全文手工轉換。转换内容:
本文采用电脑和信息技术组全文转换 [查看] • [编辑] • [强制刷新]

 


顯示↓關閉↑字詞轉換说明
字詞轉換是中文维基的一項自動轉換,目的是通過计算机程序自動消除繁简、地区词等不同用字模式的差異,以達到閱讀方便。字詞轉換包括全局轉換和手動轉換,本說明所使用的标题转换和全文转换技術,都屬於手動轉換。

如果您想对我们的字词转换系统提出一些改进建议,或者提交应用面更广的转换(中文维基百科全站乃至MediaWiki软件),或者报告转换系统的错误,请前往Wikipedia:字词转换请求或候选发表您的意见。

代码重构指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。

软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方。在极限编程的方法学中,重构需要单元测试来支持。

目录 [隐藏]
1 重构代码
2 源流
3 重构方法简单列表
4 代码重构自动化
5 辞源
6 参见
7 参考资料
8 参考书目
9 外部链接
 

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

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

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

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

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

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

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

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

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

成员变数封装(Encapsulate Field)
方法提取 (Extract Method) — 意思是转换大型方法的部分变成新方法。透过拆分代码成比较小点的区块而促进方法可读性。这也对函式通用。
一般化型别 (Generalize Type)
函数归父 (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 联名出版 [2]。William Opdyke 的博士论文于「重构:物件导向框架」,伊利诺大学,1992年出版 [1]。「重构」术语几乎至其后确定。

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

[编辑] 参见
代码评审
同级评审
软件设计模式
关注点分离
测试驱动开发
[编辑] 参考资料
^ 1.0 1.1 http://martinfowler.com/bliki/EtymologyOfRefactoring.html
^ http://www.cs.ucd.ie/staff/meloc/home/papers/thesis/Chapter2.pdf
[编辑] 参考书目
马丁·福勒: 《重构:改进现有代码的设计》,Addison-Wesley Professional 1999, ISBN 0201485672
William C. Wake:《重构练习册》,Addison-Wesley, ISBN 0-321-10929-5
Joshua Kerievesky:《重构到模式》,Addison-Wesley, ISBN 0321213351