写点什么

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

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

关注

评论

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

华为硬件配置命令,建议收藏

Ethereal

网络工程师 网络技术 华为设备 厂商设备 运维技术

【漫画】数据云,真香在哪?

星环科技

大数据

给弟弟的信第15封|情绪控制的重要性

大菠萝

28天写作

5G专网+区块链:构筑智慧政务“安全信任基石”

CECBC

PingCAP 入选 CB Insights 中国「数据链路安全领航者」榜单,保障全球用户存储安全

PingCAP

Java Web开发之API Boy的进阶之路

@零度

Java web API boy

前端开发之Vue框架的优势

@零度

前端开发 Vue优势

联邦学习在光大科技的落地应用

博文视点Broadview

从前端到全栈 -- 最全面向对象总结

程序员海军

Java 面向对象

跟着动画学Go数据结构之插入排序

宇宙之一粟

golang 数据结构 插入排序 12月日更

一文讲述数仓组件SysCache

华为云开发者联盟

事务 存储 GaussDB(DWS) SysCache 缓存信息

解决rabbitmq消息队列的顺序及重复消费问题

编程江湖

大数据

AI 收藏夹 Vol.004:虚拟爱豆出道!

Zilliz

人工智能 神经网络 AI

简述移动端IM开发的那些坑:架构设计、通信协议和客户端

BeeWorks

神器来袭,手把手教你使用 Milvus_cli

Zilliz

数据库 命令行

万字教你如何用 Python 实现线性规划

华为云开发者联盟

Python 函数 线性规划 求解器 单纯形法

开源投资回报率高达4倍!欧盟委员会全力推动开源软件发展

腾源会

开源

中石化信息化数字化首席专家李剑峰:数字化转型中关键基础软件的国产化应用

OceanBase 数据库

开源 国产化 oceanbase 中石化

Java 集合框架面试问题集锦

编程江湖

面试题 JAVA开发 java编程

未来企业如何应对人才之争

BeeWorks

重磅|腾讯云开源业界首个 etcd 一站式治理平台 Kstone

腾源会

开源 cncf Kstone

Nebula Graph 源码解读系列 | Vol.06 MATCH 中变长 Pattern 的实现

NebulaGraph

图数据库 知识图谱 分布式图数据库

东汉末年,他们把「服务雪崩」玩到了极致

悟空聊架构

熔断 28天写作 服务雪崩 悟空聊架构 12月日更

今夜无眠

Tiger

28天写作

“十四五”规划,开源重塑软件发展新生态,获国家重点扶持

腾源会

开源

元气部落盲盒系统开发元气部落app开发

风行无疆

手写清除console的loader

编程江湖

前端开发

Linux 基金会发布 2021 年度报告,预测今年收入为 1.77 亿美元

腾源会

Linux 开源

资讯|WebRTC M95 更新

网易云信

WebRTC

超细!细说Zookeeper选举的一个案例(上)

恒生LIGHT云社区

golang zookeeper Go 语言

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