这代码,给我看破防了……

之前有读者问,自己一直不明白如何写出合理的代码注释。

这也是不少程序员一直头疼的问题,比如接手新代码时,没有注释,完全搞不清逻辑;自己写的注释,跟不上代码修改,成了误导;复杂逻辑不知道咋注释,别人也看不懂。

(听君一席话,听了一席话)

网上也有很多关于代码注释的段子,搞笑中透露着真实的注释现状,比如下面这些注释:

(这也算得上是“风险预警”吧  ↑ )

(阅读代码的人,心里一定很崩溃 ↑ ) 

还有一种是,注释透露着一种自由的随意感 :

我们都知道,注释是代码的重要组成部分,它能够为代码的读者提供额外的信息,帮助他们更好地理解代码的功能、逻辑和设计意图。

写出合理的注释不仅能够提高代码的可读性和可维护性,还能促进团队成员之间的有效协作。

本文就将一些经验分享给大家,希望提供一些帮助。

一、明确注释的目的

目标设定理论提出:清晰、明确和可衡量的目标比模糊不清的目标更能提高工作效率。目的也同样。

而我们写注释的主要目的是为了增强代码的可理解性。下面列出了一些具体的注释目的,在写之前帮助我们理清思路,明确行动方向。

(一)解释代码的功能和用途

代码注释要让读者能够快速了解一段代码或一个函数的整体作用。比如,编写了一个函数用于从数据库中获取特定用户的信息,注释就可以这么写:“此函数用于从数据库中检索指定用户的详细信息,包括用户名、电子邮件和年龄等字段。”

实践要点

  • 在注释中明确函数的输入和输出格式,例如数据类型、结构等。
  • 提及函数可能抛出的异常或特殊情况。
(二)说明复杂算法或逻辑的工作原理

对于复杂的计算或独特的逻辑流程,注释能够帮助读者理解代码背后的思路。比如,对于一个使用递归实现的斐波那契数列计算函数:

def fibonacci(n):"""此函数使用递归算法计算斐波那契数列的第 n 项参数:n (int): 要计算的项数返回:int: 斐波那契数列的第 n 项值工作原理:欧几里得算法的基本思路是:不断用较小数除以较大数,并将余数赋给较小数,直到余数为 0。在本函数中,如果 n 小于等于 0,返回 0;如果 n 等于 1,返回 1;否则,返回 fibonacci(n - 1) + fibonacci(n - 2),通过递归计算得出结果"""if n <= 0:return 0elif n == 1:return 1else:return fibonacci(n - 1) + fibonacci(n - 2)

实践要点:

  • 对于复杂的算法,绘制简单的流程图或架构图,并在注释中引用。
  • 解释算法中的关键变量和它们的变化规律。
(三)提供关于特定变量、函数或类的重要信息

解释变量的含义、函数的输入输出以及类的设计目的等。比如:“这个变量 max_attempts 表示尝试连接数据库的最大次数。”

假设我们有一个函数用于计算两个数的最大公约数:

def greatest_common_divisor(a, b):"""此函数用于计算两个整数的最大公约数参数:a (int): 第一个整数b (int): 第二个整数返回:int: 两个数的最大公约数算法: 使用欧几里得算法,其基本步骤为:用较大数除以较小数得到余数,然后将较小数作为新的较大数,余数作为新的较小数,重复此过程,直到余数为 0,此时的除数即为最大公约数"""while b!= 0:a, b = b, a % breturn a

在示例中,就注释清晰地说明了函数的功能、参数和使用的算法。

实践要点:

  • 对于类,注释中描述其继承关系、主要方法和属性。
  • 对于函数,说明函数的性能特点,例如时间复杂度和空间复杂度。

二、保持简洁明了

注释应该简洁而准确地传达关键信息。避免过于冗长和复杂的描述,以免增加读者的理解负担。例如,不要写一大段文字来解释一个简单的函数,而可以简洁地说:“此函数计算两个整数的平均值,并返回结果。”

在这里,提供一些实践技巧

  • 提炼关键信息,去除不必要的修饰词和废话。
  • 对于简单的逻辑,用一句话概括注释。
  • 定期审查注释,删除冗余和过时的信息。
  • 对于较长的注释,将其拆分成多个短句或段落,增强可读性。

三、采用清晰的语言

使用简单、易懂的词汇和句子结构,避免使用行话、缩写或过于技术化的术语,除非你确定读者一定能理解。所以尽量简单表达,就像在与其他开发者进行交流一样。举个例子,当你在解释一个数据结构时,“这是一个基于链表实现的队列”的表达可能会比说“这是一个采用链表数据结构的 FIFO 队列”更容易被人理解。

在这里,需要注意以下事项

  • 保持语言的一致性,避免在同一项目中使用多种表述方式来表达相同的概念。
  • 对于可能有歧义的术语,进行必要的解释。
  • 建立项目词汇表,统一关键术语的表述。
  • 对于新引入的技术术语,在注释开头进行定义和解释。

四、提供上下文

注释不仅要描述代码本身,还要让读者了解它在整个程序中的位置和作用。还是举个例子:“此函数在用户登录流程中被调用,用于验证用户输入的密码是否正确。” 这样的注释很明显能够帮助读者将当前代码与程序的更大框架联系起来,帮助读者更快理解代码。

为了更好理解和掌握,我们来假设一个场景:我们现在有一个处理订单的模块,其中有一个函数用于计算订单的总价:

def calculate_order_total(order_items):"""此函数在订单处理流程中用于计算订单的总价参数:order_items (list): 包含订单中各项商品信息的列表,其中商品信息以字典形式存储,包括'price'(价格)和'quantity'(数量)两个键注意: 此函数会根据商品的'price'和'quantity'进行计算"""total = 0for item in order_items:total += item['price'] * item['quantity']return total

这里的注释就明确了函数在整个订单处理流程中的位置和作用。

实践要点:

  • 引用相关的业务流程文档或需求说明,增强注释的上下文信息。
  • 在注释中提及与当前代码相关的其他函数或模块。

五、遵循统一的风格

在整个项目中,要保持注释的格式、标点和命名约定的一致性。这包括注释的位置(行末、函数前等)、注释的符号(例如 Python 中常用的 # )、以及注释的书写方式(是完整的句子还是短语等)。统一的风格可以使注释看起来更加整洁和专业

例如,在一个 Python 项目中,规定函数注释采用如下格式:

def some_function(arg1, arg2):"""函数功能的简要描述参数:arg1 (数据类型) - 参数 1 的描述arg2 (数据类型) - 参数 2 的描述返回:返回值的数据类型 - 返回值的描述"""# 函数体代码

提供一些风格规范的思路

  • 确定统一的注释符号和格式。
  • 制定关于注释内容的详细规范,如参数描述、返回值描述的格式。
  • 使用工具(如代码规范检查插件)来自动检查注释风格的一致性。
  • 为新加入项目的开发者提供详细的注释风格指南。

六、注释关键代码

重点注释那些容易引起混淆、不常见或对程序的正确性和性能有重要影响的部分。对于简单和直观的代码,或许不需要过多注释,但对于复杂的条件判断、循环结构或与外部系统的交互部分,详细的注释是很有必要的。还是以例子来直观解释下:

def process_data(data):"""此函数处理传入的数据参数:data (列表) - 包含待处理数据的列表以下的条件判断用于处理不同的数据类型如果数据是整数列表,执行求和操作如果数据是字符串列表,连接所有字符串"""if all(isinstance(item, int) for item in data):total = 0for num in data:total += numreturn totalelif all(isinstance(item, str) for item in data):result = ''for string in data:result += stringreturn result

实践要点:

  • 分析代码的复杂度和易错性。
  • 关注与业务逻辑紧密相关的核心代码部分。
  • 对于关键代码,添加注释说明其优化的思路和考虑的因素。
  • 在关键代码的注释中引用相关的技术文档或最佳实践。

七、及时更新注释

随着代码的修改和更新,相应的注释也必须保持同步。过时或不正确的注释可能会比没有注释更糟糕,因为它们会误导读者。在修改代码时,务必检查并更新相关的注释,确保它们准确反映了代码的最新状态

更新策略

  • 建立 代码审查机制,确保注释的更新。
  • 养成在修改代码的同时更新注释的习惯。
  • 使用版本控制系统来跟踪注释的变更历史。
  • 在代码提交信息中说明对注释的修改内容。

八、示例

对于一些复杂的概念或逻辑,提供简单的示例可以极大地增强注释的效果。例如,如果你在解释一个正则表达式的用法,可以给出几个匹配和不匹配的示例字符串。

假设我们有一个正则表达式用于验证电子邮件地址:

import re
email_pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
def validate_email(email):"""此函数使用正则表达式验证电子邮件地址的有效性参数:email (str) - 待验证的电子邮件地址示例:有效电子邮件: "test@example.com", "user123@gmail.com"无效电子邮件: "invalid_email", "no_domain@""""if re.match(email_pattern, email):return Trueelse:return False

实践要点:

  • 确保示例具有代表性,涵盖各种可能的情况。
  • 对于示例中的关键部分,在注释中进行特别说明。

合理的注释是优质代码的重要标志之一。在日常编程中尝试遵循上述原则和方法,可以为写出清晰、有用的注释提供帮助,同时提高代码的质量和可维护性,为自己和其他开发者节省大量的时间和精力。

最后也希望大家永远不会碰见开头那样的代码注释~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Java初阶数据结构》----7.<优先级队列PriorityQueue>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

Postman测试工具详细解读

目录 一、Postman的基本概念二、Postman的主要功能1. 请求构建2. 响应查看3. 断言与自动化测试4. 环境与变量5. 集合与文档化6. 与团队实时协作 三、Postman在API测试中的重要性1. 提高测试效率2. 保障API的稳定性3. 促进团队协作4. 生成文档与交流工具 四、Postman的使用技巧1…

buu做题(9)

[MRCTF2020]PYWebsite 有个二维码 扫了一下啊二维码 function enc(code){hash hex_md5(code);return hash;}function validate(){var code document.getElementById("vcode").value;if (code ! ""){if(hex_md5(code) "0cd4da0223c0b280829dc3ea4…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业&#xff08;数据字典与行业tree结构解析&#xff09; 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…

FOC笔记(一)电角度零点校准

当电机上电时&#xff0c;它处于位置的电角度未知。如果按上图U4&#xff08;100&#xff09;通电&#xff0c;也会让电角度为0,但是这样力量很大。 简单的方法是只控制d角度的磁场大小&#xff0c;转矩磁场q为0,生成一个定向磁场指向电角度为0。 foc->sin_sita 0;foc->…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理

X用户最多的国家排名统计报告

数据为DataReportal发布的Twitter在各个国家的用户数统计。 2022年&#xff0c;Twitter用户最多的国家是美国&#xff0c;有7690万用户。 数据统计单位为&#xff1a;万人 数据说明&#xff1a; 数据截止时间为2022年1月 Twitter在各个国家的用户情况 2022年&#xff0c;Twit…

全球相机控制面板市场展望与未来增长机遇:预计未来六年年复合增长率CAGR为4.3%

在全球摄影器材和专业影像设备需求增长的背景下&#xff0c;相机控制面板正成为市场的焦点。本文详细分析了全球相机控制面板市场的现状、增长趋势及未来前景&#xff0c;旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示&#xff0c;2…

自动控制:带死区的PID控制算法

带死区的PID控制算法 在计算机控制系统中&#xff0c;为了避免控制动作过于频繁&#xff0c;消除因频繁动作所引起的振荡&#xff0c;可采用带死区的PID控制。带死区的PID控制通过引入一个死区&#xff0c;使得在误差较小的范围内不进行控制动作&#xff0c;从而减少控制系统的…

13.2 MongoDB

13.2 MongoDB 1. 概述2. docker安装3. SpringBoot整合MongoDB3.1 依赖3.2 配置连接1. 基于`yml`配置2. 基于配置类配置3.3 启动项坑1坑23.4 新增业务1. 实体类映射2. 数据层3. 业务层4. 控制层5. 测试结果3.5 单条记录查询业务1. 数据层2. 业务层3. 控制层4. 断点测试3.6 分页查…

CeoMax总裁主题最新3.8.1破解免授权版/WordPress付费资源素材下载主题

CeoMax总裁主题最新3.8.1破解免授权版&#xff0c;一套WordPress付费资源素材下载的主题&#xff0c;感觉这是做资源站唯一一个可以和ripro媲美甚至超越的模板&#xff0c;UI很美&#xff0c;功能也很强大&#xff0c;有想学习的可下载搭建学习一下&#xff0c;仅供学习研究借鉴…

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…

【iOS】暑期第一周——ZARA app仿写

目录 前言无限轮播图分栏控件和滚动视图自定义cell遇到的问题调整图标大小单元格附件视图设置 总结 前言 暑假学习的第一周任务是对ZARA app进行仿写&#xff0c;充分运用之前学习的Objective-C语言和UI控件。我在编写demo的过程中遇到了一些问题&#xff0c;特写该博客作为学习…

【医疗图像分割】UNETR++论文笔记及代码跑通实践

在医疗图像分割任务中&#xff0c;transformer模型获得了巨大的成功&#xff0c;UNETR提出了efficient paired attention (EPA) 模块&#xff0c;利用了空间和通道注意力来有效地学习通道和空间的特征&#xff0c;该模型在Synapse&#xff0c;BTCV,ACDC,BRaTs数据集上都获得了很…

cf960(div2)

A. Submission Bait&#xff08;博弈&#xff09; 题意&#xff1a;爱丽丝和鲍勃在大小为n的数组a中进行游戏&#xff0c;他们轮流进行运算&#xff0c;爱丽丝先开始&#xff0c;不能运算的一方输&#xff0c;一开始mx0&#xff0c;每次操作&#xff0c;玩家可以选择一个牵引i…

实验1-2 简单求阶乘问题

PTA浙大版《C语言程序设计实验与习题指导&#xff08;第4版&#xff09;》题目集&#xff1a;实验1-2 简单求阶乘问题 #include<stdio.h> int main(){int n;scanf("%d",&n);//此处是输入数值int a,sum1; //a 是循环的次数&#xff1b;sum 是输出数值for(a…

yarn安装electron时报错RequestError:socket hang up

安装electron时候&#xff0c;出现RequestError:socket hang up这样的错误&#xff0c;找了半天很多方式都是用旧淘宝源&#xff0c;导致根本安装不上去。 在项目的根目录下创建.npmrc文件&#xff0c;添加以下内容 # registryhttps://mirrors.huaweicloud.com/repository/np…

Optional类的使用 java8(附代码)

&#x1f370; 个人主页:_小白不加班__ &#x1f35e;文章有不合理的地方请各位大佬指正。 &#x1f349;文章不定期持续更新&#xff0c;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ 文章目录 一、什么是Optional&#xff1f;二、…

源码拆解SpringBoot的自动配置机制

SpringBoot相比于Spring系列的前作&#xff0c;很大的一个亮点就是将配置进行了简化&#xff0c;引入了自动化配置&#xff0c;仅靠几个注解和yml文件就取代了之前XML的繁琐配置机制&#xff0c;这也是SpringBoot的独有特点&#xff0c;下面我们从源码角度&#xff0c;一点点拆…

【自然语言处理】概论(一):自然语言处理概要

1.1 概论&#xff1a;&#xff08;一&#xff09;自然语言处理概要 知识点 自然语言的定义&#xff1a;人类交流使用的&#xff0c;包括口语和书面语的信息交流方式。AI的终极目标&#xff1a;使计算机具备理解&#xff08;听、读&#xff09;和生成&#xff08;说、写&#…