写点什么

专栏:代码之丑(三)——switch 陷阱

  • 2010-11-24
  • 本文字数:1192 字

    阅读完需:约 4 分钟

又见 switch:

复制代码
switch(firstChar) {
case ‘N’:
nextFirstChar = ‘O’;
break;
case ‘O’:
nextFirstChar = ‘P’;
break;
case ‘P’:
nextFirstChar = ‘Q’;
break;
case ‘Q’:
nextFirstChar = ‘R’;
break;
case ‘R’:
nextFirstChar = ‘S’;
break;
case ‘S’:
nextFirstChar = ‘T’;
break;
case ‘T’:
throw new IllegalArgument();
default:
}

出于多年编程养成的条件反射,我对于 switch 总会给予更多的关照。在那本大名鼎鼎《重构》里,Martin Fowler 专门把 switch 语句单独拿出来作为一种坏味道来讨论。研习面向对象编程之后,看见 switch,我就会联想到多态,遗憾的是,这段代码和多态没什么关系。仔细阅读这段代码,我找出了其中的规律,nextFirstChar 就是 firstChar 的下一个字符。于是,我改写了这段代码:

复制代码
switch(firstChar) {
case ‘N’:
case ‘O’:
case ‘P’:
case ‘Q’:
case ‘R’:
nextFirstChar = firstChar + 1;
break;
case ‘T’:
throw new IllegalArgument();
default:
}

现在,至少看起来,这段代码已经比原来短了不少。当然这么做基于一个前提,就是这些字母编码的顺序确确实实是连续的。从理论上说,开始那段代码适用性更强。但在实际开发中,我们碰到字母不连续编码的概率趋近于 0。

但这段代码究竟是如何产生的呢?我开始研读上下文,原来这段代码是用当前 ID 产生下一个 ID 的,比如当前是 N0000,下一个就是 N0001。如果数字满了,就改变字母,比如当前 ID 是 R9999,下一个就是 T0000。在这里,字母也就相当于一位数字,根据情况进行进位,所以有了这段代码。

代码上的注释告诉我,字母的序列只有从 N 到 T,根据这个提示,我再次改写了这段代码:

复制代码
if (firstChar >= ‘N’ && firstChar <= ‘S”) {
nextFirstChar = firstChar + 1;
} else {
throw new IllegalArgument();
}

这里统一处理了字母为 T 和 default 的情形,严格说来,这和原有代码并不完全等价。但这是了解了需求后做出的决定,换句话说,原有代码在这里的处理中存在漏洞。

修改这段代码,只是运用了非常简单的编程技巧。遗憾的是,即便如此简单的编程技巧,也不是所有开发人员都驾轻就熟的,很多人更习惯于“平铺直叙”。 这种直白造就了代码中的许多鸿篇巨制。我听过不少“编程是体力活”的抱怨,不过,能把写程序干成体力活,也着实不值得同情。写程序,不动脑子,不体力才怪。

无论何时何地,只要 switch 出现在眼前,请提高警惕,那里多半有坑。

作者简介:

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

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

2010-11-24 17:557345
用户头像

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

关注

评论

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

Nova for Mac:强大代码编辑器的极致体验

Rose

mac软件下载 Nova代码编辑 Nova Mac破解

无需魔法,快速体验 Claude 3 ,GPT 4 在他面前就是弟弟

朱亚光

敢闯技术无人区,TCL实业即将亮相AWE 2024

极客天地

macOS Sonoma 14.4 (23E214) 正式版发布,ISO、IPSW、PKG 下载

sysin

macos macOS Sonoma

office 2016专业增强版 含office2016激活工具 mac/win

Rose

office办公软件 Office 2016 下载 office2016破解版 Msoffce2016

MATLAB R2023b提示已停止工作怎么办?

Rose

数学软件 MATLAB R2023b

[自研开源] MyData 数据集成任务的流程介绍 v0.7.1

LIEN

开源 数据集成 业务融合 API对接 mydata

益和热力选择 TDengine,实现智慧供热系统升级

TDengine

tdengine 时序数据库

非常专业的3D样机宣传视频制作工具Rotato for mac

Rose

Mac 3D样机 Rotato下载 样机宣传 软件下载

Axure RP 10中文授权码及安装教程, 从交互设计到响应式原型

Rose

原型设计 软件下载 Axure RP 授权码 Axure RP 汉化包

英伟达要小心了!爆火的Groq芯片能翻盘吗?AI推理速度「吊打」英伟达?

GPU算力

文心一言 VS 讯飞星火 VS chatgpt (210)-- 算法导论16.1 1题

福大大架构师每日一题

福大大架构师每日一题

微信小程序能代替原生App么?

天津汇柏科技有限公司

小程序 App

PopChar 10 mac直装版 特殊字符表情一键快速输入

Rose

特殊字符 Mac软件 PopChar 10新功能 PopChar 10下载 表情包

【论文速读】| 大语言模型引导的协议模糊测试

云起无垠

Soulver 3 for Mac:让数字处理变得简单直观的智能计算器

Rose

计算器 智能计算 Mac软件 Soulver 3

为什么苹果用户都在使用Dynamic Wallpaper动态壁纸软件?

Rose

动态壁纸 Dynamic Wallpaper下载 苹果壁纸下载 Dynamic Wallpaper中文版 壁纸app

AI数字虚拟人来了你会失业吗?

小魏写代码

专栏:代码之丑(三)——switch陷阱_Java_郑晔_InfoQ精选文章