(十五)Dart注释及文档

一、注释(非文档注释)

  • 要按照句子的格式来格式化评论。
// Not if there is nothing before it.
if (_chunks.isEmpty) return false;

如果第一个单词不是大小写相关的标识符,则首字母要大写。使用标点符号结尾 (句号、感叹号、问号)。对于所有的注释都是这样要求的:文档注释、 行内注释、甚至 TODO 注释。即使是一句话的一半也需要如此。

  • 不要 使用块注释作为解释说明。
greet(name) { // 推荐
  // Assume we have a valid name.
  print('Hi, $name!');
}

greet(name) { // 不建议
  /* Assume we have a valid name. */
  print('Hi, $name!');
}

你可以使用块注释 (/* ... */) 来临时的注释掉一些代码, 但是其他的所有注释都应该使用 //

二、文档注释

文档注释非常有用,dartdoc 解析这些注释并生成 漂亮的文档网页 。出现在定义语句(变量定义、函数声明、类定义 等)之前并且使用 /// 语法的都是文档注释。

2.1.要使用///文档注释来注释成员和类型。

使用文档注释可以让 dartdoc 来为你生成 代码 API 文档。

/// The number of characters in this chunk when unsplit.(好的范例)
int get length => ...


// The number of characters in this chunk when unsplit.(坏的范例)
int get length => ...

由于历史原因,dartdoc 支持两种格式的文档注释: /// (“C# 格式”) 和 /** ... */ (“JavaDoc 格式”)。我们推荐使用 /// 是因为其更加简洁。/***/ 在多行注释中间添加了开头和结尾的两行多余 内容。 /// 在一些情况下也更加易于阅读,例如 当注释文档中包含有使用 * 标记的列表内容的时候。

如果你现在还在使用 JavaDoc 风格格式,请考虑 使用新的格式。

2.2.要把第一个语句定义为一个段落。

注释文档中的第一个段落应该是简洁的、面向用户的注释。

/// Defines a flag.
///
/// Throws an [ArgumentError] if there is already an option named [name] or
/// there is already an option using abbreviation [abbr]. Returns the new flag.
Flag addFlag(String name, String abbr) { ... }

描述部分应该告诉读者这个 API 可以提供哪些功能,和类似的 API 标示 其区别。不要只是 重复 API 的名字,要告诉读者一些他们不知道的信息。

2.3.推荐用第三人称来开始函数或者方法的文档注释。

注释应该关注于代码 所实现的 功能。

/// Returns `true` if every element satisfies the [predicate].
bool all(bool predicate(T element)) { ... }

/// Starts the stopwatch if not already running.
void start() { ... }

2.4.推荐使用名词短语来开始变量、getter、setter 的注释。

注释文档应该表述这个属性是什么。虽然 getter 函数会做些计算, 但是也要求这样,调用者关心的是其结果而 不是如何计算的。

/// The current day of the week, where `0` is Sunday.
int weekday;

/// The number of checked buttons on the page.
int get checkedCount { ... }

如果同时有 getter 和 setter,只需要在 getter 上添加注释。 这样 dartdoc 会按照变量来对待 getter 和 setter。

2.5.推荐使用名词短语来开始库和类型注释。

在程序中,类的注释通常是最重要的文档。 类的注释描述了类型的不变性、介绍其使用的术语、 提供类成员使用的上下文信息。为类提供一些注释可以让 其他类成员的注释更易于理解和编写。

/// A chunk of non-breaking output text terminated by a hard or soft newline.
///
/// ...
class Chunk { ... }

2.6.考虑在文档注释中添加示例代码。

/// Returns the lesser of two numbers.
///
///     min(5, 3); // 3.
num min(num a, num b) { ... }

人类非常擅长从示例中抽象出实质内容,所以即使提供 一行最简单的示例代码都可以让 API 更易于理解。

2.7.要使用方括号在文档注释中引用作用域内的标识符。

如果把变量、函数、类型名字放到方括号里面,则 dartdoc 在生成文档的时候会链接到这些成员。

Throws a [StateError] if ...

similar to [anotherMethod], but ...

在标识符前面添加 new 关键字可以链接构造函数。

To create a point, call [new Point] or use [new Point.polar] to ...

2.8.要使用散文的方式来描述参数、返回值以及异常信息。

其他语言使用各种标签和额外的注释来描述参数和 返回值。

坏的范例:

/// Defines a flag with the given name and abbreviation.
///
/// @param name The name of the flag.
/// @param abbr The abbreviation for the flag.
/// @returns The new flag.
/// @throws ArgumentError If there is already an option with
///     the given name or abbreviation.
Flag addFlag(String name, String abbr) { ... }

而 Dart 把参数、返回值等描述放到文档注释中,并使用方括号来引用 以及高亮这些参数和返回值(好的范例)。

/// Defines a flag.
///
/// Throws an [ArgumentError] if there is already an option named [name] or
/// there is already an option using abbreviation [abbr]. Returns the new flag.
Flag addFlag(String name, String abbr) { ... }

2.9.避免在注释文档中提供冗余的类型信息。

用户在阅读文档注释的时候可以查看类型、返回值类型以及参数类型。并且在文档中 还可以跳转到变量的定义地方。所以 根本没必要在注释中加上额外的类型信息。

要告诉读者他们 不知道 的信息。

2.10.要把注释文档放到注解之前。

/// _Deprecated: Use [newMethod] instead._
@deprecated
oldMethod();

注意:
1、推荐为公开发布的 API 编写注释文档:
你没必要为所有顶级的变量、类型、成员 都提供注释文档,但是 对于公开的成员则应该提供注释文档。
2、考虑为私有 API 编写注释文档:
文档不仅仅为了使用你的类的用户所编写。 也可以用来帮助理解你的类是如何调用其他 类的。

三、Markdown

在注释文档中可以使用大部分 markdown 格式, dartdoc 会使用 markdown package 来格式化这些内容。

现在到处都有介绍 Markdown 的文档,以及到处都是使用 Markdown。所以我们选择了支持它。 下面是一个 Markdown 语法的快速预览。

/// This is a paragraph of regular text.
///
/// This sentence has *two* _emphasized_ words (i.e. italics) and **two**
/// __strong__ ones (bold).
///
/// A blank line creates another separate paragraph. It has some `inline code`
/// delimited using backticks.
///
/// * Unordered lists.
/// * Look like ASCII bullet lists.
/// * You can also use `-` or `+`.
///
/// 1. Numbered lists.
/// 2. Are, well, numbered.
/// 1. But the values don't matter.
///
///     * You can nest lists too.
///     * They must be indented at least 4 spaces.
///     * (Well, 5 including the space after `///`.)
///
/// Code blocks are indented the same way:
///
///     this.code
///         .will
///         .retain(its, formatting);
///
/// Links can be:
///
/// * http://www.just-a-bare-url.com
/// * [with the URL inline](http://google.com)
/// * [or separated out][ref link]
///
/// [ref link]: http://google.com
///
/// # A Header
///
/// ## A subheader
///
/// ### A subsubheader
///
/// #### If you need this many levels of headers, you're doing it wrong

3.1.避免过度使用 markdown。

当你不确定的时候,就不要使用文字格式。文字格式是为了更好的表达你的意图, 而不是替代你的文字内容。 文字内容才是最重要的。

3.2.避免使用 HTML 来格式化文字。

在极少数情况下使用HTML 可能是 有用的。比如显示表格。但是在大部分 情况下都没必要使用它。和 Markdown 相比太复杂了,最好 不要使用 HTML。

四、如何写注释

虽然我们认为我们是程序员,但是大部分情况下源代码中的内容都是为了 让人类更易于阅读和理解代码。对于 任何编程语言,都值得 努力练习来提高您的熟练程度。

下面列举了一些编写文档的指导原则。在 技术写作风格 中你可以了解 技术写作的最佳实践。

4.1. 推荐 简洁.

要清晰和准确,同时还要简洁。

4.2.避免缩写和首字母缩略词(非常流行的除外)。

大部分人都不知道 “i.e.”、 “e.g.” 和 “et. al.” 的意思。你所在领域的 首字母缩略词对于其他人可能并不了解。

4.3.推荐使用 “this” 而不是 “the” 来引用实例成员。

当提及到类的成员,通常是指被调用的对象实例的成员。 使用 “the” 可能会导致混淆。

class Box {
  /// The value this wraps.
  var _value;

  /// True if this box contains a value.
  bool get hasValue => _value != null;
}

参考资料:
Effective Dart

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 代码注释是开发过程中必不可少的一个过程,那么,我们在进行Flutter开发时,怎么去进行文档注释呢?这篇文章的主旨...
    Samlss阅读 12,621评论 1 5
  • 前言 什么是注释? 在编程语言中,注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。 也有一句话是...
    ditclear阅读 1,295评论 0 5
  • 前言 本篇文章主要讲解如何使用不同的工具来生成HTML注释文档 , 对于注释的使用和说明你可以在注释使用这篇文章得...
    与伟大LEE同行阅读 2,461评论 2 5
  • 如何阅读指南 DO 应始终遵循的准则 DON'T 不应该这么使用的准则 PREFER 应该遵循的准则,但是在某些情...
    _白羊阅读 1,531评论 2 1
  • 前端和后端注释文档生成 前端和后端的 函数及api 说明文档生成总结,持续更新中 by Qzx 参考网址 jsD...
    流云012阅读 11,968评论 0 1