写点什么

专栏:代码之丑(三)——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:557085
用户头像

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

关注

评论

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

淘宝官方商品、交易、订单、物流接口列表(淘宝oAuth2.0接口),API稳定、QPS高的方案

tbapi

淘宝店铺订单接口 淘宝店铺订单交易接口 淘宝店铺订单详情接口 淘宝店铺订单物流接口

TinkerTool System v8.93免激活版 Mac系统维护工具

理理

Topaz Video AI下载安装 地表最强视频无损放大修复工具

理理

KeyKey — Typing Practice for mac(易于管理的打字辅导工具)

理理

Python数据处理之导入导出excel数据

AntDream

Python 人工智能 大数据 数据分析 数据处理

win版Enscape (3D渲染器) v4.1特别版

iMac小白

win版Adobe Photoshop 2024 (PS2024) v25.9.1直装版

iMac小白

win版Broadgun pdfMachine Ultimate(PDF编辑办公软件) v20.25 注册版

iMac小白

IRC客户端 Textual for Mac v7.2.3免激活版

理理

win版Adobe Lightroom Classic 2024(LrC2024) v13.3.1.1(x64)直装版

iMac小白

win版JetBrains CLion 2024(C/C++集成开发环境) v2024.1.3 中文特别版

iMac小白

鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的

AntDream

flutter 鸿蒙 kotlin React android jetpack

Android面试题之Kotlin协程一文搞定

AntDream

面试 kotlin 协程 协程原理 android jetpack

win版Fast Screen Recorder(录屏软件) v2.0.0.9 直装版

iMac小白

Android面试题之Kotlin协程到底是什么?它是线程吗?

AntDream

面试 kotlin 协程 协程原理 android jetpack

win版Agisoft Metashape Professional (3D建模软件) v2.1.2 特别版

iMac小白

爆赞!GitHub首本前端开发实战Vue.js3,标星果然百万名不虚传

Geek_12490f

编程 程序员 前端 #Github VUE 3.0 源码解析

从Purge机制说起,详解GaussDB(for MySQL)的优化策略

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号2024年6月PK榜

漆包线行业你了解多少?专业漆包线工厂智能化生产管理系统

万界星空科技

mes 万界星空科技 漆包线mes 漆包线 漆包线工厂

Git是如何保存和记录数据的——数据对象

AntDream

Git Submodule git merge git 规范 git hook

win版Tracktion Software Waveform 13 Pro(音乐制作软件) v13.1.2 直装版

iMac小白

win版Icecream PDF Editor Pro(pdf编辑器) v3.24 激活版

iMac小白

万界星空科技MES打造数字化生产车间

万界星空科技

数字化转型 数字化 mes 万界星空科技 数字化车间

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