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

又见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 \u0026gt;= ‘N’ \u0026amp;\u0026amp; firstChar \u0026lt;= ‘S”) {\    nextFirstChar = firstChar + 1;\  } else {\    throw new IllegalArgument();\  }\
\

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

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

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

\

作者简介:

\

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

\

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值