写点什么

重构时应避免过度思考

  • 2012-02-11
  • 本文字数:1043 字

    阅读完需:约 3 分钟

重构是一门在不改变软件外部行为情况下,改善既有代码内部结构的一门技术。从表面来看,重构需要引入大量的思考行为,然而,过度地思考同样会产生不利的影响。

Kent Beck 提到,重构中面临最大的挑战就是如何做到循序渐进,循序渐进指的是如何将工作分解为可控的步骤,并且每个步骤都易于管理。重构步伐过快会导致不稳定代码的出现。此外,想得越多,越是谨慎反而会严重减慢重构的步伐。

正如许多与我结对编程的伙伴都会告诉你的那样,我有一个非常不招人喜欢的习惯:在重构时总会说“不要再想啦”。我知道这并不是我真正要说的,因为我不可能去故意表达这个意思,但是直到现在,我才有机会可以给出一个更好的解释。

Kent 解释了“水平和垂直重构”的概念。垂直重构是指调整方法或代码块在调用堆栈中的上下顺序,然而水平重构则指的是在类似于同级别的对象间所做的调整。依 Kent 所述,重构时应避免同时做上述两种调整。

当需要重构具有多重调用或是多重实现的对象时,就要额外小心,并且重新回到垂直和水平方法,将这两者操作分开进行,并且要时刻注意代码重构的深度。

话虽如此,做到并不容易⋯⋯

比较好的一个办法就是使用索引卡(Index Cards):

在电脑旁放置索引卡会帮助我保持专注。当我在处理水平重构时突然意识到还可以做垂直重构时,我会迅速记在索引卡上,然后马上回到刚才正在进行的工作中。这种方法不仅可以使我在进行下一步工作前,有效地先将手头的工作结束,同时,又不会导致某些好点子被遗忘。方法之好用,整个过程感觉就像是在做冥想,技能感受到自己的呼吸,又不会被完全自我的意识所牵绊。

J. B. Rainsberger 同意这种观点并同时指出:

无论你在做什么,想要专注时,手边准备一张卡片和一支笔。当有奇思妙想突然在脑海中闪现,而这些事情又不需要立刻处理时,就可以用 5 个或更少的字将它写下来,然后继续回到刚才所作的事情中。效果甚是神奇。

这与 Joshua Kerievsky 所提倡的 Narrow Changem 模式非常相似。每次只专注于一小部分的变化点,然后再继续在后续的重构中应用 Narrow Change 或是 Parallel Change 原则。

尽管重构中需要思考,但是,保持专注并避免潜在的干扰对良好的重构行为是很有必要的。Kent 说道:

我的同伴经常会在重构的过程中产生一些好的想法,比如如何将一些函数挪到 B 中。这时我就会告诉他停止思考。我真实的目的并不是不想让他去思考,我只想让他专注的把手头的事情先做完。就像我们往墙上钉钉子,钉子才刚钉进去了一半,我们没有理由放下手里的活去钉另外一个。

查看英文原文: Stop Thinking During Refactoring

2012-02-11 21:024120
用户头像

发布了 156 篇内容, 共 55.5 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

Java 序列化时间

Java-fenn

Java

企业数据治理过程中都要经历的四个阶段?你的企业处在哪个阶段?

雨果

数据治理

JAVA学习1_PATH环境变量配置

Java-fenn

Java

Java 将Excel转为UOS

Java-fenn

Java

Java开发学习(三十一)----Maven属性与版本管理

Java-fenn

Java

Java 网络编程之 InetAddress 类详解,URL 和 URI 的区别,URLDecoder 和 URLEncoder,IPv6 和 IP...

Java-fenn

Java

SAP 电商云 Spartacus UI 有状态 的 url 和 title 属性的赋值代码

汪子熙

angular SAP SAP UI5 Spartacus 9月月更

2022年9月中国数据库排行榜:榜眼、探花纷纷易主,AnalyticDB蝉联榜单十强

墨天轮

数据库 opengauss TiDB 国产数据库 达梦

leetcode 110. Balanced Binary Tree 平衡二叉树(简单)

okokabcd

LeetCode 数据结构与算法

Java基础 | 关于Final Static Abstract修饰需要注意的地方

Java-fenn

Java

如何將私有的 JAR 檔加入到由 Apache Maven 管理的 Java 專案中

Java-fenn

Java

全面吃透JAVA Stream流操作,让代码更加的优雅

Java-fenn

Java

Java基础 | Java中引用与指针的关系

Java-fenn

Java

给数据技术初学者:解读从数据编织到增强分析20个最新数据技术概念

雨果

数据湖 数据编织 数仓一体

vue2数据响应式原理——数据劫持(初始篇)

海底烧烤店ai

Vue 前端 9月月更

vue2数据响应式原理——数据劫持(数组篇)

海底烧烤店ai

Vue 前端 9月月更

基于Java springMVC+MySQL的大学校园BBS论坛网站设计与实现

Java-fenn

Java

Java&C++题解与拓展——leetcode667.优美的排列 II【++在java和C++中的差异】

Java-fenn

Java

Java基于JSP+Servlet的社区出入健康登记系统

Java-fenn

Java

JAVA:List 与 数组 相互转换

Java-fenn

Java

JAVA面试题——CAS原理

Java-fenn

Java

LED柔性屏的发展趋势

Dylan

柔性屏 LED显示屏 led显示屏厂家

Java必会基础题,量不多,但每天进步一点也是好的

Java-fenn

Java

java读取movielens数据txt

Java-fenn

Java

易周金融分析 | 数字人民币生态发展等再迎监管重磅发言;易观千帆发布用户体验GX指数

易观分析

用户体验 数字人民币 GX指数

Java面向对象8——抽象类和抽象方法(知识点+使用方法)

Java-fenn

Java

Java面试题之IO流

Java-fenn

Java

2022年7月互联网医疗领域月度观察

易观分析

行业报告 互联网医疗

java培训班选择哪些比较好呢

小谷哥

vue2数据响应式原理——依赖收集和发布订阅

海底烧烤店ai

Vue 前端 9月月更

为什么阿里人能够快速成长?看完他们 Java 架构进化笔记,我秒懂!

Java-fenn

Java java面试 Java面试题

重构时应避免过度思考_研发效能_Vikas Hazrati_InfoQ精选文章