代码简洁3 —— 注释

2023-10-27

        前段时间在组织代码review时,提到代码可读性问题时,很多人的第一反应竟然是多添加注释。而我始终觉得注释只能是锦上添花,而不能雪中送炭。再多的注释也改变不了代码逻辑组织混乱的现实,反而过多的注释会加重代码阅读的时间。

        什么也比不上放置良好的注释来得有用;什么也不会比乱七八糟的注释更能搞乱一个模块;什么也不会比陈旧、提供错误信息的注释更有破坏性

        注释是一种必须的恶,只有在编程语言表达能力不够时,我们才需要借助注释来说明代码含义。注释的恰当用法是用来弥补我们在代码表达意图时遭遇的失败。如果你发现自己需要写注释,那么可以思考一下,是否可以用代码来表达。

        注释还有一个致命的缺点是,它不一定是对的。当我们在修改别人的代码看到他们的注释时,我们有极大的可能不会去修改他们的注释。如此日积月累,被注释的代码含义早已改变,但注释却没有随着代码的维护而被维护。

1、注释不能美化糟糕的代码

       写注释的常见动机之一是糟糕代码的存在。

        带有少量注释的整洁而有表达力的代码,要比带有大量注释的零碎而复杂的代码易于阅读和维护得多。

2、用代码来阐述

        比如下面这段代码,你更愿意看哪个:

 3、好注释

        有些注释时必须的,也是有利的。但是唯一真正好的注释时不需要注释就能表达的。

3.1 法律信息

3.2 提供必要信息的注释

3.3 对意图的解释

        有时,注释不仅提供了有关实现的有用信息,而且还提供了某个决定后面的意图。

3.4 阐释

        有时,注释把某些晦涩难懂的参数或返回值的意义翻译为某种可读形式。通常我们要尽量让参数或返回值自身表达足够清楚,但如果返回值或参数是某个标准库的一部分,我们不能修改源代码,这时可以用注释说明。

3.5 警示

        用于警告其他程序员会出现什么样的异常后果

3.6  ToDo注释

        ToDo是一种程序员认为应该做,但由于某些原因目前还没有做的工作。

3.7 放大

        用于放大某种看来不合理之物的重要性

3.8 公共API的 java doc

        这种注释我们在JDK的源码、spring源码中经常看到

4、坏注释

        大多数注释都属于坏注释。通常,坏注释是糟糕代码的支撑和借口,或者是对错误决策的修正,基本上等于程序员自说自话。

4.1  喃喃自语

        如果只是因为你觉得应该或者因为过程需要添加注释,那就是无谓之举。如果你决定写注释,就要花必要的时间确保写出好的注释。

4.2 多余的注释

        比如下面这段代码: 

        注释不能比代码本身提供更多的信息。 

4.3 误导性注释

        如果写出的注释不够精确,反而会误导阅读代码的人。

4.4 循规式注释

        所谓每个函数都要有Javadoc注释或每个变量都要有注释的规矩,很多时候让代码变得散乱,而且随着代码的迭代,如果注释没有更新,还会误导对代码的理解。

4.5 日志式注释

        有人会在每次编辑代码时,在模块开始出添加一条注释,这类注释就像是一种记录每次修改的日志。如下面这样的注释: 

4.6 废话注释

 

4.7 位置标记 

        有时程序员喜欢在代码中标记某个特别的位置, 如: 

4.8 括号后面的注释 

 

4.9 归属与签名 

4.10 注释掉的代码

        直接把代码注释掉是很糟糕的做法。后续维护程序的人不敢删除注释的代码,而注释掉的代码堆积在一起,会干扰代码的阅读,不利于代码维护和阅读。        

4.11 HTML注释

4.12 非本地信息

        假如要写注释,请确保它描述了离它最近的代码。

4.13 信息过多

4.14 不明显的联系

        注释以及描述的代码之间的联系应该显而易见,至少让读者能看着注释和代码,能够理解注释所描述的东西。

4.15 函数头

        函数不需要太多描述,为一个函数起一个好的名字,通常比函数头的注释要好得多。

4.16 非公共代码中的Javadoc

        Javadoc对于公共API非常有用,但对于不撒算作公共用途的代码就是累赘。为系统中的类和函数生成Javadoc页并非总是有用,而javadoc注释额外的形式要求几乎等同于八股文章

小结: 

  1. 能用函数或变量说明时,就不要用注释。
  2. 如果需要添加注释,先考虑是否可以重新组织代码、起一个合适的函数名或变量名
  3. 注释只有在必要的时候,再去添加。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码简洁3 —— 注释 的相关文章

随机推荐

  • 【MATLAB】三维图像绘制+图形对象句柄

    目录 一 三维曲面绘图 二 图形对象句柄 1 三位图形属性设置 2 动态图 用循环语句 pause 叠加画图 hold on hold on 的基础上刷新画图 set h xdata x ydata y 每次重置点 曲线或曲面 的横纵坐标
  • Could not read Username Error for Git

    在用使用Vundle安装neocomplete时失败 查看log提示could not read Username for https github com Device not configured 经检查这里提示的Username是指n
  • vue3中,this.$router.push刷新当前页面,该页面不重新加载需要手动刷新的解决方案

    1 demo vue 在this router push demo 后 demo vue没有刷新也没有重新加载 但是路由地址已经变了 只是需要手动刷新 2 解决 监听一下当前路由 watch route to from to表示要跳转的路由
  • 固定资产可视化智能管理系统

    什么是资产管理 企业一般有设备 工具 IT通讯 仪器 载具 文档 家具和一些其他的资产 比如某个制造企业现状 共计约有8000个资产分布存在于30个区域 包括实验室 办公室和工厂 其中每年新入资产预估为2000个 报废资产预计1800个 在
  • Python 3D函数图形投影到2D坐标轴上

    1 contourf函数命令 cmap matplotlib cm jet norm matplotlib colors Normalize vmin min np array sol vmax max np array sol plt c
  • 统计学习方法 第七章习题答案

    习题7 1 题目 比较感知机的对偶形式与线性可分支持向量机的对偶形式 解答 感知机 原始形式 min w b
  • linux:linux基础命令(一)

    前言 为什么要学linux 为了运维 项目上线 所以要了解linux操作系统 什么是LNMP linux nginx mysql php小常识 一个用Linux Shell编写的可以为CentOS RadHat Debian Ubuntu
  • 进程和子进程

    进程和子进程 父子进程有独立的数据段 堆 栈 共享代码段 Linux中每个进程都有4G的虚拟地址空间 独立的3G用户空间和共享的1G内核空间 fork 创建的子进程也不例外 子进程资源的由来 1G内核空间既然是所有进程共享 因此fork 创
  • input type=“file”上传文件(一)

    使用input标签 type file 的时候就可以上传文件 为input标签添加change事件 调用函数
  • qt 添加动作 (QAction)

    Qt 5 mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • 3Dgame_homework7

    3D游戏 作业7 智能巡逻兵 要求 游戏设计要求 程序设计要求 提示 相关理论 实现过程与代码 智能巡逻兵 要求 游戏设计要求 创建一个地图和若干巡逻兵 使用动画 每个巡逻兵走一个 3 5 个边的凸多边型 其位置数据是相对地址 即每次确定下
  • 静态库调用动态库或者静态库(Cmake例子)

    1 静态库无论调用动态库还是静态库都只需要include库的头文件 2 要在调用该静态库的地方添加库引用 并设置路径 结论 其实静态库调用动态库或者静态库 只是在用到库方法的地方把该方法添加到LIB当中 真正使用的地方才会把这些库LINK起
  • flutter_blue优化(FlutterBlue.instance.scan搜索重复、搜索结果处理、更新之前保存缓存数据、保存连接成功的设备)

    1 搜索列表优化 FlutterBlue instance scan搜索重复 搜索结果处理 更新之前保存缓存数据 2 保存连接过的设备 3 十进制转十六进制 4 写入十六进制数据 json scan dart 实体类 主要是使用flutte
  • Spring Boot是什么?它的优点是什么?

    Spring Boot是什么 它的优点是什么 Spring Boot是一个基于Spring框架的快速开发框架 它旨在简化Spring应用程序的开发过程和部署流程 Spring Boot提供了自动化配置和约定大于配置的方式 使开发人员可以专注
  • JavaWeb--- Filter(过滤器)学习

    Filter 过滤器 处理中文乱码 登录验证 1 xml依赖
  • 教你用Python做图像处理

    质量 速度 廉价 选择其中两个 提到图像处理第一个想到的库就是PIL 全称Python Imaging Library Python 图像处理类库 它提供了大量的图像操作 比如图像缩放 裁剪 贴图 模糊等等 很多时候它需要配合numpy库一
  • 无盘服务器怎么看使用情况,无盘服务器回写盘查看

    无盘服务器回写盘查看 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 由于某些机型的服务器没有配备SDI卡 或者其他服务器
  • 代码随想录一刷-Day09

    LeetCode27 移除元素 public int removeElement int nums int val if nums length 0 return 0 双指针 int slow 0 fast 0 while fast lt
  • Dynamic 356 OP 9.0版本 同服务器环境还原DB导入组织报错

    环境 Dynamic 365 9 0 6 9 PRD和UAT组织在同一套服务器环境中 操作 1 备份PRD数据库 还原到UAT数据库 2 在CRM部署管理器中导入UAT组织数据库 提示错误如下 12 31 12 Verbose Databa
  • 代码简洁3 —— 注释

    前段时间在组织代码review时 提到代码可读性问题时 很多人的第一反应竟然是多添加注释 而我始终觉得注释只能是锦上添花 而不能雪中送炭 再多的注释也改变不了代码逻辑组织混乱的现实 反而过多的注释会加重代码阅读的时间 什么也比不上放置良好的