QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

专栏:代码之丑(一)——让判断条件做真正的选择

  • 2010-11-17
  • 本文字数:1039 字

    阅读完需:约 3 分钟

诸位看官,上代码:

复制代码
if (0 == retCode) {
SendMsg("000", "Process Success", outResult);
} else {
SendMsg("000", "Process Failure", outResult);
}

乍一看,这段代码还算比较简短。那下面这段呢?

复制代码
if(!strcmp(pRec->GetType(), RECTYPE::INSTALL)) {
CommDM.ChangGroupInfo(const_cast(CommDM.GetAttr("IPAddress", &(pGroup->m_Attr))), true);
} else {
CommDM.ChangGroupInfo(const_cast(CommDM.GetAttr("IPAddress", &(pGroup->m_Attr))), false);
}

看出来问题了吗?经过仔细的对比,我们发现,如此华丽的代码,if/else 的执行语句真正的差异只在于一个参数。第一段代码,二者的差异只是发送的消息,第二段代码,差异在于最后那个参数。

看破这个差异之后,新的写法就呼之欲出了,以第一段代码为例:

复制代码
const char* msg = (0 == retCode ? "Process Success" : "Process Failure");
SendMsg("000", msg, outResult);

为了节省篇幅,我选择了条件表达式。我知道,很多人不是那么喜欢它。如果 if/else 依旧是你的大爱,勇敢追求去吧!

由这段代码调整过程,我们得出一个简单的规则:

  • 让判断条件做真正的选择。

对于前面调整的代码,判断条件真正判断的内容是消息的内容,而不是消息发送的过程。经过我们的调整,获取消息内容和发送消息的过程严格分离开来。

消除了代码中的冗余,代码也更容易理解,同时,给未来留出了可扩展性。如果将来 retCode 还有更多的情形,我们只要调整消息获取的部分进行调整就好了。当然,封装成函数是一个更好的选择,这样代码就变成了:

复制代码
SendMsg("000", msgFromRetCode(retCode),outResult);

至于第二段代码的调整,留给你练手了。

这样丑陋的代码是如何从众多代码中脱颖而出的呢?很简单,只要看到,if/else 执行块里面的内容相差无几,需要我们人工比字符寻找差异,恭喜你,你找到它了。

作者简介:

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

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

【编者按】:这是 InfoQ 中文站新推出的专栏栏目。专栏旨在邀请国内一线的技术领域专家,定期撰写发表连载专栏,从深度和质量上为国内的技术从业者提供专业性、持续性的知识分享。这个《代码之丑》专栏计划推出系列共十篇,敬请期待后续精彩内容。也欢迎向 InfoQ 中文站推荐专栏作者及内容

2010-11-17 21:0310967
用户头像

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

关注

评论

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

架构师知识笔记3

felix徐

全球最大规模对话生成模型问世!百度发布PLATO-XL,让机器像人一样思考和对话

科技热闻

干货打包!最新实时同步5大应用场景,4种实现方案分享(有彩蛋)

tapdata

他说:“只是单纯的想用Python收集一些素颜照,做机器学习使用”,“我信你个鬼!”

梦想橡皮擦

9月日更

谁说GitHub才能出经典?来自牛客网的Java程序员逆袭手册才是YYDS

Java 程序员 面试 计算机 牛客网

Go 语言网络库 getty 的那些事

阿里巴巴中间件

开源 云原生 Go 语言

如何加速云原生数据应用?这个开源项目备受关注

阿里巴巴中间件

阿里云 开源 云原生 中间件

带你了解 HBase 数据模型和 HBase 架构

华为云开发者联盟

数据库 HBase 数据模型 HBase 架构 NoSQL 数据库

K6 在 Nebula Graph 上的压测实践

NebulaGraph

Alibaba官网最新版:SpringBoot+SpringCloud微服务全栈开发小册

Java 程序员 架构 面试 计算机

「技术人生」第6篇:技术同学应该如何理解业务?

阿里巴巴中间件

阿里云 云原生 技术人生

秀出新天际的 SpringBoot 笔记,让开发像搭积木一样简单

Java 架构 面试 Spring Boot

Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践

阿里巴巴中间件

阿里云 Serverless 云原生 中间件

12 堂干货直播课,8 位 Serverless 大咖带你零基础晋级 Serverless 高手

阿里巴巴中间件

阿里云 Serverless 云原生 中间件

车联万物,有 Z-ONE SOA+AIoT!

SOA开发者

软件定义汽车

Dubbo 和 HSF 在阿里巴巴的实践:携手走向下一代云原生微服务

阿里巴巴中间件

阿里云 云原生 中间件

F5 Networks收购云安全初创公司Threat Stack

BeeWorks

车联万物,有Z-ONE SOA+AIoT!

SOA开发者平台

AIOT SOA 软件定义汽车 OTA

如何才能成为一名合格的架构师?

秋天

架构师

带你全面的了解二叉树

华为云开发者联盟

数据 二叉树 存储 数据检索 结点

Redis分布式锁,你用对了吗?

Java 架构 面试 分布式 后端

『 JS算法-力扣557题』反转字符串中的单词 III

德育处主任

JavaScript 算法 大前端 js js算法

什么是嵌入式系统及其应用?

cdhqyj

嵌入式

漫画 | 一口气搞懂 Serverless !

阿里巴巴中间件

阿里云 云原生 中间件

爱奇艺 TensorFlow Serving 内存泄漏优化实践

爱奇艺技术产品团队

内存

与顶级互联网公司技术大佬面对面聊聊RocketMQ吧!

阿里巴巴中间件

阿里云 开源 RocketMQ 云原生 中间件

把低代码开发平台推给开百货店的朋友,对他有帮助吗?

低代码小观

低代码 企业 企业管理 管理者 管理工具

金九银十,Java程序员面试历程(附字节,阿里,百度,网易,美团等面经)

Java 程序员 架构 面试 后端

恒源云(GpuShare)_手把手教你如何终端登陆实例

恒源云

架构师知识笔记 4

felix徐

应用层软件开发的一些总结

SOA开发者

专栏:代码之丑(一)——让判断条件做真正的选择_Java_郑晔_InfoQ精选文章