AI 助理
备案 控制台
开发者社区 云效DevOps平台 文章 正文

注释那些事儿:前端代码质量系列文章(一)

本文涉及的产品
云效 DevOps 流水线,基础版人数 不受限
推荐场景:
SAE+云效,10分钟快速打通CI/CD流水线 2分钟自动化部署人生模拟器
云效 DevOps 项目协作,基础版人数 不受限
云效 DevOps 代码管理,基础版人数 不受限
简介: 好的注释可以提高代码的可读性和可维护性,从而提高代码质量。那么什么是好的注释?如何写出好的注释?

“Comment or not comment, that is the question


好的注释可以提高代码的可读性和可维护性,从而提高代码质量。


那么什么是好的注释?如何写出好的注释?本文将从注释的目的和原则出发对 JS 注释进行探讨。

01


注释的目的和原则


注释的目的:

  • 提高代码的可读性,从而提高代码的可维护性


注释的原则:

  • 如无必要,勿增注释 ( As short as possible )

  • 如有必要,尽量详尽 ( As long as necessary )


我们写注释,是为了给代码的读者(包括我们自己,也可能包括机器,如 jsdoc)看,帮助读者阅读理解代码并进行维护。

如无必要,勿增注释」是指注释要避免 过多过滥,不要为了注释而注释。多余的注释等价于冗余的代码,除了对增加可读性无益,一旦代码需要修改,修改注释也会是一大负担。

我们应当追求「代码自注释」,即代码本身就拥有较高的可读性(通过清晰的命名、合理的结构等。举个例子:


// bad
// 如果已经准备好数据,就渲染表格
if (data.success && data.result.length > 0) {
  renderTable(data);  
}

// good
const isTableDataReady = data.success && data.result.length > 0;
if (isTableDataReady) {
  renderTable(data);
}

如有必要,尽量详尽」是指需要注释的地方应该尽量详尽地去写,以让阅读者可以充分了解代码的逻辑和意图为标准。

02



什么是好注释,什么是坏注释

根据注释的原则,我们应该以「能否帮助阅读者更好地阅读理解代码」为标准,判断一个注释「是否有必要」

注释包括:

  • 帮助读者更好地了解代码逻辑和结构,例如:

init: function() {
 // 获取配置信息
 const config = getConfig();
 
 // 获取用户信息
 const userInfo = getUserInfo();
 
 // 根据配置和用户信息,进行初始化
 doInit(config, userInfo);
 
 // 如果存在自定义配置时的特殊逻辑
 if (config.custom) {
   ...
 }
}
  • 特殊或不易理解写法的解释说明,例如:

/** 
* parseInt was the reason my code was slow.
* Bitshifting the String to coerce it to a
* Number made it a lot faster.
*/
const val = inputValue >> 0;
  • 特殊标记注释:如 TODO、FIXME 等有特殊含义的标记

  • 文件注释:部分规约会约定在文件头部书写固定格式的注释,如注明作者、协议等信息

  • 文档类注释:部分规约会约定 API、类、函数等使用文档类注释(如 jsdoc 风格)

  • 遵循统一的风格规范,如一定的空格、空行,以保证注释自身的可读性

注释包括:

  • 注释对阅读代码无益:如本文第一个示例,本可以不用注释,用清晰的命名、逻辑进行代码自注释

  • 遵循统一的风格规范:如单行注释长度、空格、空行,例如:

// bad 单行注释过长,不易阅读,应写成多行
// parseInt was the reason my code was slow.Bitshifting the String to coerce it to Number made it a lot faster.
const val = inputValue >> 0;

// good
/**
* parseInt was the reason my code was slow.
* Bitshifting the String to coerce it to a
* Number made it a lot faster.
*/

const val = inputValue >> 0;


  • 情绪性注释:如抱怨、歧视、搞怪等(被发现你就跪了





03



如何写好注释



注释规约


理解注释的目的和原则,制定并遵循一份注释规约,以保证注释的可读性和一致性

工具保障



比如使用 ESLint 保证注释风格的一致,使用 Sonar 检查项目注释率


04


注释规约

这里给出一份可供参考的注释规约(参考自airbnb规约):

4.1 【推荐】单行注释使用 //

注释应单独一行写在被注释对象的上方,不要追加在某条语句的后面:

// bad
const active = true; // is current tab

// good
// is current tab
const active = true;

注释行的上方需要有一个空行(除非注释行上方是一个块的顶部),以增加可读性:

// bad
function getType() {  
 console.log('fetching type...');  
 // set the default type to 'no type'  const type = this.type || 'no type';  
 return type; }
 
// good
function getType() {  
 console.log('fetching type...');  
 
 // set the default type to 'no type'  const type = this.type || 'no type';  
 return type; }

// good
// 注释行上面是一个块的顶部时不需要空行
function getType() {  
 // set the default type to 'no type'  const type = this.type || 'no type';  return type; }

4.2 【推荐】多行注释使用 /** ... */,而不是多行的 //

// bad
// make() returns a new element
// based on the passed in tag name
function make(tag) {
  // ...

  return element;
}

// good
/**
 * make() returns a new element
 * based on the passed-in tag name
 */
function make(tag) {
  // ...

  return element;
}

4.3 【强制】注释内容和注释符之间需要有一个空格,以增加可读性。eslint: spaced-comment

// bad
//is current tab
const active = true;

// good
// is current tab
const active = true;

// bad
/** *make() returns a new element *based on the passed-in tag name */
function make(tag) {  
 // ...  return element; }

// good
/** * make() returns a new element * based on the passed-in tag name */
function make(tag) {  
 // ...  return element; }

4.4 【推荐】使用特殊注释标记

有时我们发现某个可能的 bug,但因为一些原因还没法修复;或者某个地方还有一些待完成的功能,这时我们需要使用相应的特殊标记注释来告知未来的自己或合作者。常用的特殊标记有两种:

  • // FIXME: 说明问题是什么

  • // TODO: 说明还要做什么或者问题的解决方案

class Calculator extends Abacus {
  constructor() {
	super();

	// FIXME: shouldn’t use a global here
	total = 0;

	// TODO: total should be configurable by an options param
	this.total = 0;
  }
}

4.5 【推荐】文档类注释,如函数、类、文件、事件等,使用 jsdoc 规范

例如:

/**
 * Book类,代表一个书本.
 * @constructor
 * @param {string} title - 书本的标题.
 * @param {string} author - 书本的作者.
 */
function Book(title, author) {
  this.title=title;
  this.author=author;
}

Book.prototype={
  /**
   * 获取书本的标题
   * @returns {string|*}
   */
  getTitle:function(){
	return this.title;
  },

  /**
   * 设置书本的页数
   * @param pageNum {number} 页数
   */
  setPageNum:function(pageNum){
	this.pageNum=pageNum;
  }
};

05

工具

我们可以使用一些工具来保证注释质量,例如:


Eslint:保证一致的注释风格


ESLint 是当下最流行的 JS 代码检查工具,ESLint 中有一些注释相关的规则,用户可选择开启:

  • valid-jsdoc

  • require-jsdoc

  • no-warning-comments

  • capitalized-comments

  • line-comment-position

  • lines-around-comment

  • multiline-comment-style

  • no-inline-comments

  • spaced-comment

Sonar:检查项目的注释率


Sonar 是一个代码持续集成平台,它可以对代码进行静态扫描,得到项目的注释率数据。


注释率反应了注释行占总代码行的比例,注释率太低不好,但也不能盲目追求高注释率。


另外,同 Eslint 类似,Sonar 也有一些针对注释风格规则可以配置。

06

后记

理解注释的目的和原则,遵循一份注释规约并结合工具保证落地,可以使注释成为代码良好的辅助,增强可读性和可维护性,从而提高代码质量。


本篇是《前端代码质量系列文章》的第一篇,后续系列文章还将讨论编码规约、复杂度、重复率等主题,敬请期待:)


本文部分内容和代码示例参考:

  • aralejs注释规范 https://github.com/aralejs/aralejs.github.io/wiki/JavaScript-注释规范

  • airbnb编码规约 https://github.com/airbnb/javascript#comments

  • http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/comments/


部分配图来自网络,如有侵删,请作者联系


  本文来源微信公众号:TXD技术体验设计(TXD-UED)


《注释那些事儿:前端代码质量系列文章(二)》关注云效微信公号(ali_yunxiao)。





云效和通义灵码官方马甲
目录
相关文章
石小石Orz
|
2月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
石小石Orz
36 0
石小石Orz
|
2月前
|
存储 前端开发 JavaScript
【前端学java】一篇文章带你精通java 中的数组(10)
【8月更文挑战第10天】一篇文章带你精通java 中的数组
石小石Orz
15 3
【前端学java】一篇文章带你精通java 中的数组(10)
热爱技术的小郑
|
2月前
|
前端开发 JavaScript
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
这篇文章介绍了使用AJAX技术将前端页面中表单接收的多个参数快速便捷地传输到后端servlet的方法,并通过示例代码展示了前端JavaScript中的AJAX调用和后端servlet的接收处理。
热爱技术的小郑
25 2
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
土木林森
|
2月前
|
存储 移动开发 前端开发
HTML5时代来临,这些新特性你掌握了吗?一篇文章带你玩转Web前端技术潮流!
【8月更文挑战第26天】HTML5(简称H5)作为新一代Web标准,相比HTML4带来了诸多增强功能。
土木林森
50 2
石小石Orz
|
2月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!
石小石Orz
30 0
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
爱你三千遍斯塔克
|
3月前
|
JavaScript 前端开发 网络架构
文本,展现到文章的面前,Vue结合v-for实现传参的方法,好的资料,Vue实现动态绑定,数据放到前端页面上
文本,展现到文章的面前,Vue结合v-for实现传参的方法,好的资料,Vue实现动态绑定,数据放到前端页面上
爱你三千遍斯塔克
34 0
朝阳39
|
3月前
|
前端开发
Element UI 表格常用改造(表头添加注释、翻页连续序号【内含前端分页】)
Element UI 表格常用改造(表头添加注释、翻页连续序号【内含前端分页】)
朝阳39
161 0
LibertyNLP
|
5月前
|
JSON 前端开发 JavaScript
【2024-04-22 源码】最新PDF批注注释插件库,pdf.js插件库,纯前端离线JavaScript库(PDF高亮、下划线、橡皮擦、文本框、画笔、历史记录)
一款基于 pdf.js 开发的PDF批注插件库,支持纯离线内网部署,功能完善、强大且在不断升级,极易上手,欢迎关注!
LibertyNLP
184 4
【2024-04-22 源码】最新PDF批注注释插件库,pdf.js插件库,纯前端离线JavaScript库(PDF高亮、下划线、橡皮擦、文本框、画笔、历史记录)
尹彦彦
|
5月前
|
前端开发 JavaScript 开发者
网页设计与开发:一篇文章带你领略前端世界的魅力
网页设计与开发:一篇文章带你领略前端世界的魅力
尹彦彦
227 1
土木林森
|
5月前
|
Dart 前端开发 测试技术
【Flutter前端技术开发专栏】Flutter开发中的代码质量与重构实践
【4月更文挑战第30天】随着Flutter在跨平台开发的普及,保证代码质量成为开发者关注的重点。优质代码能确保应用性能与稳定性,提高开发效率。关键策略包括遵循最佳实践,编写可读性强的代码,实施代码审查和自动化测试。重构实践在项目扩展时尤为重要,适时重构能优化结构,降低维护成本。开发者应重视代码质量和重构,以促进项目成功。
土木林森
73 0
【Flutter前端技术开发专栏】Flutter开发中的代码质量与重构实践

云效DevOps平台

热门文章

最新文章

  • 1
    基于dart生态的FaaS前端一体化建设
  • 2
    前端技术-element-ui 介绍 | 学习笔记
  • 3
    puppet使用 apache passsenger 作为前端 (centos)
  • 4
    lemon oa前端页面——由user-base-list谈项目组织
  • 5
    从《淘特斗地主》说起,前端如何做 h5 游戏的游戏体验
  • 6
    使用篇-基于Laravel开发博客应用系列 —— 使用Bower+Gulp集成前端资源
  • 7
    Vue vs. React:比较两大前端框架的特点与区别
  • 8
    【前端】form标签multipart/form-data 文件上传表单中 传递参数无法获取的原因
  • 9
    前端开发中的最佳实践与技巧
  • 10
    【前端】使用jQuery探索正则表达时,金额验证、纯数字验证等
  • 1
    如何优化前端网页加载速度
    74
  • 2
    前端布局方式及其优缺点
    52
  • 3
    前端算法之基数排序
    38
  • 4
    前端算法之桶排序
    26
  • 5
    前端算法之计数排序
    33
  • 6
    前端算法之堆排序
    37
  • 7
    我们是否对现代前端开发框架过于崇拜了?
    90
  • 8
    前端算法之快速排序
    54
  • 9
    前端算法之归并排序
    34
  • 10
    前端算法之希尔排序
    32
  • 相关课程

    更多
  • 网站性能前端监控课程
  • 移动Web前端开发
  • Ajax 前端开发入门与实战
  • 零基础学前端HTML+CSS
  • 前端开发CSS基础
  • 前端开发框架Bootstrap使用教程
  • 相关电子书

    更多
  • Vue.js 在前端服务化上的探索与实践
  • 阿里文娱大前端技术实践
  • 前端代码是怎样智能生成的
  • 相关实验场景

    更多
  • 前端开发基础3:CSS3常见显示属性
  • 前端开发基础6:Node.js和LESS预编译工具
  • 前端开发基础2:VS Code和Edge的联动开发
  • 前端开发基础1:前端开发环境的安装和配置
  • 下一篇
    AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片

    玻璃钢生产厂家中山玻璃钢造型雕塑兰州frp玻璃钢雕塑商场风车美陈广州户外游乐场玻璃钢雕塑云南公园玻璃钢雕塑商场美陈收费上海主题商场美陈市场报价中山定做玻璃钢卡通雕塑芒市玻璃钢雕塑哪里买云南肖像校园玻璃钢雕塑公司德州彩绘玻璃钢雕塑龙岩玻璃钢广场雕塑临沧市玻璃钢雕塑批发洛阳河源玻璃钢卡通雕塑重庆玻璃钢商城广场美陈雕塑加工福建商场美陈采购商场美陈枫叶山西高质量玻璃钢雕塑定制贵州佛像玻璃钢雕塑设计珠海革命主题玻璃钢人物雕塑四川高质量玻璃钢雕塑销售电话玻璃钢人物雕塑标题恩施玻璃钢雕塑设计价格杭州新款玻璃钢座椅雕塑小品系列玻璃钢雕塑哪家好重庆顺昌玻璃钢雕塑报价明细表商场美陈搭建费用长沙镜面不锈钢玻璃钢人物雕塑侯马玻璃钢牛雕塑河南水景玻璃钢景观雕塑生产香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

    玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化