写点什么

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

  • 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:0310882
用户头像

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

关注

评论

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

见证中国云势力崛起!博睿数据实力入围2021~2022 Cloud 100 榜单

博睿数据

吉利控股集团与百度深化战略合作

百度开发者中心

VuePress 博客优化之增加 Vssue 评论功能

冴羽

JavaScript Vue 前端 vuepress vssues

社区知识库|常见问答 FAQ 集合第 5 期:Broker、Topic、Pulsar 客户端及消息限制等相关问题

Apache Pulsar

开源 架构 云原生 Apache Pulsar 社区

培训第二弹!全国大学生智能汽车竞赛百度竞速组预告

百度开发者中心

昆仑分布式数据库独特的变量读写功能介绍

KunlunBase昆仑数据库

数据库 读写分离

2022年2月云主机性能评测报告

博睿数据

阿里巴巴在开源压测工具 JMeter 上的实践和优化

阿里巴巴云原生

Apache 阿里云 云原生 Jmeter

视频质量评价VMAF,为何让人又喜又忧?

微帧Visionular

视频编码

Gartner发布服务器虚拟化市场指南 灵雀云作为唯一本土容器厂商入选

York

容器 云原生 数据中心

一文了解路由平台的 Cisco IOS 和 IOS XE 命名约定,看这篇就够了!

Ethereal

阿里巴巴如何提升构建的效率 | 阿里巴巴DevOps实践指南

阿里云云效

阿里巴巴 阿里云 CI/CD 持续交付 构建工具

如何基于制品元数据提升交付效率 | 阿里巴巴DevOps实践指南

阿里云云效

云计算 阿里云 云原生 软件开发 持续交付

Linux这5大磁盘分区工具,绝了!

Ethereal

TGIP-CN 036 报名|预见 2022 · Apache Pulsar 技术进展与社区动态

Apache Pulsar

开源 架构 云原生 Apache Pulsar 社区

投稿开奖丨轻量应用服务器征文活动(2月)奖励公布

阿里云弹性计算

轻量征文

区块链发展趋势与思考

CECBC

ARP欺骗攻击

喀拉峻

网络安全

Hadoop HDFS 3.3.1分布式存储搭建

KunlunBase昆仑数据库

国产数据库

建设领先的AI原生云,百度智能云落地新一代高性能AI计算集群

百度开发者中心

业内首家!百度智能云智慧金融业务通过ISO37301合规管理体系认证

百度开发者中心

干货分享 | 推荐两款好用的企业文档管理软件

小炮

什么是单臂路由器?如何配置单臂路由?

Ethereal

如何限制Linux终端中tree命令递归文件列表的深度?

Ethereal

Flutter 设置应用主题色和字体

岛上码农

flutter ios 安卓 移动端 3月月更

Meetup预告|面向云原生的架构及演进

云智慧AIOps社区

开源 云原生 AIOPS 智能运维

DSTC10 赛道最佳论文揭晓!文心 PLATO 再获殊荣

百度开发者中心

干货|性能提升密钥,由代码细节带来的极致体验

SphereEx

Apache 数据库 开源 ShardingSphere SphereEx

开发者们看过来~填问卷参与抽奖,双重周边奖励仅限本周!

InfoQ写作社区官方

OpenHarmony 热门活动

什么是广域网WAN?学WAN,看这篇文章就够了!

Ethereal

毕业设计:架构实战营模块9

Poplar89

「架构实战营」

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