【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

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

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

关注

评论

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

使用 Docker 部署 Django + MySQL 8 开发环境

AlwaysBeta

MySQL django Docker Dockerfile Docker-compose

手写一个Vue风格组件

林浩

Java 大前端 webpack

CECBC区块链专委会副主任吴桐受邀成为伏羲智库兼职研究员

CECBC

区块链技术 吴桐 商务部CECBC 伏羲智库 政务链

看动画学算法之:排序-归并排序

程序那些事

Java 算法 排序 归并排序

追光逐影:曝光相对论(1)

北风

摄影 影调 曝光 黑白

架构师训练营架构第七周总结

Cloud.

区块链想要拥有互联网级的用户体验,如何从应用层与公链去改进?

CECBC

【总结】性能优化

小胖子

ARTS Week8

时之虫

ARTS 打卡计划

云原生技术栈的关键技术

李英俊

云原生 Go 语言

LeetCode 题解:1051. 高度检查器,JavaScript,先排序再比较,详细注释

Lee Chen

大前端 LeetCode

流量控制算法

架构 流量控制 流控算法

区块链技术助力打造新公益样板

CECBC

番外篇:新鲜上市的Unicorn - Pinterest的数据系统

顾仲贤

Windows Sandbox

Dare Devor

Sandbox Virtualization

《架构师训练营》第七周总结

redis系列之——数据持久化(RDB和AOF)

诸葛小猿

redis 持久化 aof rdb

kubernetes 集群安装(kubeadm)

小小文

Docker Kubernetes 群集安装 etcd

架构师训练营第六周课后总结

Cloud.

生活困境

落曦

学习Rust,我的一些体会

Kurtis Moxley

编程 rust 随笔杂谈

性能压测的时候,系统响应时间和吞吐量如何变化,为什么?

不在调上

可读代码编写炸鸡八 - 变量兜兜转转像是一场梦

多选参数

代码 代码组织 代码规范 可读代码编写 可读代码

命令行一键启动Hadoop集群

我是个bug

大数据 hadoop hdfs YARN Big Data

看动画学算法之:排序-选择排序

程序那些事

数据结构 算法 动画

个人博客网站搭建

北漂码农有话说

隐私计算:实现数据价值释放的突破口

CECBC

密码学 政策扶持 隐私计算 发展现状

那些好用的命令

北漂码农有话说

Swift十年

SwiftMic

Swift十年

week7

不在调上

解决火狐新窗口打开网页被拦截问题

Lee Chen

大前端

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