阅读更多

稍早的文章评论里,Jon Eaves 表达了把重构做为动词过度使用的忧虑。尤其是重构(refactoring)【注1】和重新架构(rearchitecting)之间的界线非常模糊,重构被用作在你回头做第二遍的、任何行为的标签。你明白吗?Jon 是对的。

 

被 Martin Fowler 定义的重构,是一个非常具体的术语,以数学上等同的具体术语为基础【注2】。重构是关于小的、“行为保留”的增加的、安全步骤。重构不是在应用程序里回头去“填充空白”的借口。

 

让我们给出一些具体的例子来说明什么不是重构,下面的行为都不被视作重构:

  • “优化”(又称作增加)错误处理。
  • 增加日志。
  • 勉强塞满另一个功能。
  • 提高测试覆盖率(虽然它非常接近重构了)。
  • 当老板不在的时候,玩扫雷游戏。

重构是“优化现有代码的设计”。在本文,优化意味着使之更加易于理解和/或更加灵活。下面的行为都被视作重构:

  • 把臃肿的方法拆分成较小的、功能集中的方法。
  • 重新命名变量和参数,使之更有意义。
  • 把功能从一个类移到另一个类(更加适当)。
  • 基于一个类的方法,产生一个接口,然后让这个类实现该新接口。

注意,我说的这些可以是重构的行为。决定它们是否属于重构的大部分因素在于你是如何去做的。重申:重构行为,是小而安全的步骤,最好是可逆的步骤。如果你不得不考虑它是否可以运行,那么它就不再是重构行为了。

 

那么如何区别重构与重新架构或再设计呢?重构是在键盘上完成的,接触真正的代码。而重新架构,最好是在白板上(或最近的酒吧)完成的。重新架构涉及了较大的愿景,考虑下一周/月/年的规划。重构是你用来帮助自己达成目标的技巧之一。

 

再设计(Redisigning)是一个术语,覆盖了任何时候你正在重新考虑的设计决定。由于敲代码是设计行为,甚至到了打字阶段,再设计肯定包含重构。毕竟,如果你不稍微再设计,就不太容易提高设计。然而,在通常情况,“再设计”意味着放弃老的解决方案,提出新的解决方案,或多或少地从头开始。如果你在白板上做再设计,可能是没问题的,与重新架构的举动类似,你仍然可以通过重构达成目标。如果你在键盘上完成再设计,这就不是重构了。

 

重写(Re-writing)类似再设计,不过它只是在键盘上完成。重写通常是受到了头痛的伤害,但是它常常让你丢掉惰性而到达一个更好的地方。类似拍卖和搬到了印度班加罗尔。

 

在实战中,会遇到混合的情况。重构应该是一个开发人员使用的日常进程的一部分,当你这样看的时候,界线会变得模糊。比如:

  • 注意,你需要在业务逻辑里为第二种部件增加支持,这是一个设计行为。
  • 从现有部件抽出一个新的接口类,在此过程中重新命名现有部件,这是一个重构的行为。
  • 用新接口代替部件类的所有适合的引用,是一个重构行为。
  • 开发第二个部件,增加到应用程序里,是一个设计行为。

如果你最初开发了两个部件,后来才注意到公用的情况,该怎么办?好的,这是重构行为,可能要集中在以多态取代条件式的重构上。但是从外部看,这可能看起来非常像重写;必定(相对地)大量代码要消除掉。但是,不管你用什么方式削减,写第二个部件就不是一个重构行为。

 

重构更倾向于保持代码简单、灵活,而不是做对事情。做对事情经常涉及到添加新代码,或再设计应用程序的大块功能。使其灵活只是为了使其更加容易。这样说的话,重构最好被看做是一项赋能(enabling)行为。

  

如你所知,如果我写这篇文章不是在深夜,或许本文会更加连贯:) 如果你想更多了解重构,去看看 Fowler 的书。

  • 注2:重构这个术语是从数字与多项式的因式分解类比而来[1]。如,x2 − 1 可以被分解为 (x + 1)(x − 1), 这样揭示了前面的形式不可见的内部结构(如两个根 +1 和−1)。同样,在软件重构中,在可见结构上的改变通常会揭示原代码中“隐藏”的内部结构。http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84
来自: 腊八粥
2
0
评论 共 8 条 请登录后发表评论
8 楼 qlzw226 2014-09-15 09:33
  

7 楼 qlzw226 2014-09-15 09:33
6 楼 qlzw226 2014-09-15 09:32
<table border=3>
   <tr>
      <th> </th>
      <td> </td>
   <tr>
</table>
5 楼 rex0654335 2014-09-14 13:44
||||||
|||||
|||||
||||
||||
|||
|||
||
||
|
|
4 楼 zoutuo1986 2014-09-12 17:21
A
3 楼 cntaizi 2014-09-12 15:43
1
2345
2 楼 cntaizi 2014-09-12 15:43
|||
||
||
|
|
1 楼 white_crucifix 2014-09-11 21:43
@fangang

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 警惕使用jvm参数CMSRefProcTaskProxy

     昨天中午的时候, 团队的兄弟找我看一个现象: 原先因为堆外内存使用过多会crash掉的java应用, 设置了最大堆外内存量(MaxDirectMemorySize)后jvm不会crash, 但出现了机器的两颗CPU全部被占满, 而且java程序没有响应...

  • JVM如何理解Java泛型类

     原因很简单, Pair在编译阶段已经被类型擦除为Pair了,它的setFirst方法变成了setFirst(Object fir)。 那么 SonPair中   setFirst(String)当然无法覆盖住父类的setFirst(Object)了。  这对于多态来说确实是...

  • crash相关资料仅做个人记录

    [讨论] JVM Crash 请教原因 http://rednaxelafx.iteye.com/blog/730461  借助HotSpot SA来一窥PermGen上的对象 http://blog.csdn.net/tjiyu/article/details/53948009  Java即时编译(JIT编译):运行时把Class文件...

  • ARM平台动态库加载顺序不同引起的程序崩溃

    我鼓起勇气向前同事(principal engineer)请教,然后他提供了一个方法(如果想手工修改load顺序,大概这样 你的主程序把main改成__main__,编成so, 然后另外一个lanch程序里面dl_open 加载各个so,最后load主程序so...

  • 神农班2019年总结

    :学习kernel的子系统实现原理,为解决kernel crash或者linux系统提供基础知识。 * 目标 :熟悉内存管理子系统和进程子系统(包括进程调度)实现原理,系统遇到问题时候,能够根据这些知识做进一步的原因分析。 * ...

  • 消息中间件学习总结(1)——RocketMQ之专访RocketMQ联合创始人:项目思路、技术细节和未来规划

    分区容忍性,除了整个网络故障外(如光纤被掘断),其它故障(如丢包、乱序、抖动、甚至是网络分区节点 crash )都不能导致整个系统无法正确响应(原文:No set of failures less than total network failure is ...

  • JNI书籍特供

    使用大量本地引用而未通知 JVM 正确性缺陷 使用错误的 JNIEnv 未检测异常 未检测返回值 未正确使用数组方法 未正确使用全局引用 避免常见缺陷 根据 JNI 规范验证新代码 分析方法跟踪 使用 -...

  • 自己关于VM的帖的目录

    2014-02-09: [url=http://hllvm.group.iteye.com/group/topic/39493#post-258162]回复:想研究HotSpot C2编译器编译过程,请教如何入手?[/url] 2014-02-03: [url=http://www.iteye.com/topic/1132986#2406056]关于...

  • jni函数说明

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息...... Chap 4:用javah产生一个.h文件......Chap5:jni教程(very very good) 19 ...Chap6: JNI传递返回值......15.2.2.3 传递字符串......

  • JNI 编程文库

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息...... Chap 4:用javah产生一个.h文件......Chap5:jni教程(very very good) 19 ...Chap6: JNI传递返回值......15.2.2.3 传递字符串......

  • Jni函数调用大全

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 ...Chap 4:用javah产生一个.h文件......Chap6: JNI传递返回值......15.2.2.3 传递字符串......15.2.2.4 传递整

  • Jni函数调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息...... Chap 4:用javah产生一个.h文件......Chap5:jni教程(very very good) 19 ...Chap6: JNI传递返回值......15.2.2.3 传递字符串......

  • JNI_编程技术__网文整理

    &lt;br /&gt;  Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good)19 Chap6: ...

  • Java:简述对Serializable序列化的认识

    比如在课堂上有位学生遇到一个问题,于是举手向老师请教,这时老师帮他解答,那么这位学生的举手其实就是一个标识,自己解决不了问题请教老师帮忙解决。 在Java中的这个Serializable接口其实是给jvm看的,通知jvm,...

  • 最详细的解释小白也能听懂,实战篇

    于是请教了一些年过30还发展很好的前辈。让我对"程序员的中年危机"有了进一步的看法。 其实我们应该看到互联网的本质,它本就是一个生命周期及其短暂的行业,快速的迭代、敏捷的开发、风口的来去,这个行业充满了...

  • jni使用问题总结

    碰到一些问题,最终都解决了,现总结如下: 1、内存溢出错误Crash due to Stack Overflow 程序运行过程中碰到第一篇博客中描述的问题4.1.3 Crash due to Stack Overflow,后来通过调整JVM参数,设置-Xss2m将内存溢出...

  • Umi-OCR-main.zip

    Umi-OCR-main.zip

  • 基于springboot+Web的毕业设计选题系统源码数据库文档.zip

    基于springboot+Web的毕业设计选题系统源码数据库文档.zip

  • 基于springboot校外兼职教师考勤管理系统源码数据库文档.zip

    基于springboot校外兼职教师考勤管理系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics