关于如何优雅的做好代码注释

article/2025/10/26 21:32:50

问题思考

作为研发同学,对于代码“注释”其实并不陌生。它往往作为我们代码文档的特殊补充而存在。

其实在代码文档中,起主要作用的因素并非注释,而是好的编程风格。

编程风格包括:良好的程序结构、易于理解的方法、有意义的变量名和子程序名、常量、清晰的布局,以及最低复杂度的控制流及数据结构。

会后我就在反思:那注释真的是以啰嗦的方式又重复一遍代码,所以没有用么?

好注释可不是重复代码或者解释代码,它会让作者的意图更清晰,注释应该能在更高的意图上解释你想干什么。

沟通讨论

在一次研发沟通会上,大家关于是否需要代码注释做了一番争执(讨论)。

图片

主要内容简述如下:

A:我提议项目应该有个注释,我们有些程序员几乎从不注释代码,谁都知道没注释的代码是没法阅读的。

B:我觉得注释没必要,注释被当做万灵药,可是任何实际编码过的人都知道,注释反而会使代码更难读懂。注释很容易产生大量的废话,而编码语言相对简明扼要得多。

C:是这么回事。假如代码不清晰,又怎能注释的清楚呢?再说,代码一变,注释就过时。要是误读了过时的注释,可能又会踩坑了。

C 接着说:另外,注释过多的代码更难读懂,这样增大了阅读量。已经有一堆代码要去读了,何必再去读一大堆注释呢?

A:编辑器要知道的东西全在代码中?二进制文件里面吗?争论注释有无价值干啥呢?

B:我反对注释主要是觉得浪费资源。

D:也不能这么说,注释可能会被滥用,但是注释用得好时却妙不可言。另外,在我的工作经历中,有注释和没注释的我都维护过,我个人还是更愿意维护有注释的代码。最后补一句:尽管没必要制定注释的标准,但是我还是提倡大家注释好自己的代码。

........

关于是否加注释争执讨论比较久,最终大家统一了如下决定:

“提倡加注释,但不能滥用。我们开发流程中会有Code Review过程,这样每个人都将了解好的注释是什么样的,同时你遇到不好的代码注释,也需要告诉他如何改进。”

日常的注释

图片

一般情况下,注释写的糟糕很容易,写的出色就很难了。注释不好只会帮倒忙。

我们来看几个例子:

// write out the sums 1..n for all n from 1 to num
current = 1;
previous = 0;
sum = 1;
for(int i=0; i<num; i++){System.out.Println("Sum = " + sum);sum = current + previous;previous = current;current = sum;
}

其实这段代码计算的是斐波那契(Fibonacci)数列的前num个值。如果注释错了,盲目相信注释可能会南辕北辙,但是好的注释会事半功倍。

// compute the square root of num using the Newton-Raphson approximation
r = num / 2;
while(abs(r - (num/r) > TOLERANCE){r = 0.5 * (r + (num/r));
}
System.out.println("r = " + r);

上述例子,它用来计算num的平方根,代码一般,但注释比较精准。

注释的目的

写代码和注释的第一目的是帮助人理解代码,理解作者的意图。

所以优秀的代码本身就有自说明功能,只有在代码本身无法清晰地阐述作者的意图时,才考虑写注释。

即是:注释应该表达我的代码为什么要这么做,而不是表达我的代码做了什么。

我们软件开发过程中引入了那么多的设计模式、框架、组件,开发过程制定了那么详细的设计规范、编码规范、命名规范、很大一部分原因就是为了提高代码的可读性。

编程语言特别是高级编程语言,本身就是人和机器之间沟通的语言,语言本身就要求满足人的可读性,需要用符合我们自然语言的表达习惯,不需要额外的注释。

注释的原则

1)写注释应遵循奥卡姆剃刀原则:如无必要,勿增实体

注释写的不好、维护得不好(比如改了代码没改注释)会导致代码的可读性变差。

2)有句话叫“代码即注释”,虽然不完全是,但有道理的

把代码写好、写漂亮,注释就可以精炼,也必然能写得更易懂。此外,把思路(难的、关键的)写清楚,比啥Author、Date重要多了。抓重要信息。

3)建议注释里尽量写为什么,而不是做了什么

做了什么,看代码就好,代码不会骗人。但为什么要写成这样,有时候就非常让人困惑。有可能是处理某个corner case,有可能是绕过某个系统限制,也可能是什么奇葩需求,这种代码,没有当时的 context,过几个月看,像甲骨文一样,不知道是想干什么。再有看不顺眼来优化一下,以后就不知道哪个地方会崩了。

其实,大部分的代码应当是不言自明的,不需要注释的。

注释怎么写?

当然,好代码 > 差代码+好注释,好的注释是很有价值的,坏注释不仅浪费时间还可能有害,自解释的代码最好。

当然,好代码 > 差代码+好注释

好的注释是很有价值的,坏注释不仅浪费时间还可能有害,自解释的代码最好。好的注释不是重复代码或解释它,而是使代码更清楚,注释在高于代码的抽象水平上解释代码要做什么事。

具体的操作手段,包括但不限于以下几点:

  • 适当注释,仔细衡量,不要隐晦也不要多余;

  • 注意存在变更情况是,需要及时更新;

  • 注释代码中一些tricky的技巧或者特殊的业务逻辑,否则会让读代码的人摸不着头脑;

  • 如果附上jira、bug、需求等的地址能够帮助理解代码,可以适当加上;

  • 如果代码命名良好,结构合理,一般来说是不需要什么注释的。但是用一句话解释下意图和功能也是极好的,因为很多时候仅仅是想知道代码怎么用,读一句注释要比分析几十行代码快得多。

图片

总结

  • 好的注释才有价值

该不该注释是个需要认真对待的问题。差劲的注释只会浪费时间。好的注释才有价值。注释的位置可以在:变量特定的含义和限制、某个职责代码块的开始、一般控制结构的开始、子程序调用处、方法开始处描述功能、类开始处描述功能。

  • 源代码应当含有程序大部分的关键信息。

只要程序依然在用,源代码比其他资料都能保持更新,故而将重要信息融入代码是很有好处的。

  • 好代码本身就是最好的说明

如果代码太糟,需要大量注释,应先试着改进代码,直至无须过多注释为止。

  • 注释应说出代码无法说出的东西

例如概述或用意等信息。注释本身应该包含的是对代码的简洁的抽象概括,而不是具体代码的实现细节。

  • 注释风格也应该简洁易于维护

有的注释风格需要许多重复性劳动,应舍弃之,改用易于维护的注释风格。


http://chatgpt.dhexx.cn/article/QfTA1bOd.shtml

相关文章

VS Code - 自动生成代码注释

目录 1. 代码注释 2. 插件安装 3. 使用示例 1. 代码注释 代码注释在软件的迭代过程中举足轻重&#xff0c;所以一个规范化的代码注释也非常重要&#xff0c;在用 VS Code 中则可以使用插件来规范化代码注释。 autoDocstring: VSCode Python Docstring Generator GitHub - N…

python中如何注释代码

1、python中通过#来注释单行不需要运行的代码&#xff0c;如&#xff1a; 此时&#xff0c;被注释代码变灰色了&#xff0c;那么在执行程序时&#xff0c;该行代码就不会被运行了 2、注释多行代码用xxxxx或者"""xxxx"""来注释&#xff0c;作用同…

python 代码注释

文章目录 写在前面使用方法plainEpytextGoogleNumpyreStructuredText相关程序包其他 写在前面 如果说高效率的算法是一个项目的内核&#xff0c;那么完备的文档注释、API 接口则是项目的外壳&#xff0c;直接与客户交互。 pycharm 提供了 5 种 代码注释格式。 分别是 plain, e…

谈代码注释

只要写代码&#xff0c;就会遇到代码注释的问题。在不同的公司&#xff0c;不同的项目组&#xff0c;不同的项目中&#xff0c;可能会有不同的注释标准。有些标准让我们感觉很受益&#xff0c;有些则让我们感觉很反感。而对于没有明确标准的项目&#xff0c;我们往往会遇到“百…

教你写好代码注释

前言 相信大家都会遇到这种情况&#xff1a;一周前自己写的代码&#xff0c;现在再拿出来看&#xff0c;发现读不懂了&#xff0c;“ 这代码是我写的&#xff1f;&#xff1f;&#xff1f;”。这时候&#xff0c;代码注释就可以发挥它的作用了——提高晦涩难懂的代码的可读性&…

关于代码的注释的几种方法

注释就是对代码的解释和说明&#xff0c;其目的是让人们能够更加轻松地了解代码。注释是编写程序时&#xff0c;写程序的人给一个语句、程序段、函数等的解释或提示&#xff0c;能提高程序代码的可读性。注释只是为了提高可读性&#xff0c;不会被计算机编译。 注释一般分为行注…

C++设计模式之观察者模式和发布订阅模式

在软件工程中&#xff0c;设计模式&#xff08;Design Pattern&#xff09;是对软件设计普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;锁提出的解决防范。根据模式的目的来划分的话&#xff0c;GoF&#xff08;Gang of Four&#xff09; 设计模式可以分为以…

Redis发布订阅模式实现原理

前言 发布订阅系统在我们日常的工作中经常会使用到&#xff0c;这种场景大部分情况我们都是使用消息队列&#xff0c;常用的消息队列有 Kafka&#xff0c;RocketMQ&#xff0c;RabbitMQ&#xff0c;每一种消息队列都有其特性&#xff0c;很多时候我们可能不需要独立部署相应的消…

RabbitMQ入门案例之发布订阅模式

前言 本文章主要介绍RabbitMQ的发布订阅模式&#xff0c;该模式下&#xff0c;消息为广播形式&#xff0c;一经发布则会进入交换机绑定的队列中&#xff0c;详细介绍可以阅读官方文档。 官网文档地址&#xff1a;https://rabbitmq.com/getstarted.html 什么是发布与订阅模式 …

浅谈JS发布订阅模式

&#x1f3c6;分享博主自用牛客网&#x1f3c6;&#xff1a;一个非常全面的面试刷题求职网站&#xff0c;真的超级好用&#x1f36c; 文章目录 前言一、发布订阅模式是什么&#xff1f;二、使用步骤1.创建调度中心2.实际操作3. React中的应用 总结 前言 在使用前端各大框架时&…

React 中的发布订阅模式

1、react 通信 react的数据流是单向的, react 通信有以下几种方式&#xff1a; 单向数据流&#xff1a;指当前组件的 state 以 props 的形式流动时只能流向组件树中比自己层级更低的组件 父向子通信&#xff1a;父组件提供state&#xff0c;并且内部设置好数据&#xff0c;子组…

深入Vue原理_全面剖析发布订阅模式

文章目录 发布订阅模式优化优化思路思考理解发布订阅模式(自定义事件)收集更新函数触发更新函数6.5 总结 总结写在最后本期推荐 欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有…

观察者模式VS发布订阅模式区别

观察者模式VS发布订阅模式区别 观察者模式&#xff1a;订阅者收集函数&#xff0c;发布者循环调用 发布订阅&#xff1a;收集发布单独给一个中介 对比 以结构来分辨模式&#xff0c;发布订阅模式相比观察者模式多了一个调度中心&#xff1b; 以意图来分辨模式&#xff0c;都…

RabbitMQ:发布订阅模式

✨ RabbitMQ:发布订阅模式 1.订阅模式基本介绍2.交换机3.发布订阅模式3.1基本介绍3.2生产者3.3消费者3.4测试 &#x1f4c3;个人主页:不断前进的皮卡丘 &#x1f31e;博客描述:梦想也许遥不可及&#xff0c;但重要的是追梦的过程&#xff0c;用博客记录自己的成长&#xff0c;记…

JavaScript设计模式:四、发布订阅模式

JavaScript设计模式&#xff1a;四、发布订阅模式 文章目录 JavaScript设计模式&#xff1a;四、发布订阅模式一、概述1. 观察者模式2. 发布订阅模式3. 观察者模式是不是发布订阅模式 一、概述 观察者模式&#xff1a; 观察者&#xff08;Observer&#xff09;直接订阅&#x…

发布订阅模式理解

发布订阅模式理解 1.发布-订阅模式 发布订阅模式是一种一对多的对象对应关系&#xff0c;多个观察者同时监听某一个对象&#xff0c;当该对象发生改变时&#xff0c;就会执行一个发布事件&#xff0c;这个发布事件会通知所有的事件订阅者&#xff0c;事件订阅者根据得到的数据…

JS观察者模式和发布订阅模式

观察者模式 观察者模式在前端工程中是很常见的设计模式&#xff0c;因为前端交互中充斥着大量多控件联动的交互&#xff0c;当参与联动的组件数量比较多或者组件数量可能变化的时候&#xff0c;代码就会变得难以维护。但是如果我们写代码时遵循了观察者模式的设计&#xff0c;…

redis发布订阅模式详解

文章目录 写在前面发布订阅的使用SUBSCRIBE命令PUBLISH命令注意发布、订阅客户端启动顺序&#xff01; PUBSUB命令PUNSUBSCRIBE命令UNSUBSCRIBE命令PSUBSCRIBE命令 总结 写在前面 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订…

Vue发布订阅模式

简单的来说一下在别人问你这个问题的时候怎么来回答它 前端新人&#xff0c;如有错误求大佬指出~求教&#x1f49d; 情景复现 大佬提问&#xff1a;“你知道Vue发布订阅模式是什么吗&#xff1f;" 我的回答&#xff1a;“发布订阅模式其实是一种对象间一对多的依赖关系&…

观察者模式和发布订阅模式

一、概念 观察者(Observer)&#xff0c;又称发布-订阅&#xff08;Publish-Subscrice&#xff09;&#xff0c;属于23中设计模式之一。 发布订阅模式定义了一种一对多的依赖关系&#xff0c;让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时&#xff0c…