如何写出清晰简洁的代码(通过一个实际的案例说明)

news2024/7/30 20:55:03

在软件开发中,清晰和简洁的代码是项目长期健康的关键。易读的代码不仅便于维护,还能减少错误的发生。通过分析一个具体的代码示例,我们来探讨如何提升代码的可读性和简洁性。

案例分析

最近,我们在代码审查时,遇到了以下C++代码片段:

void SomeFunction() {
    m_queryCollection++;
    core::post::ToMain(this, [this]() {
        if (m_queryCollection == 0) {
            return;
        }

        // 具体的业务逻辑...
        // 此处省略...
        m_queryCollection = 0;
    });
}

这段代码看了半天也没看懂要干啥,最后跟开发者沟通后才明白,该代码的目标是在消息循环中多次调用SomeFunction函数,但只执行一次业务逻辑。
恍然大悟后,开始反思为什么这段代码这么难懂。主要是该实现引入了几个问题:

  • 问题1:变量命名不清晰。 m_queryCollection并没有清楚地说明其作用。它给人的印象是用于收集查询次数,而不是控制函数调用流程。
  • 问题2:类型选择引起歧义。 m_queryCollection用的是int类型,但其实际上只用于表示两个状态:已发起或未发起。这里是主要的歧义点,如果使用bool类型会更恰当。
  • 问题3:逻辑不明确。 递增m_queryCollection与检查它是否为0的行为相矛盾。这样的代码不直观,难以理解其真正意图。
  • 问题4:性能不佳。 如果SomeFunction被循环调用多次,会导致大量任务被添加到消息队列中,这会导致性能问题。而且这也是导致无法理解代码的关键点之一。刚开始没理解为什么每次都要post。

改进建议

这段代码打回去,让开发重新优化。我们也给出了优化建议,建议优化为如下结构:

void SomeFunction() {
    if (m_hasPosted) {
        return;
    }
    m_hasPosted = true;
    core::post::ToMain(this, [this]() {
        m_hasPosted = false;
        // 具体的业务逻辑
    });
}
  • 改进1:描述性变量命名。 m_hasPosted明确表示是否已经发起了任务。
  • 改进2:逻辑简化。 通过检查m_hasPosted变量,我们可以清楚地表达函数的意图:只在未发起任务时执行。
  • 改进3:更准确的类型使用。 m_hasPosted使用bool类型而非int,使代码意图更直接。
  • 改进4:性能友好。 无论调用多少次,消息循环中只会有一个任务。

小结

编写清晰简洁的代码既是艺术也是科学。我们总结了一些提升代码质量的建议:

  • 使用有意义的命名。 变量、函数和类的名称应清晰表达它们的用途和功能。
  • 简化复杂逻辑。 避免深嵌套的条件语句和循环。采用早期返回策略和守卫子句来简化控制流。
  • 保持思路清晰。 编码前梳理清楚思路,或在遇到难题时向经验丰富的同事寻求建议。
  • 重构与优化。 随着项目的发展,定期回顾和优化代码是必要的。
  • 持续学习与成长。 通过代码审查和团队合作学习优秀的编程实践,不断提升个人技能。

编写代码的目的不仅是为了机器的执行,更重要的是为了人的阅读。作为开发者,我们应努力编写既优雅又简洁、易于维护的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑数据恢复篇:如何从电脑中恢复已删除的照片

按下 Shift Delete 后后悔了?想要恢复已删除的照片?好吧,如果是这样的话,你来对地方了。在本文中,我们将讨论如何从 PC 中恢复已删除的文件。 自从摄影的概念被提出以来,人们就对它着迷。以前&#xff0c…

Windows下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.双击下载好的安装包2.选择【I accept the agreement】→ 点击【Next】3.选择OpenSSL安装的位置 → 点击【Next】4.点击【Next】5.点击【Next】6.点击【Install】安装OpenSSL7.等待安装8.取消勾选 → 点击【Finish】完成安装 三、…

优思学院|流水线生产为什么不是最高效的?

谈到工厂的生产模式,人们印象中可能会浮现出长长的流水线和密集的作业人员。在传统的大规模生产装配线上确实如此,强调的是标准化大规模生产,采用专职分工方式,生产线上的作业人员只做同一个简单的动作,以达到降低成本…

SSL 证书错误:如何修复以及错误发生的原因

SSL证书可以提升网站的可信度。然而,如果您的SSL证书出现错误,您可能会得到一个“不安全”的标签,这可能会导致访问者失去对您网站的信任并转向竞争对手。 本文将介绍SSL证书错误的原因及其对用户的潜在影响。随后,我们将提供详细…

实验7 数据查询(2)

一、实验目的 学习SQL语言的定义、操纵功能熟悉通过SQL语言对数据库进行查询操作,包括单表查询、多表查询、嵌套查询、集合查询 二、实验软件 MySQL三、实验内容和要求 给定四个关联表,其定义和数据加载如下: 学生表 Student create tab…

【信创国产化】Nacos 2.3.2连接达梦数据库

JeecgBoot 目前提供的nacos版本号 2.3.2已经支持与达梦数据库对接。 jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos项目默认加入了达梦驱动和yml配置。如果你是老代码,可以参考下面的步骤手工集成 项目地址:https://github.com/jeecgboot/JeecgBoot…

【文科类cpci/cnki会议,主题广泛】第九届现代管理、教育与社会科学国际学术会议(MMET2024)

会议信息 点击跳转会议官网(更多会议信息可添加会议官网下方负责老师-杨老师) 大会时间:2024年09月20-22日 大会地点:中国-厦门 提交检索:CPCI,CNKI (知网检索快速稳定) 点击一键投稿 点击一键参会&a…

各向异性含水层中地下水三维流基本微分方程的推导(二)

各向异性含水层中地下水三维流基本微分方程的推导 参考文献: [1] 刘欣怡,付小莉.论连续性方程的推导及几种形式转换的方法[J].力学与实践,2023,45(02):469-474. 书接上回: 我们能得到三个方向的流入流出平衡方程: ∂ ρ u x ∂ x d x d y d…

入门PHP就来我这(高级)22 ~ 七天免登录案例

有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。 上文讲述了cookie的概念,创建,获取,销毁以及生命周期后&am…

java设计模式(十五)命令模式(Command Pattern)

1、模式介绍: 命令模式(Command Pattern)是一种行为设计模式,其主要目的是将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象。这种模式使得命令的请求者和实现者解耦。 2、应用场景&…

王道计算机数据结构+插入排序、冒泡排序、希尔排序、快速排序、简单选择排序

本内容是基于王道计算机数据结构的插入排序、冒泡排序、希尔排序、快速排序、简单选择排序整理。 文章目录 插入排序算法性能代码 冒泡排序算法性能代码 希尔排序算法性能代码 快速排序算法性能代码 简单选择排序算法性能代码 插入排序 算法 算法思想:每次将一个…

谷歌报告显示:2023 年 50% 的0day漏洞利用背后都是间谍软件供应商

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 导 读 谷歌威胁分析小组 (TAG) 和谷歌子公司 Mandiant 表示,他们观察到 2023 年攻击中利用的0day漏洞…

骑行耳机有哪些品牌值得入手?盘点5大品质与口碑兼顾的耳机推荐!

骨传导耳机凭借卓越的骑行兼容性,赢得了众多骑行爱好者的青睐,然而,关于骨传导耳机导致佩戴不适或影响骑行安全的反馈却屡见不鲜。这一看似矛盾的现象,实则源于市场被众多非专业骨传导耳机品牌充斥,尤其是一些标榜专为…

LLMs可以进行任务规划吗?如果不行,LLMs+GNN可以吗?

深度图学习与大模型LLM(小编): 大家好,今天向大家介绍一篇最新发布的研究论文(20240530)。这篇论文探讨了如何通过引入GNN来提高大模型在任务规划(task planning)中的性能。*论文分析了LLMs在任务规划上的局限性,并提出了一种简单而有效的解决方案。* 1.…

【面试题】防火墙的部署模式有哪些?

防火墙的部署模式多种多样,每种模式都有其特定的应用场景和优缺点。以下是防火墙的主要部署模式: 一、按工作模式分类 路由模式 定义:当防火墙位于内部网络和外部网络之间时,需要将防火墙与内部网络、外部网络以及DMZ&#xff0…

昇思学习打卡-17-热门LLM及其他AI应用/基于MobileNetv2的垃圾分类

文章目录 网络介绍读取数据集训练训练策略模型保存损失函数优化器模型训练 网络介绍 MobileNetv2专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积(Depthwise Separable Convolution)的思想在准确率小幅度降低的前提下&…

九.核心动画 - 显式动画

引言 本篇博客紧接着上一篇的隐式动画开始介绍显式动画。隐式动画是创建动态页面的一种简单的直接的方式,也是UIKit的动画机制基础。但是它并不能涵盖所有的动画类型。 显式动画 接下来我们就来研究另外一种动画显式动画,它能够对一些属性做指定的动画…

北斗GPS天线使用技巧与性能对比

北斗GPS天线使用中注意的问题 多系统兼容性:确保天线不仅能接收北斗信号,还能同时接收其他GNSS系统(如GPS、GLONASS、Galileo)的信号,以提高定位精度和可靠性。 信号频率选择:根据应用需求选择合适的信号…

【RHCE】实验(HTTP,DNS,SELinux,firewalld的运用)

一、题目 二、主服务器配置 1.下载HTTP服务,DNS服务 [rootlocalhost ~]# yum install -y httpd bind 2.开启防火墙,放行服务 # 开启防火墙 [rootlocalhost ~]# systemctl start firewalld # 放行服务 [rootlocalhost ~]# firewall-cmd --add-service…

【linux服务器】大语言模型实战教程:LLMS大模型快速部署到个人服务器

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生,大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…