重构时应避免过度思考

fmms 12年前
     <div id="news_body">     <p> <a href="/misc/goto?guid=4958188143495101898" target="_blank">重构</a>是一门在不改变软件外部行为情况下,改善既有代码内部结构的一门技术。从表面来看,重构需要引入大量的思考行为,然而,过度地思考同样会产生不利的影响。</p>     <p> <a href="/misc/goto?guid=4958329007564957186" target="_blank">Kent Beck</a> 提到,重构中面临<a href="/misc/goto?guid=4958329008370235365" target="_blank">最大的挑战就是如何做到循序渐进</a>,循序渐进指的是如何将工作分解为可控的步骤,并且每个步骤都易于管理。重构步伐过快会导致不稳定代码的出现。此外,想得越多,越是谨慎反而会严重减慢重构的步伐。</p>     <blockquote>      <p>正如许多与我结对编程的伙伴都会告诉你的那样,我有一个非常不招人喜欢的习惯:在重构时总会说“不要再想啦”。我知道这并不是我真正要说的,因为我不可能去故意表达这个意思,但是直到现在,我才有机会可以给出一个更好的解释。</p>     </blockquote>     <p> Kent 解释了“水平和垂直重构”的概念。垂直重构是指调整方法或代码块在调用堆栈中的上下顺序,然而水平重构则指的是在类似于同级别的对象间所做的调整。依 Kent 所述,重构时应避免同时做上述两种调整。</p>     <blockquote>      <p>当需要重构具有多重调用或是多重实现的对象时,就要额外小心,并且重新回到垂直和水平方法,将这两者操作分开进行,并且要时刻注意代码重构的深度。</p>     </blockquote>     <p> 话虽如此,做到并不容易⋯⋯</p>     <p> 比较好的一个办法就是使用索引卡(Index Cards):</p>     <blockquote>      <p>在电脑旁放置索引卡会帮助我保持专注。当我在处理水平重构时突然意识到还可以做垂直重构时,我会迅速记在索引卡上,然后马上回到刚才正在进行的工作中。这种方法不仅可以使我在进行下一步工作前,有效地先将手头的工作结束,同时,又不会导致某些好点子被遗忘。方法之好用,整个过程感觉就像是在做冥想,技能感受到自己的呼吸,又不会被完全自我的意识所牵绊。</p>     </blockquote>     <p> <a href="/misc/goto?guid=4958329009162106387" target="_blank">J. B. Rainsberger</a> 同意这种观点并同时指出:</p>     <blockquote>      <p>无论你在做什么,想要专注时,手边准备一张卡片和一支笔。当有奇思妙想突然在脑海中闪现,而这些事情又不需要立刻处理时,就可以用 5 个或更少的字将它写下来,然后继续回到刚才所作的事情中。效果甚是神奇。</p>     </blockquote>     <p> 这与 <a href="/misc/goto?guid=4958329009950702489" target="_blank">Joshua Kerievsky</a> 所提倡的 Narrow Changem 模式非常相似。每次只专注于一小部分的变化点,然后再继续在后续的重构中应用 Narrow Change 或是 Parallel Change 原则。</p>     <p> 尽管重构中需要思考,但是,保持专注并避免潜在的干扰对良好的重构行为是很有必要的。Kent 说道:</p>     <blockquote>      <p>我的同伴经常会在重构的过程中产生一些好的想法,比如如何将一些函数挪到B中。这时我就会告诉他停止思考。我真实的目的并不是不想让他去思考,我只想让他专注的把手头的事情先做完。就像我们往墙上钉钉子,钉子才刚钉进去了一半,我们没有理由放下手里的活去钉另外一个。</p>     </blockquote>     <p> <strong>查看英文原文:</strong><a href="/misc/goto?guid=4958329010750926149" target="_blank">Stop Thinking During Refactoring</a></p>     <p> 译者:贾国清</p>     <div id="come_from">      来自:      <a id="link_source2" href="/misc/goto?guid=4958329011546271180" target="_blank">InfoQ</a>     </div>    </div>