前端注释规范

编写代码注释的最佳实践

好的注释可以提高代码的可读性和可维护性,从而提高代码质量。
作为研发同学,对于代码“注释”其实并不陌生。它往往作为我们代码文档的特殊补充而存在。
提倡加注释,但不能滥用。我们开发流程中会有Code Review过程,这样每个人都将了解好的注释是什么样的,同时你遇到不好的代码注释,也需要告诉他如何改进。

这里有一些规则可以帮助我们把注释写的更好。

规则 1:注释不应与代码重复。

规则 2:好的注释不能成为不清晰代码的借口。

规则3:如果不能写清楚的注释,可能是代码有问题。

规则 4:评论应该消除混乱,而不是引起混乱。

规则 5:在注释中解释单一的代码。

规则 6:提供复制代码的原始来源的链接。

规则 7:在最有帮助的地方包含指向外部参考的链接。

规则 8:修复错误时添加注释。

规则 9:使用注释来标记不完整的实现。


规则 1:注释不应与代码重复。注释不应重复代码的工作。应该去解释代码的模型和心智模型的映射关系,应说明为什么要使用这个代码模型,下面的例子就是反面教材:
// bad
/** the name. */
let name:string;
/** the version. */ 
let Version:string;
/** the info. */
let info:string;
// 使用给定的深度,在给定的子树中查找具有给定名称的节点。 
func FindNodeInSubtree(subTree *Node, name string, depth *int) *Node {
} 
规则 2:好的注释不能成为不清晰代码的借口。如起变量名时候取其实际含义,没必要随便写个变量名然后在注释里面偷偷用功。起函数名时动词+名词结合。我们应当追求「代码自注释」,即代码本身就拥有较高的可读性(通过清晰的命名、合理的结构等)。 别害怕长名称,长而具有描述性的名称,比长注释好。别害怕花时间取名字。
//bad
// 如果已经准备好数据,就渲染表格
if (data.success && data.result.length > 0) {renderTable(data);  
}
//good
const isTableDataReady = data.success && data.result.length > 0;
if (isTableDataReady) {renderTable(data);
}
//good
init: function() {// 获取配置信息const config = getConfig();// 获取用户信息const userInfo = getUserInfo();// 根据配置和用户信息,进行初始化doInit(config, userInfo);// 如果存在自定义配置时的特殊逻辑if (config.custom) {...}
}
规则 3:如果不能写清楚的注释,可能是代码有问题

**克尼根定律:布莱恩·克尼根正是与人合著了《C编程语言圣经》的人,以这条有见地的定律而闻名。关键在于:写好代码,写可读代码,写简单代码,只要不是聪明的代码就行。
试图用象牙塔的复杂性来锻炼你的编程能力,与编写干净、更好的代码的意义恰恰相反。你的代码越难理解,当它不可避免地崩溃时,调试就越困难。

规则 4:注释应该消除混乱,而不是引起混乱。若编程语言足够有表现力,我们就不需要注释。代码在演化,注释却不总是随之变动。不准确的注释比没注释坏的多。写为什么做,少写做了什么。

``

规则 5:在注释中解释单一的代码
//bad,代码中不应该去解释大家都能理解的代码,除非是在给新手编写教程。
final Object value = (new JSONTokener(jsonString)).nextValue();
// Note that JSONTokener.nextValue() may return
// a value equals() to null.
if (value == null || value.equals(null)) {return null;
}
规则 6:提供复制代码的原始来源的链接
/** 将可绘制对象转换为位图. via https://stackoverflow.com/a/46018816/2219998. */
return (int) (0.3 * red + 0.59 * green + 0.11 * blue);
规则 7:在最有帮助的地方包含指向外部参考的链接
/*** Returns the current location object, which represents the current URL in web* browsers.** Note: If you're using this it may mean you're doing some of your own* "routing" in your app, and we'd like to know what your use case is. We may* be able to provide something higher-level to better suit your needs.** @see https://reactrouter.com/docs/en/v6/api#uselocation*/
export declare function useLocation(): Location; 
规则 9:使用注释来标记不完整的实现

即使代码中有已知的限制,有时还是有必要检查它。虽然不分享代码中已知的缺陷很有诱惑力,但最好将这些明确化,例如使用TODO注释:

// TODO(hal): We are making the decimal separator be a period, 
// regardless of the locale of the phone. We need to think about 
// how to allow comma as decimal separator, which will require 
// updating number parsing and other places that transform numbers 
// to strings, such as FormatAsDecimal

注释规约

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

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

// 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;
}

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

// 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;
}

【强制】注释内容和注释符之间需要有一个空格,以增加可读性。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;
}

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

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

  1. FIXME: 说明问题是什么
  2. 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;}
}

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

@see 这是JsDoc规范 这是链接 JsDoc规范。
JSDoc 是一个根据 JavaScript 文件中注释信息,生成 JavaScript 应用程序或模块的API文档的工具。

/*** 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;}
};

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

Eslint:保证一致的注释风格ESLint 是当下最流行的 JS 代码检查工具,ESLint 中有一些注释相关的规则,用户可选择开启:
@see 这是Eslint规范 这是链接 EsLint规范。

  1. no-warning-comments 开发者经常给代码添加注释,标明哪些没有完成或需要审查。在你认为代码可以发布之前,你很有可能想修复或审查代码,然后删除注释。
  2. capitalized-comments 如果您不关心代码库中注释的语法风格,则可以禁用此规则。控制注释如果是英文首字母必须大写
  3. line-comment-position 如果您不关心有不同的行注释样式,那么您可以关闭此规则。控制行注释位置
  4. lines-around-comment 许多人喜欢简洁的代码风格,并且不介意与代码冲突的评论。如果您属于该类别,则此规则不适合您。 控制间隔评论,块前空间。
  5. multiline-comment-style 如果您不想为多行注释强制执行特定样式,则可以禁用该规则。 控制多行注释样式。
  6. no-inline-comments 控制内联注释位置。
  7. spaced-comment 控制一些注释间隔。

结论
我希望上面的例子已经表明注释不能原谅或修复错误的代码;它们通过提供不同类型的信息来补充好的代码。
正如 Stack Overflow 联合创始人 Jeff Atwood 所写的那样,“代码告诉你如何,评论告诉你为什么。”
遵循这些规则应该可以节省您和您的队友的时间和挫败感。

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

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

相关文章

文件操作解析(一)

前言 很多非计科的专业并未对文件操作这点做出详细解释,今天复习到这里就想趁此机会记录一下自己学到的知识,也希望能对大家有所帮助。 一.为什么使用文件 如果没有⽂件,我们写的程序的数据是存储在电脑的 内存中, 如果程序退出…

selinux简介

Selinux使用详解 注:redhat selinux使用说明文档:使用 SELinux Red Hat Enterprise Linux 8 | Red Hat Customer Portal 1、说明 selinux(security enhanced linux安全性增强的linux) 由美国安全局nsa(national se…

电脑屏幕横过来了怎么恢复?这4个方法好用又简单!

“我在用电脑的时候不知道为什么,电脑屏幕一整个都横过来了。导致我无法正常使用电脑,应该怎么解决这个问题呢?希望大家帮我出出主意!” 在现代社会中,电脑已经成为了我们工作、学习和生活中不可或缺的工具。然而&…

搭建开源数据库中间件MyCat2-配置mysql数据库双主双从

mycat2官网:MyCat2 前言:mycat2下载地址无法访问,不知道是不是被DNS污染了,还是需要搭梯子访问,所以我只能找到1.21的版本进行安装。搭建mycat2的前提是搭建数据库主从复制。 架构:双主双从 配置&#xf…

[EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Acer Aspire A515-54g 处理器 Intel i5 10210U 已驱动内存16 Gb DDR4 2400 Mhz已驱动硬盘Samsung 970 Pro 512Gb已驱动显卡Intel UHD Graphics 630已驱动声卡Realtek ALC255已驱动网卡RTL8111已驱动无线网卡蓝牙Intel AC 9462已驱动 支持系统版本 macos H…

汽车芯片「新变量」

编者按:汽车行业的格局重构和技术革新,也在推动芯片赛道进入变革周期。不同商业模式的博弈,持续升温。 对于智能汽车来说,过去几年经历了多轮硬件和软件的性能迭代,甚至是革新,如今,市场正在进…

云原生场景下,AIGC 模型服务的工程挑战和应对

作者:徐之浩、车漾 “成本”、“性能”和 “效率”正在成为影响大模型生产和应用的三个核心因素,也是企业基础设施在面临生产、使用大模型时的全新挑战。AI 领域的快速发展不仅需要算法的突破,也需要工程的创新。 大模型推理对基础设施带来…

测试开发(5)测试分类标准 :按测试对像划分、按是否查看代码划分、按开发阶段划分、按测试实施组织、按是否运行划分、按是否手工划分、按测试地域划分

接上次博客: 测试开发(4)测试用例基本要素、好处、测试用例设计方法 :基于需求进行测试用例的设计;具体的设计方法【等价类、边界值、错误猜测法、场景设计法、因果图/测试表法、正交排列】、万能公式、有效性、粒度和…

关于FET等效电路电容模型中的能量非守恒问题

标题:On the Energy Nonconservation in the FET’s Equivalent Circuit Capacitance Model 摘要 摘要——本文回答了长期以来关于如何在场效应晶体管(FET)等效电路模型中非互易电容形式与能量守恒原理之间达成调和的问题。通过对模拟和测量…

FPGA引脚物理电平(内部资源,Select IO)-认知2

引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and…

[贪心算法] 国王游戏

题目描述 ​ 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大…

qt写文件中文乱码问题解决

问题 在用qt往文件写入中文时,总是出现乱码 解决 QFile file; QTextStream textStream; file.setFileName("test.txt"); if (file.open(QIODevice::Append | QIODevice::Text)) {textStream.setDevice(&file);textStream.setCodec("UTF-8&quo…

【软件测试学习笔记7】Linux指令实操练习

1.在Linux终端中可以通过哪些命令进入到用户目录 cd/home/用户目录 cd~ 2,在Linux终端中,如何查看用户目录下的所有文件(包含隐藏文件)的详细信息。(使用绝对路径和相对路径) ls -al/home/用户目录 l…

spring常见漏洞(5)

CVE-2018-1273 Spring Data Commons远程命令执行(CVE-2018-1273),当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为Spel的执行内容而产生漏洞 影响版本 Spring Data Commons 1.13…

微信小程序的springboot高校新生报道管理系统

考虑到实际生活中在毕业论文选题管理方面的需要以及对该系统认真的分析,将小程序权限按管理员和用户这两类涉及用户划分。 (a) 管理员;管理员使用本系统涉到的功能主要有系统首页、个人中心、学生管理、指导教师管理、课题信息管理、选题信息管理、论文信息管理、疑…

Erlang/OTP中的日志与事件处理(二)

用gen_event编写自定义事件处理器 可能你并不喜欢错误日志记录器的默认输出格式。它与所有其他系统所使用的格式确实有较大的差异。你所在的企业可能已经围绕自己的日志格式开发了大量工具,这些工具无法与Erlang的日志格式兼容。这时你该怎么办呢?还好&#xff0c…

前端面试题-html5新增特性有哪些

HTML html5新增特性有哪些 1.新增了语义化标签 标签用法header定义文档或区块的页眉,通常包含标题,导航和其他有关信息nav定义导航链接的容器,用于包裹网站的导航部分section定义文档的一个独立节或区块,用于组织相关的内容art…

51单片机_智能家居终端

实物演示效果: https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统?51单片机的芯片是否具有与WiFi通信的能力?如果有的话,具体有哪些芯片啊&a…

银河麒麟操作系统 v10 中离线安装 Docker

银河麒麟操作系统 v10 中离线安装 Docker 1. 查看系统版本2. 查看 Linux 内核版本(3.10以上)3. 查看 iptabls 版本(1.4以上)4. 判断处理器架构5. 离线下载 Docker 安装包6. 移动解压出来的二进制文件到 /usr/bin 目录中7. 配置 Do…

Python ❀ 使用代码实现API接口调用详解

文章目录 1. 工具准备1.1. requests代码包1.2. BurpSuite抓包工具 2. 操作过程2.1. 一个简单的请求2.1.1. Burp获取响应2.1.2. 转发获取响应 2.2. 构造GET类型URL参数2.3. 构造请求头部2.4. 构造POST类型payload数据 本文主要讲解常用API接口如何使用python实现。 API&#xff…