当前位置: 首页 > news >正文

代码整洁之道-如何写好注释

写在前面

程序员都不喜欢写注释,但是都希望别人的代码写注释!

这句话听起来是一段梗,不过,代码注释的确需要我们重视,或许在某个夜晚,你正在加班紧急修改线上BUG,一行及时有用的注释让你如沐春风,直呼痛快!

总结

尽量少写注释,让自己的代码有足够的表达力,恰当的注释是应该只是一种弥补,弥补我们代码无法快速表达意图的情况

但是, But,并不是不写注释的理由

对于晦涩难懂的代码逻辑,特殊情况的业务逻辑,等,应当简洁明了,而非拖泥带水的给出解释注释。

摘抄

  • 带有少量注释的整洁而有表达力的代码,比带有大量零碎注释的复杂代码好的多
  • 别给糟糕的代码加注释–重新写吧!
  • 什么也比不上放置良好的注释来的有用
  • 什么也比不上乱七八槽的注释更有本事搞乱一个模块
  • 什么也不会比陈旧,提供错误信息的注释更有破坏性
  • 注释并不像辛德勒的名单一样“纯然的好”

怎么样写好注释

1.1 提供信息的注释

Bad

// 返回一个商品的实例
function responderInstance() {}

这时就可以去掉这一段的注释
为函数取一个好的有表达力的名字
Good

function responderGoodsInstance() {}

这个注释就非常有必要

  // 匹配邮箱的正则表达式let reg = /[\w]+(\.[\w]+)*@[\w]+(\.[\w])+/

理解起来有点苦难的地方,可以加一些阐述

// 假设是第三方库我们无法修改
function compare(a, b) {if (a > b) return 1if (a === b) return 0if (a < b) return -1
}compare(a, b) !== 0   // a !== b
compare(a, b) === -1  // a < b 
compare(a, b) > -1  // a >= b 
compare(a, b) === 1  // a > b 
...

1.2 对意图的解释

带有少量注释的整洁而有表达力的代码,比带有大量零碎注释的复杂代码好的多

可以使用多行注释,解释清楚这一部分逻辑处理的原因
我自己比较喜欢这样的注释,对于实在不好理解的逻辑,在函数上方把这个函数做的事情描述清楚
Good

function componentWillMount() {let _params = this.$router.paramsthis.params = resolveParams(params)
}/*
* 用于url在某些情况下会被转义
* 所以把路由的每一个参数都经过一遍转义字符的处理 防止异常情况
*/
function resolveParams(params) {params = params || {}for (let _key in _params) {let key = _key.replace(/amp;/g, '')params[key] = _params[_key]}return params
}

Bad
这样的注释就符合了不好注释:大量零碎注释的复杂代码

function resolveParams(params) {params = params || {}// 遍历路由参数for (let _key in _params) {// 把转义字符替换为空字符串let key = _key.replace(/amp;/g, '')params[key] = _params[_key]}return params
}

1.3 放大

用来放大某种看似不合理的地方,但是又很重要的地方

function main() {/** 这一步看似无厘头,但是很重要,请不要删除  */
}

坏注释

2.1 零碎的注释

应该在函数头部把函数意图描述清楚,别人懂了意图之后可以很快速的看懂代码
你要相信,看你代码的人肯定也是高手

function resolveParams(params) {params = params || {}// 遍历路由参数for (let _key in _params) {// 把转义字符替换为空字符串let key = _key.replace(/amp;/g, '')params[key] = _params[_key]}return params
}

2.2 多余的注释

class Goods {constructor(name, prize) {// 商品名this.name = name// 商品价格this.prize = prize}}

2.3 位置标记

function main(){// start=================do something// end=================
}

2.4 日志记录

完全可以用git commit记录好

function main(){/*** 2021.4.3 修改了xxx的逻辑* 2022.6.3 增加了xxx的逻辑*/do something
}

2.5 注释掉的代码

删除掉注释的代码,commit写好,在git中都可以找到历史记录

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在Kylin服务器安装PostgreSQL16数据库
  • 【深度学习|目标跟踪】快速入门卡尔曼滤波!
  • 笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU
  • 北京青蓝智慧科技:160个项目通过“数据要素×”大赛湖北分赛初赛
  • uniapp 开发公众号 h5(openid,微信支付,订阅通知)
  • C++ -- 负载均衡式在线OJ (一)
  • 大模型 - 分布式训练方法汇总
  • SQL-锁
  • 【算法】最短路径算法思路小结
  • C#中Override与New关键字的运用及实例解析
  • c# 什么是扩展方法
  • Oracle-OracleConnector
  • Linux应用层开发(7):网络编程
  • html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90
  • C语言实现UDP广播
  • ES6指北【2】—— 箭头函数
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • ➹使用webpack配置多页面应用(MPA)
  • 2017 年终总结 —— 在路上
  • C# 免费离线人脸识别 2.0 Demo
  • create-react-app做的留言板
  • dva中组件的懒加载
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Go 语言编译器的 //go: 详解
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • JS字符串转数字方法总结
  • Linux链接文件
  • Map集合、散列表、红黑树介绍
  • MySQL几个简单SQL的优化
  • MySQL-事务管理(基础)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Node项目之评分系统(二)- 数据库设计
  • Object.assign方法不能实现深复制
  • 测试开发系类之接口自动化测试
  • 关于for循环的简单归纳
  • 入门级的git使用指北
  • MyCAT水平分库
  • 阿里云服务器购买完整流程
  • 移动端高清、多屏适配方案
  • ​ssh免密码登录设置及问题总结
  • ​如何防止网络攻击?
  • #include到底该写在哪
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (附源码)php新闻发布平台 毕业设计 141646
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)c++ std::pair 与 std::make
  • (转)重识new
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core Web APi类库如何内嵌运行?
  • .Net 访问电子邮箱-LumiSoft.Net,好用