10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

专栏:代码之丑(四)——代码找茬游戏

2010 年 11 月 25 日

这是一个找茬的游戏,下面三段代码的差别在哪:

复制代码
if (1 == insertFlag) {
retList.insert(i, newCatalog);
} else {
retList.add(newCatalog);
}
if (1 == insertFlag) {
retList.insert(m, newCatalog);
} else {
retList.add(newCatalog);
}
if (1 == insertFlag) {
retList.insert(j, newPrivNode);
} else {
retList.add(newPrivNode);
}

答案时间:除了用到变量之外,完全相同。我想说的是,这是我从一个文件的一次 diff 中看到的。

不妨设想一下修改这些代码时的情形:费尽九牛二虎之力,我终于找到该在哪改动代码,然后改了。作为一个有职业操守的程序员,我知道别的地方也需要类似的修改。 于是,趁人不备,把刚做修改拷贝了一份,放到另外需要修改的地方。修改了几个变量,编译通过了。世界应该就此清净,至少问题解决了。

好吧!虽然这个程序员有职业操守的程序员,却缺少了些职业技能,至少在挥舞着“拷贝粘贴”的锤子时,他没有嗅到散发出的臭味。

只要意识到坏味道,修改是件很容易的事,提出一个新函数即可:

复制代码
void AddNode(List& retList, int insertFlag, int pos, Node& node) {
if (1 == insertFlag) {
retList.insert(pos, Node);
} else {
retList.add(node);
}
}
{1}

于是,原来那三段代码变成了三个调用:

复制代码
AddNode(retList, insertFlag, i, newCatalog);
AddNode(retList, insertFlag, m, newCatalog);
AddNode(retList, insertFlag, j, newPrivNode);

当然,这种修改只是一个局部的微调,如果有更多的上下文信息,我们可以做得更好。

重复,是最为常见的坏味道。上面这种重复实际上是非常容易发现的,也是很容易修改。但所有这一切的前提是,发现坏味道。长时间生活在这种代码里面,我们会对坏味道失去嗅觉。更可怕的是,一个初来乍到的嗅觉尚灵敏的人意识到这个问题,那些失去嗅觉的人却告诫他,别乱动,这挺好。

趁嗅觉尚在,请坚持代码正义。

作者简介:

郑晔,ThoughtWorks 公司咨询师,拥有多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式,加入 ThoughtWorks 公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏捷开发方法方面的咨询服务。他的 blog 是梦想风暴

查看原文:代码之丑(四)

2010 年 11 月 25 日 18:014466
用户头像

发布了 22 篇内容, 共 12.4 次阅读, 收获喜欢 39 次。

关注

评论

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

Java架构师必会的知识清单,如何让你技术上的提升面试时的丰收

Crud的程序员

Java 程序员 架构

游戏夜读 | 游戏作品的生命力

game1night

我做了回视频,告诉你需要用到哪些工具

和牛

工具

python自学 第三章 python语言基础之保留字、标识符与内置函数

WEB前端修行日志

Python 编码格式

一款dubbo服务可视化调试工具

程序员架构进阶

dubbo 工具 RPC 服务化 28天写作

Redis布隆过滤器原理与实践

云流

Java redis 面试

android进阶之光!双非渣本Android四年磨一剑,进阶学习资料!

欢喜学安卓

android 程序员 面试 移动开发

阿里P8大神分享的并发编程笔记,颠覆了我以往“正确“的认知

云流

Java 程序员 面试 并发编程

RocketMQ源码分析之消息拉取流程

互联网架构师小马

Android面试总结(一)

我就感觉到快

写在开课前

5x

「架构师训练营 4 期」 第三周 - 001

凯迪

C2C交易系统APP开发|C2C交易软件开发

系统开发

区块链交易所系统开发|区块链交易所软件APP开发

系统开发

基因编辑食品,能否端上我们的餐桌?

脑极体

android开发要学什么语言!掌握这些Android开发热门前沿知识,挥泪整理面经

欢喜学安卓

android 程序员 面试 移动开发

python自学 第四章 python语言基础之变量

WEB前端修行日志

Python 编码格式

产品经理训练营笔记-认识产品经理(上)

.nil?

Lambda 和 Stream API

学个球

Java Lambda Stream<T>

现成矿机挖矿软件系统APP开发案例

系统开发

如何实现CentOS服务器的扩容??

冰河

Linux centos 扩容 服务器

编程语言学习心得 (完全版) -- 不要害怕遗忘和混淆

蔡超

Go 程序员 个人成长 编程语言

非科班生的逆袭:四面斩获字节跳动offer,聊聊我的个人历程

互联网架构师小马

Java 面试 算法 操作系统 计算机组成原理

一篇让你彻底理解网关是什么的文章

Java架构师迁哥

OSPF的八大特点介绍

Windows文件夹还能更改颜色?

程序员的时光

程序员 七日更 28天写作

日语复习 Day03【~あまり(に)】

IT蜗壳-Tango

程序员 七日更 日语语法

使用 JSX 建立 Markup 组件风格

三钻

前端 组件化

RocketMQ解析

石刻掌纹

JVM内存模型总结和上手实践,亲测学完没脱发

互联网架构师小马

「架构师训练营 4 期」 第三周 - 002

凯迪

专栏:代码之丑(四)——代码找茬游戏-InfoQ