写点什么

重构时应避免过度思考

  • 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:024177
用户头像

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

关注

评论

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

【愚公系列】2022年11月 Go教学课程 039-文件操作

愚公搬代码

11月月更

Matplotlib基础教程之折线图

芯动大师

Python matplotlib 11月月更

快速创建软件安装包-ClickOnce

沙漠尽头的狼

Best Practices for Node.js Security

Mahipal_Nehra

JavaScript node.js security Node Best Practice

聊聊香港优才(56/100)

hackstoic

一文搞懂Go读写Excel文件

闫同学

Go 后端 11月月更

跟着卷卷龙一起学Camera--MIPI 02

卷卷龙

ISP camera 11月月更

第一篇文章 | 记录我的Java学习之路 | 一切从零开始

祖国滴花骨朵儿

学习笔记 Java学习 零基础 11月月更

写给关系数据库开发者的 TDengine 入门指南

TDengine

数据库 tdengine 时序数据库

网络地址转换(NAT)(一)

我叫于豆豆吖.

11月月更

小平台SEO服务崛起:有搜索习惯和需求就有SEO服务

石头IT视角

python小知识-python序列化

AIWeker

Python 人工智能 python小知识 11月月更

2022-11-02:以下go语言代码输出什么?A:编译错误;B:apple;C:ant;D:panic。 package main import “fmt“ func main() {

福大大架构师每日一题

golang 福大大 选择题

【Linux】调试器-gdb使用

过眼云烟

学习 记录 11月月更

深度测评FL Studio性能,多年Fl Studio使用感受分享

懒得勤快

如何免安装使用 Python?推荐 17 个在线的 Python 解释器!

Python猫

Python

从柯里化讲起,一网打尽 JavaScript 重要的高阶函数

掘金安东尼

前端 11月月更

uniapp多端分享(app,小程序,公众号)

格斗家不爱在外太空沉思

vue.js uniapp 11月月更

重磅!哈啰 Quark Design 正式开源,下一代跨技术栈前端组件库

Allan sir

前端 前端开发 WebContents 11月月更

Apache Beam基本架构

穿过生命散发芬芳

11月月更 Apache Beam

从1024开始,我们漫谈编程的本质

闫同学

编程 编译原理 11月月更

1024共码未来(一览中华风华,API First)

叶秋学长

程序员 API 1024 11月月更

微信小程序—制作一个简单的跑步小程序

格斗家不爱在外太空沉思

JavaScript 微信小程序 11月月更

互联网安全架构设计原则

阿泽🧸

互联网安全 11月月更

dns-client占用cpu过高的问题解决方案

我是一个茶壶

win10 DNS 11月月更

uniapp简单入门

格斗家不爱在外太空沉思

vue.js uniapp 11月月更

峰会实录 | StarRocks PMC Chair 赵纯:数据分析的极速统一3.0 时代

StarRocks

数据库

铸剑记:2022国产手机自研技术演义

脑极体

🚀使用“release-it”一气呵成:version、tag、changelog 等

小鑫同学

前端 nodejs 11月月更

web--文件上传

我是一个茶壶

WEB安全 文件上传 11月月更

计算机网络:组帧

timerring

计算机网络 11月月更

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