NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

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

关注

评论

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

灌电流与拉电流的含义及电路解析

智趣匠

第十一周作业

大肚皮狒狒

流计算不止Flink

WuKongCoder

flink 流式计算 RisingWave

AI自动生成测试用例思维导图

测吧(北京)科技有限公司

测试

糟糕,接口被刷了,怎么办?

快乐非自愿限量之名

面试 接口 计算机

云手机在引流方面有什么优势?

Ogcloud

云手机 海外云手机 云手机海外版 电商云手机

《计算机程序设计艺术(第3卷):排序与查找》PDF

程序员李木子

Meta Llama 大模型:强大的 AI 能力支持

测吧(北京)科技有限公司

测试

第九周作业

大肚皮狒狒

AI加速测试流程:自动化测试脚本生成方案实现

测吧(北京)科技有限公司

测试

企业专属语言模型与知识图谱:定制化智能解决方案

测吧(北京)科技有限公司

测试

深度学习:开启人工智能的未来探索之旅

快乐非自愿限量之名

人工智能 机器学习 深度学习

1 月比特币 ETF 终上市,公链稳健发展

Footprint Analytics

区块链 公链 BTC

5分钟教你搭建chatgpt,结合midjourney上线即可运营

aiisai

ChatGPT MidJourney chatgpt app

AI 辅助测试框架搭建:简化测试工作流

测吧(北京)科技有限公司

测试

Python中的atexit模块:让你的代码优雅退出

这我可不懂

Python

AI助力测试:高效批量生成测试数据方案实现

测吧(北京)科技有限公司

测试

AI自动化Bug发现:提升软件质量保障

测吧(北京)科技有限公司

测试

聊聊PowerJob的CleanService

伤感汤姆布利柏

私有版语言模型开发:保障数据隐私与安全

测吧(北京)科技有限公司

测试

浅谈iPaaS对企业转型的重要性

RestCloud

应用集成 ipaas

2023 IoTDB Summit:清安储能技术(重庆)有限公司高级 Java 工程师杨泰贤《IoTDB 在清安云能源数据集成的解决方案》

Apache IoTDB

低代码开发:助力企业迈向智能化未来

EquatorCoco

低代码 数字化转型 企业转型

第十周作业

大肚皮狒狒

Frappe RestAPI 的filters的写法

麦兜

The Captainz NFT 概览与数据分析

Footprint Analytics

NFT 数字藏品

Vue框架与前端部署:构建现代化Web应用的利器

不在线第一只蜗牛

Vue 前端框架 web开发 Vue 3

个性化AI应用:定制专属学习助手

测吧(北京)科技有限公司

测试

深入了解 Java 方法和参数的使用方法

小万哥

Java 程序人生 编程语言 软件工程 后端开发

35岁,走出焦虑

芃篙君

#深度思考

适用于 Amazon Step Functions 的低代码可视化新工作流 Workflow Studio, 现已在 Amazon Application Composer 正式发布!

亚马逊云科技 (Amazon Web Services)

低代码 亚马逊云科技 Amazon Lambda Amazon Step Functions

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