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

摘要: 好的注释可以提高代码的可读性和可维护性,从而提高代码质量。那么什么是好的注释?如何写出好的注释?

“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 heretotal = 0;// TODO: total should be configurable by an options paramthis.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/

原文链接

本文为云栖社区原创内容,未经允许不得转载。


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

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

相关文章

linux 给普通用户赋予最高权限

文章目录一、创建新用户二、给新用户设置密码三、赋予sudoers文件写的权限四、编辑sudoers文件五、删除sudoers文件写的权限一、创建新用户 useradd know二、给新用户设置密码 passwd know三、赋予sudoers文件写的权限 chmod uw /etc/sudoers四、编辑sudoers文件 vim /etc/…

php裁剪图片并上传源码,改写jcrop插件+php的图片上传实现与裁剪一体化

1.图片上传后立刻判断图片的宽和高是否超过预设的最大高度与宽度,超过了则生成缩略图,2.图片裁剪使用的是jquery的裁剪插件Jcrop,可以实现裁剪的即时预览,代码没有优化,会生成很多垃圾图片,欢迎大家一起改进&#xff0…

人工智能和机器学习的前世今生

摘要: 阅读本文以了解更多关于人工智能、机器学习和深度学习方面的知识,以及它们对商业化意味着什么。如果正确的利用模式识别进行商业预测和决策,那么会为企业带来巨大的利益。机器学习(ML)研究这些模式,并…

30 岁程序员生活图鉴,怎样算是活成了理想的模样?

戳蓝字“CSDN云计算”关注我们哦!文 | 年素清来源 | 程序人生第一批90后已近而立,相信他们中的每个人在年少的时候都曾经憧憬过长大后的图景:做医生当老师做大官,开飞机打怪兽赚大钱……程序员(媛)们自然也…

深度学习技巧与窍门

摘要: 本文是根据自身构建深度学习模型总结而来,适合有一定深度学习基础的读者阅读。本文是根据自身构建深度学习模型总结而来,可能读起来比较干巴,但干货确实不少。闲话少叙,直接进入相关内容。首先,为什么…

让我再撸一次HashMap

戳蓝字“CSDN云计算”关注我们哦!对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看,专攻HashMap即可。然而,鉴于网上大部分的关于HashMap的面试方向文章&#xff…

负载均衡SLB新功能介绍

摘要: 随着网络的各个核心部分业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。通过负载均衡扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、…

架构师必备技能:教你画出一张合格的技术架构图

戳蓝字“CSDN云计算”关注我们哦!当我们想用一张或几张图来描述我们的系统时,是不是经常遇到以下情况:对着画布无从下手、删了又来?如何用一张图描述我的系统,并且让产品、运营、开发都能看明白?画了一半的…

人工智能让边缘计算更有价值!

摘要: 继云计算之后,边缘计算这把火你了解多少?来了解一下吧。3月28日,在2018云栖大会深圳峰会上,阿里云宣布2018年将战略投入到边缘计算技术领域,并推出了首个IOT边缘计算产品Link Edge,将阿里云在云计算、…

硬件测试工程师之EMC项目-电磁干扰-谐波测试的引文

1: 介绍EMC项目-谐波测试 1.1引入文章 硬件测试工程师所面对的测试产品,尤其对于EMC来说,测试的种类很多,都是电器居多,例如电磁炉,USB适配器,空调,开关驱动,智能挂壁式…

儿童节,5岁宝宝写给程序员爸爸的一封信!萌翻了!

摘要: 六一儿童节到了,云栖社区特别采访了几位可爱的宝宝,来分享他们眼中的程序员爸爸妈妈。六一儿童节到了,云栖社区特别采访了几位可爱的宝宝,来分享他们眼中的程序员爸爸妈妈。最后一位宝宝的回答,萌翻了…

外部jar包_大数据系列之PySpark读写外部数据库

本文以MySQL和HBASE为例,简要介绍Spark通过PyMySQL和HadoopAPI算子对外部数据库的读写操作1、PySpark读写MySQLMySQL环境准备参考“数据库系列之MySQL主从复制集群部署”部分1.1 PyMySQL和MySQLDB模块PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库&#x…

Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目

文章目录一、安装 Vue CLI二、构建前端项目2.1.创建一个基于 webpack 模板的项目2.2. 安装图解2.3. 项目结构总览2.4. 运行项目2.5. 浏览器验证项目GitHub 地址: https://github.com/Antabot/White-Jotter在动手操作之前,我希望大家已经清楚什么是 “前后…

这本销量突破70W+的 Python 插画式书籍,凭什么这么火?

戳蓝字“CSDN云计算”关注我们哦!最近不管我在互联网看新闻、看视频或者看公众号文章,甚至我在淘宝的时候都会看到一个词,那就是“Python”,我也不知道我对它做了什么,为什么老是给我推送Python?甚至我和程…

【人脸识别终结者】多伦多大学反人脸识别,身份欺骗成功率达99.5%

摘要: 多伦多大学研究人员设计新算法,通过动态地干扰人脸识别工具来保护用户的隐私。结果表明,他们的系统可以将原本可检测到的人脸比例从接近100%降低到0.5%。在一些社交媒体平台,每次你上传照片或视频时,…

php中$stu_by,PHP基础案例二:计算学生年龄

一、需求分析为了方便、准确、快捷的展示学的年龄,系统通常根据学生的出生日期进行自动计算。下面请利用PHP变量分别保存学生的年月日,并通过PHP中的data函数获取当前年月日,最后计算出学生的年龄。例如:出生年月日为:…

iPhone11首批用户评价实属翻车现场;据悉,谷歌宣布投资30亿欧元扩大欧洲数据中心……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 微软说:杀手机器…

阿里七层流量入口 Tengine硬件加速探索之路

摘要: Tengine在软件层面已经有了深度的调试和优化经验,但是在硬件层面,通用处理器(CPU)已经进入了摩尔定律,有了瓶颈。而在业务量突飞猛进的当下,如何利用硬件来提升性能,承载双11等…

新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!

摘要:2018年6月,《阿里巴巴Java开发手册》再次刷新代码规范认知,我们新增了16条设计规约!现免费开放下载,不可错过!《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约…

受困于敏捷开发的数据与架构?肿么办?

戳蓝字“CSDN云计算”关注我们哦!译|Lorraine Lo文|Isaac Sacolick来源|InfoWorld网站如今企业强调敏捷开发不是一天两天,但在此过程中敏捷团队通常都会面临的一大挑战就是如何定义以及遵循开发中数据架构的模式和标准这一系列问题。人们之所以认为推动数…