fbpx
维基百科

代码重构

代码重构(英語:code refactoring)指对软件代码做一些改动以增加可读性或者简化代码结构而不影响输出结果。

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

重构代码 编辑

 
图一
 
图二

软件工程学裡,重构代码一词通常是指在不改变代码的外部行为情况下而修改源代码。在极限编程或其他敏捷方法学中,重构常常是软件开发中的一部分:开发者轮流增加新的测试和功能,并重构代码来增进代码间的清晰性和一致性。同时,自动化的单元测试保证了重构后的代码仍然能够正常运作。

重构既不修正错误,也不增加新的功能。它的目的是用于提高代码的可读性或者改变代码内部结构设计或者刪除死碼,使其在将来更容易进行维护和开发。重构代码可以存在于结构层面或是语意层面,但前提是不影响代码在转换前后的功能。一种进行重构的典型案例是:一个程序在现有的逻辑结构下难以加入新的功能,因此开发人员可能会对代码进行重构,以便日后继续开发。

一个重构的小范例是修改一个变量的名称使其具有更明确的含义,例如从单个字母的「i」重构为「interestRate」(利率,图一)。一个较复杂的重构的例子是把一段if区块中的代码变为一个子程序(图二)。更复杂一点的重构是用多态性来替换if 条件式。進一步還可重新设计程序的算法。在重构中最关键的是去有意地「清理」代码,把不同的功能分开,然后对重构后的代码进行测试(任何对代码的编辑都有可能引发错误)。新的实现方法需要切合实际地改善现有设计,并且不改变原软件的功能能或行为。

难点 编辑

代码重构也面临诸多的挑战。首先,对重构长远的影响需要在重构后才能进行深入研究和追踪。其次,重构某些底层业务逻辑或是数据库架构几乎是不可能的。最后,对接口造成影响的重构可能造成程式開發上的困境。例如,程序员若改变某接口中的方法名称,除非他或她要对所有客户端中连结到旧方法名的参考都加以编辑,否则就只能继续维护使用旧方法名的接口,并另外建立旧名对新名的映射。

源流 编辑

首先使用「重构」一辞于出版文献是于一篇文章:《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联名出版[1]。William Opdyke的博士论文于「重构:物件导向框架」,伊利诺大学,1992年出版[2]。「重构」术语几乎至其后确定。

重构这个术语是从数字多项式因式分解类比而来[3]。如,x2 − 1可以被分解为(x + 1)(x − 1),这样更好的整理并展示了式子的性质(例如式子拥有两个+1和−1)。同样,在软件重构中,结构上的改变通常会揭示原代码中曾经「隐藏」的内部结构。

上面多项式的例子很好地展示了「重构」的思路。但是,一个多项式的不同表示形式并没有优劣之分,它们展现了多项式的不同性质。在不同情况下适合的表达形式不同,并且还会随着使用者的个人习惯或理解变化。这个问题于软件开发领域亦然:个别程式员可能对某既定演算法的理想结构会有不同的意见。

重构方法简单列表 编辑

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

  • 封装成员变量英语Field encapsulation(Encapsulate Field)—将仅限于本类使用的变量重写成私有(private)成员变量,并提供访问方法(accessor method)。这种重构方式可以将与外部调用者无关的变量隐藏起来,减少代码的耦合性,并减少意外出错的概率。
  • 提取方法(Extract Method)—意思是将大段代码中的一部分提取后,构成一个新方法。这种重构可以使整段程序的结构变得更清晰,从而增加可读性。这也对函数(Function)通用。
  • 类一般化英语Type generalization(Generalize Type)—将多个类/函数共用的类型抽象出可以公用的基类(base class),然后利用多态性追加每个类/函数需要的特殊函数。这种重构可以让结构更加清晰,同时可以增加代码的可维护性。
  • 函数归父(Pull Up)—或译函数上移,指的是方法从子类移动到父类。
  • 函数归子(Push Down)—或译函数下移,指的是方法从父类移动到子类。
  • 方法更名英语Rename_method(Rename Method)—将方法名称以更好的表达它的用途。
重构方法 重构前 重构后
封装成员变量
  class SomeClass { public int memberA; ... } 
class SomeClass {  private int memberA;  public int getMemberA(); public void setMemberA(int a); ... } 
方法提取
void Process(MyDataSet mds)  {   // Step 1 ...   int result = 0;   if (mds.isReady)   {    int data1 = mds.param[0];    int data2 = mds.param[1];    // Preprocess...    result = data1 % data2;   }   // Step 2...  } 
void Process(MyDataSet mds) {   // Step 1 ...   int result = 0;   if (mds.isReady)    result = CalculateMDS(mds.param[0], mds.param[1]);   // Step 2 ...  }  int CalculateMDS(int data1, int data2)  {    // Preprocess...    return data1 % data2;  } 
一般化类型
class Rectangle {  private:  int w, h;  public:  double Area(){  return w*h;  } } class Triangle {  private:  int w, h;  public:  double Area(){  return w*h/2;  } } 
class Polygon {  private:  int w, h;  public:  virtual double Area() = 0; } class Rectangle : public Polygon {  double Area(){  return w*h;  } } class Triangle : public Polygon {  double Area() {  return w*h/2;  } } 
方法更名
public double f(double m, double a); 
public double calculateForce(double mass, double acceleration); 

代码重构自动化 编辑

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

硬件重构 编辑

尽管代码重构一词最初只用于软件代码的重构,但近年来,硬件描述语言也出现了相应的代码重构的概念。硬件重构(hardware refactoring)是对硬件描述语言中的代码进行重构的简称。由于一般认为硬件描述语言与传统编程语言有较大的区别[4],因此硬件重构被视为与传统的代码重构不同的领域。

研究者已经提出了模拟电路硬件描述语言(如VHDL-AMS)所使用的自动化重构方法[5]。根据他们的研究,硬件重构会在保持原本代码的仿真结果的同时,增进行为模型的可理解性、可扩展性和可重用性,并使得后续自动化编译过程的逻辑综合步骤可以产生更加符合预期的结构表示。此外,Synopsys公司的Mike Keating也研究了手动进行的数字电路硬件描述语言的重构[6][7]。他所研究的目标是使复杂的硬件系统更易于理解,从而提高设计人员的生产力。

注释 编辑

参考文献 编辑

引用 编辑

  1. ^ (PDF). [2007-11-10]. (原始内容 (PDF)存档于2007-04-18). 
  2. ^ 存档副本. [2007-11-10]. (原始内容于2018-09-20). 
  3. ^ 英文重构(refactor)为“重新”(re-)与“(因式)分解”(factor)两单词的结合
  4. ^ 硬件描述语言. 维基百科,自由的百科全书. 2020-05-11 (中文). 
  5. ^ Kaiping Zeng; Huss, S.A. Architecture Refinements by Code Refactoring of Behavioral VHDL-AMS Models. 2006 IEEE International Symposium on Circuits and Systems (IEEE). doi:10.1109/iscas.2006.1692875. 
  6. ^ Golovchenko, E.A. Tutorial: the challenges of designing long-haul WDM systems. Optical Fiber Communication Conference and Exhibit (Opt Soc. America). doi:10.1109/ofc.2002.1036216. 
  7. ^ Keating, Michael; Bricaud, Pierre. Reuse Methodology Manual for System-on-a-Chip Designs. 1998. doi:10.1007/978-1-4757-2887-3. 

來源 编辑

书籍

外部链接 编辑

  • (英文)什么是重构? (页面存档备份,存于互联网档案馆)(c2.com文献)
  • (英文)Martin Fowler的关于重构的主页 (页面存档备份,存于互联网档案馆
  • (英文)William F. Opdyke在1993年发表的博士论文[永久失效連結]
  • (英文),Ramnivas Laddad著
  • (英文)软件重构的纵览 (页面存档备份,存于互联网档案馆),Tom Mens和Tom Tourwé著
  • (英文)如何编写难以维护的代码 (页面存档备份,存于互联网档案馆),Roedy Green著
  • (英文)
  • (英文)重构 (页面存档备份,存于互联网档案馆) - alphabetical list
  • (英文)重构为模式的目录 (页面存档备份,存于互联网档案馆
  • (英文)重构Java代码 (页面存档备份,存于互联网档案馆
  • (英文)通用重构连结 (页面存档备份,存于互联网档案馆
  • (英文)
  • (英文)Refuctoring (页面存档备份,存于互联网档案馆)—重构的反面(来自Waterfall2006会议的嘲讽)
  • (英文)
  • (英文)重构相关短文 (页面存档备份,存于互联网档案馆

参见 编辑

代码重构, 此條目需要編修, 以確保文法, 用詞, 语气, 格式, 標點等使用恰当, 2017年3月20日, 請按照校對指引, 幫助编辑這個條目, 幫助, 討論, 英語, code, refactoring, 指对软件代码做一些改动以增加可读性或者简化代码结构而不影响输出结果, 软件重构需要借助重构工具完成, 重构工具能够修改代码同时修改所有引用该代码的地方, 在极限编程的方法学中, 重构需要单元测试来支持, 目录, 重构代码, 难点, 源流, 重构方法简单列表, 自动化, 硬件重构, 注释, 参考文献, 引用, . 此條目需要編修 以確保文法 用詞 语气 格式 標點等使用恰当 2017年3月20日 請按照校對指引 幫助编辑這個條目 幫助 討論 代码重构 英語 code refactoring 指对软件代码做一些改动以增加可读性或者简化代码结构而不影响输出结果 软件重构需要借助重构工具完成 重构工具能够修改代码同时修改所有引用该代码的地方 在极限编程的方法学中 重构需要单元测试来支持 目录 1 重构代码 2 难点 3 源流 4 重构方法简单列表 5 代码重构自动化 6 硬件重构 7 注释 8 参考文献 8 1 引用 8 2 來源 9 外部链接 10 参见重构代码 编辑 nbsp 图一 nbsp 图二 在软件工程学裡 重构代码一词通常是指在不改变代码的外部行为情况下而修改源代码 在极限编程或其他敏捷方法学中 重构常常是软件开发中的一部分 开发者轮流增加新的测试和功能 并重构代码来增进代码间的清晰性和一致性 同时 自动化的单元测试保证了重构后的代码仍然能够正常运作 重构既不修正错误 也不增加新的功能 它的目的是用于提高代码的可读性或者改变代码内部结构与设计或者刪除死碼 使其在将来更容易进行维护和开发 重构代码可以存在于结构层面或是语意层面 但前提是不影响代码在转换前后的功能 一种进行重构的典型案例是 一个程序在现有的逻辑结构下难以加入新的功能 因此开发人员可能会对代码进行重构 以便日后继续开发 一个重构的小范例是修改一个变量的名称使其具有更明确的含义 例如从单个字母的 i 重构为 interestRate 利率 图一 一个较复杂的重构的例子是把一段if区块中的代码变为一个子程序 图二 更复杂一点的重构是用多态性来替换if 条件式 進一步還可重新设计程序的算法 在重构中最关键的是去有意地 清理 代码 把不同的功能分开 然后对重构后的代码进行测试 任何对代码的编辑都有可能引发错误 新的实现方法需要切合实际地改善现有设计 并且不改变原软件的功能能或行为 难点 编辑代码重构也面临诸多的挑战 首先 对重构长远的影响需要在重构后才能进行深入研究和追踪 其次 重构某些底层业务逻辑或是数据库架构几乎是不可能的 最后 对接口造成影响的重构可能造成程式開發上的困境 例如 程序员若改变某接口中的方法名称 除非他或她要对所有客户端中连结到旧方法名的参考都加以编辑 否则就只能继续维护使用旧方法名的接口 并另外建立旧名对新名的映射 源流 编辑首先使用 重构 一辞于出版文献是于一篇文章 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联名出版 1 William Opdyke的博士论文于 重构 物件导向框架 伊利诺大学 1992年出版 2 重构 术语几乎至其后确定 重构这个术语是从数字与多项式的因式分解类比而来 3 如 x2 1可以被分解为 x 1 x 1 这样更好的整理并展示了式子的性质 例如式子拥有两个根 1和 1 同样 在软件重构中 结构上的改变通常会揭示原代码中曾经 隐藏 的内部结构 上面多项式的例子很好地展示了 重构 的思路 但是 一个多项式的不同表示形式并没有优劣之分 它们展现了多项式的不同性质 在不同情况下适合的表达形式不同 并且还会随着使用者的个人习惯或理解变化 这个问题于软件开发领域亦然 个别程式员可能对某既定演算法的理想结构会有不同的意见 重构方法简单列表 编辑下面是不完整的代码重构清单 长一点的清单可以在福勒的重构书找到 因为研究者们继续努力不懈的发明以及实现重构 完整清单可能永远都不存在 封装成员变量 英语 Field encapsulation Encapsulate Field 将仅限于本类使用的变量重写成私有 private 成员变量 并提供访问方法 accessor method 这种重构方式可以将与外部调用者无关的变量隐藏起来 减少代码的耦合性 并减少意外出错的概率 提取方法 Extract Method 意思是将大段代码中的一部分提取后 构成一个新方法 这种重构可以使整段程序的结构变得更清晰 从而增加可读性 这也对函数 Function 通用 类一般化 英语 Type generalization Generalize Type 将多个类 函数共用的类型抽象出可以公用的基类 base class 然后利用多态性追加每个类 函数需要的特殊函数 这种重构可以让结构更加清晰 同时可以增加代码的可维护性 函数归父 Pull Up 或译函数上移 指的是方法从子类移动到父类 函数归子 Push Down 或译函数下移 指的是方法从父类移动到子类 方法更名 英语 Rename method Rename Method 将方法名称以更好的表达它的用途 重构方法 重构前 重构后 封装成员变量 class SomeClass public int memberA class SomeClass private int memberA public int getMemberA public void setMemberA int a 方法提取 void Process MyDataSet mds Step 1 int result 0 if mds isReady int data1 mds param 0 int data2 mds param 1 Preprocess result data1 data2 Step 2 void Process MyDataSet mds Step 1 int result 0 if mds isReady result CalculateMDS mds param 0 mds param 1 Step 2 int CalculateMDS int data1 int data2 Preprocess return data1 data2 一般化类型 class Rectangle private int w h public double Area return w h class Triangle private int w h public double Area return w h 2 class Polygon private int w h public virtual double Area 0 class Rectangle public Polygon double Area return w h class Triangle public Polygon double Area return w h 2 方法更名 public double f double m double a public double calculateForce double mass double acceleration 代码重构自动化 编辑许多软件编辑器与整合环境支援重构自动化 又称为重构浏览器 枚举如下 IntelliJ IDEA Java专用 Eclipse给Java用的开发包 JDK NetBeans Java专用 Visual Studio 2005 NET专用 CodeGear Delphi Bicycle Repair Man 页面存档备份 存于互联网档案馆 Python专用 可与emacs与vi共用 Refactoring Browser Smalltalk专用硬件重构 编辑尽管代码重构一词最初只用于软件代码的重构 但近年来 硬件描述语言也出现了相应的代码重构的概念 硬件重构 hardware refactoring 是对硬件描述语言中的代码进行重构的简称 由于一般认为硬件描述语言与传统编程语言有较大的区别 4 因此硬件重构被视为与传统的代码重构不同的领域 研究者已经提出了模拟电路硬件描述语言 如VHDL AMS 所使用的自动化重构方法 5 根据他们的研究 硬件重构会在保持原本代码的仿真结果的同时 增进行为模型的可理解性 可扩展性和可重用性 并使得后续自动化编译过程的逻辑综合步骤可以产生更加符合预期的结构表示 此外 Synopsys公司的Mike Keating也研究了手动进行的数字电路硬件描述语言的重构 6 7 他所研究的目标是使复杂的硬件系统更易于理解 从而提高设计人员的生产力 注释 编辑参考文献 编辑引用 编辑 存档副本 PDF 2007 11 10 原始内容 PDF 存档于2007 04 18 存档副本 2007 11 10 原始内容存档于2018 09 20 英文重构 refactor 为 重新 re 与 因式 分解 factor 两单词的结合 硬件描述语言 维基百科 自由的百科全书 2020 05 11 中文 Kaiping Zeng Huss S A Architecture Refinements by Code Refactoring of Behavioral VHDL AMS Models 2006 IEEE International Symposium on Circuits and Systems IEEE doi 10 1109 iscas 2006 1692875 Golovchenko E A Tutorial the challenges of designing long haul WDM systems Optical Fiber Communication Conference and Exhibit Opt Soc America doi 10 1109 ofc 2002 1036216 Keating Michael Bricaud Pierre Reuse Methodology Manual for System on a Chip Designs 1998 doi 10 1007 978 1 4757 2887 3 來源 编辑 书籍 马丁 福勒 重构 改进现有代码的设计 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外部链接 编辑 英文 什么是重构 页面存档备份 存于互联网档案馆 c2 com文献 英文 Martin Fowler的关于重构的主页 页面存档备份 存于互联网档案馆 英文 William F Opdyke在1993年发表的博士论文 永久失效連結 英文 面向方面的重构 Ramnivas Laddad著 英文 软件重构的纵览 页面存档备份 存于互联网档案馆 Tom Mens和Tom Tourwe著 英文 如何编写难以维护的代码 页面存档备份 存于互联网档案馆 Roedy Green著 英文 重构工具 英文 重构 页面存档备份 存于互联网档案馆 alphabetical list 英文 重构为模式的目录 页面存档备份 存于互联网档案馆 英文 重构Java代码 页面存档备份 存于互联网档案馆 英文 通用重构连结 页面存档备份 存于互联网档案馆 英文 微控制器软件的重构 英文 Refuctoring 页面存档备份 存于互联网档案馆 重构的反面 来自Waterfall2006会议的嘲讽 英文 重构文献 英文 重构相关短文 页面存档备份 存于互联网档案馆 参见 编辑 nbsp 计算机程序设计主题 nbsp 软件主题 nbsp 工程主题 代码评审 軟體同行評審 软件设计模式 关注点分离 测试驱动开发 軟體智能 取自 https zh wikipedia org w index php title 代码重构 amp oldid 79593053, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。