http://dart.goodev.org/guides/language/effective-dart/documentation
如果您已经知道了代码的上下文信息,则更容易理解代码。 但是当新手阅读您的代码或者很久以后您再次阅读您的代码, 代码的上下文信息可能已经不记得了。编写精炼的、准确的注释 只需要几秒钟,但是以后可能节省其他人几个小时 的时间来读懂您的代码。
我们已经知道代码应该自我说明(代码就是最好的文档)并且并非所有的注释都是有用的。 但是,真实情况是大家都把应该写的评论给省略了。 和练习一样:从技术上你可以做很多,但是实际上你 只做了一点点。尝试着逐步提高。
下面的说明应用于不包含在生成的 代码文档中的注释。
// Not if there is nothing before it.
if (_chunks.isEmpty) return false;
如果第一个单词不是大小写相关的标识符,则首字母要大写。使用标点符号结尾 (句号、感叹号、问号)。对于所有的注释都是这样要求的:文档注释、 行内注释、甚至 TODO 注释。即使是一句话的一半也需要如此。
greet(name) {
// Assume we have a valid name.
print('Hi, $name!');
}
ERRORDEMO:
greet(name) {
/* Assume we have a valid name. */
print('Hi, $name!');
}
你可以使用块注释 (/ ... /) 来临时的注释掉一些代码, 但是其他的所有注释都应该使用 //。
文档注释非常有用,dartdoc
解析这些注释并生成 漂亮的文档网页 。出现在定义语句(变量定义、函数声明、类定义 等)之前并且使用 ///
语法的都是文档注释。
使用文档注释可以让 dartdoc 来为你生成 代码 API 文档。
/// The number of characters in this chunk when unsplit.
int get length => ...
ERRORDEMO:
// The number of characters in this chunk when unsplit.
int get length => ...
由于历史原因,dartdoc 支持两种格式的文档注释: ///
(“C# 格式”) 和 /** ... */
(“JavaDoc 格式”)。我们推荐使用 ///
是因为其更加简洁。/**
和 */
在多行注释中间添加了开头和结尾的两行多余 内容。 ///
在一些情况下也更加易于阅读,例如 当注释文档中包含有使用 * 标记的列表内容的时候。
如果你现在还在使用 JavaDoc 风格格式,请考虑 使用新的格式。
你没必要为所有顶级的变量、类型、成员 都提供注释文档,但是 对于公开的成员则应该提供注释文档。
文档不仅仅为了使用你的类的用户所编写。 也可以用来帮助理解你的类是如何调用其他 类的。
注释文档中的第一个段落应该是简洁的、面向用户的注释。例如下面的示例, 通常不是一个完成的语句。
/// 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) { ... }
/// Starts a new block as a child of the current chunk. Nested blocks are
/// handled using their own independent [LineWriter].
ChunkBuilder startBlock() { ... }
描述部分应该告诉读者这个 API 可以提供哪些功能,和类似的 API 标示 其区别。不要只是 重复 API 的名字,要告诉读者一些他们不知道的信息。
注释应该关注于代码 所实现的 功能。
/// Returns `true` if every element satisfies the [predicate].
bool all(bool predicate(T element)) { ... }
/// Starts the stopwatch if not already running.
void start() { ... }
注释文档应该表述这个属性是什么。虽然 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。
在程序中,类的注释通常是最重要的文档。 类的注释描述了类型的不变性、介绍其使用的术语、 提供类成员使用的上下文信息。为类提供一些注释可以让 其他类成员的注释更易于理解和编写。
/// A chunk of non-breaking output text terminated by a hard or soft newline.
///
/// ...
class Chunk { ... }
/// Returns the lesser of two numbers.
///
/// min(5, 3); // 3.
num min(num a, num b) { ... }
人类非常擅长从示例中抽象出实质内容,所以即使提供 一行最简单的示例代码都可以让 API 更易于理解。
如果把变量、函数、类型名字放到方括号里面,则 dartdoc 在生成文档的时候会链接到这些成员。
Throws a [StateError] if ...
similar to [anotherMethod], but ...
在标识符前面添加 new 关键字可以链接构造函数。
To create a point, call [new Point] or use [new Point.polar] to ...
其他语言使用各种标签和额外的注释来描述参数和 返回值。
ERRORDEMO:
/// 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) { ... }
用户在阅读文档注释的时候可以查看类型、返回值类型以及参数类型。并且在文档中 还可以跳转到变量的定义地方。所以 根本没必要在注释中加上额外的类型信息。
要告诉读者他们 不知道 的信息。
要 把注释文档放到注解之前。
/// _Deprecated: Use [newMethod] instead._
@deprecated
oldMethod();
ERRORDEMO:
@deprecated
/// _Deprecated: Use [newMethod] instead._
oldMethod();
在注释文档中可以使用大部分 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
/// * [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
避免 过度使用 markdown。
当你不确定的时候,就不要使用文字格式。文字格式是为了更好的表达你的意图, 而不是替代你的文字内容。 文字内容才是最重要的。
避免 使用 HTML 来格式化文字。 在极少数情况下使用HTML 可能是 有用的。比如显示表格。但是在大部分 情况下都没必要使用它。和 Markdown 相比太复杂了,最好 不要使用 HTML。
如何写注释 虽然我们认为我们是程序员,但是大部分情况下源代码中的内容都是为了 让人类更易于阅读和理解代码。对于 任何编程语言,都值得 努力练习来提高您的熟练程度。
下面列举了一些编写文档的指导原则。在 技术写作风格 中你可以了解 技术写作的最佳实践。
推荐 简洁. 要清晰和准确,同时还要简洁。
避免 缩写和首字母缩略词(非常流行的除外)。 大部分人都不知道 “i.e.”、 “e.g.” 和 “et. al.” 的意思。你所在领域的 首字母缩略词对于其他人可能并不了解。
推荐 使用 “this” 而不是 “the” 来引用实例成员。 当提及到类的成员,通常是指被调用的对象实例的成员。 使用 “the” 可能会导致混淆。
class Box { /// The value this wraps. var _value;
/// True if this box contains a value. bool get hasValue => _value != null; }
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。