Dart 规范

以下内容来自 Dart 官方规范

良好的代码风格是优秀代码中一个非常重要的部分。一致的命名、排序和格式有助于使相同的代码看起来相同。它利用了我们大多数人的视觉系统中拥有的强大模式匹配硬件。如果我们在整个 Dart 生态系统中使用一致的风格,那么我们所有人都可以更轻松地学习和贡献彼此的代码。

身份标识

Dart 中的标识符有三种形式。

  • 类名称将每个单词的首字母大写,包括第一个。(大驼峰)
  • lowerCamelCase名称将每个单词的首字母大写,但第一个单词除外,即使是首字母缩略词,第一个单词也始终小写。
  • lowercase_with_underscores名称仅使用小写字母,即使是首字母缩略词也是如此,并且使用 分隔单词_。

类、枚举类型、typedef 和类型参数

每个单词的首字母大写(包括第一个单词),并且不使用分隔符。

✅ 正确写法
class SliderMenu { ... }

class HttpRequest { ... }

定义函数指针类型
typedef Predicate<T> = bool Function(T value);

甚至包括旨在用于元数据注释的类。

✅ 正确写法
class Foo {
  const Foo([Object? arg]);
}

@Foo(anArg)
class A { ... }

@Foo()
class B { ... }

如果注释类的构造函数不采用任何参数,您可能需要lowerCamelCase为其创建一个单独的常量。

✅ 推荐写法
const foo = Foo();

@foo
class C { ... }

使用 DO 名称扩展 UpperCamelCase
与类型一样,扩展名应该将每个单词的首字母大写(包括第一个单词),并且不使用分隔符。

✅ 正确写法
extension MyFancyList<T> on List<T> { ... }

extension SmartIterable<T> on Iterable<T> { ... }

包、目录、源文件

请使用以下方式命名命名包、目录、源文件 lowercase_with_underscores
有些文件系统不区分大小写,因此许多项目要求文件名全部为小写。使用分隔符可使名称在该格式下仍可读。使用下划线作为分隔符可确保名称仍然是有效的 Dart 标识符,如果该语言以后支持符号导入,这可能会有所帮助。

✅ 正确写法
my_package
└─ lib
   └─ file_system.dart
   └─ slider_menu.dart
❌ 错误写法
mypackage
└─ lib
   └─ file-system.dart
   └─ SliderMenu.dart

导入前缀

使用以下方式命名导入前缀

✅ 正确写法
import 'dart:math' as math;
import 'package:angular_components/angular_components.dart' as angular_components;
import 'package:js/js.dart' as js;
❌ 错误写法
import 'dart:math' as Math;
import 'package:angular_components/angular_components.dart' as angularComponents;
import 'package:js/js.dart' as JS;

类成员、顶级定义、变量、参数、命名参数

应将除第一个单词之外的每个单词的首字母大写,并且不使用分隔符。

✅ 正确写法
var count = 3;

HttpRequest httpRequest;

void align(bool clearItems) {
  // ...
}

常量命名

在新代码中,用于 lowerCamelCase 常量变量,包括枚举值。
推荐使用lowerCamelCase用于常量命名

✅ 正确写法
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');

class Dice {
  static final numberGenerator = Random();
}
❌ 错误写法
const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');

class Dice {
  static final NUMBER_GENERATOR = Random();
}

您可以使用SCREAMING_CAPS它来与现有代码保持一致,如以下情况:

笔记
我们最初使用 Java 的SCREAMING_CAPS常量样式。我们出于以下几个原因进行了更改:

  • SCREAMING_CAPS在很多情况下看起来很糟糕,特别是 CSS 颜色之类的枚举值。
  • 常量通常会更改为最终非常量变量,这需要更改名称。
  • values枚举类型上定义的属性是 const 和小写。

超过两个字母的首字母缩略词和缩写大写,例如单词

大写的首字母缩略词可能难以阅读,而多个相邻的首字母缩略词可能会导致名称含糊不清。例如,给定一个标识符HTTPSFTP,读者无法判断它是指HTTPS FTP还是。为了避免这种情况,请像普通单词一样将大多数首字母缩略词和缩写大写。如果是指前者或后者,HTTP SFTP则此标识符将是。HttpsFtp``HttpSftp

双字母缩写和首字母缩略词是例外。如果两个字母在英语中都是大写,那么在标识符中使用时它们都应保持大写。否则,将其像单词一样大写。

✅ 正确写法
// Longer than two letters, so always like a word:
Http // "hypertext transfer protocol"
Nasa // "national aeronautics and space administration"
Uri // "uniform resource locator"
Esq // "esquire"
Ave // "avenue"

// Two letters, capitalized in English, so capitalized in an identifier:
ID // "identifier"
TV // "television"
UI // "user interface"

// Two letters, not capitalized in English, so like a word in an identifier:
Mr // "mister"
St // "street"
Rd // "road"
❌ 错误写法
HTTP // "hypertext transfer protocol"
NASA // "national aeronautics and space administration"
URI // "uniform resource locator"
esq // "esquire"
Ave // "avenue"

Id // "identifier"
Tv // "television"
Ui // "user interface"

MR // "mister"
ST // "street"
RD // "road"
当任何形式的缩写出现在 lowerCamelCase 标识符的开头时,将标识符改为小写:
var httpConnection = connect();
var tvSet = Television();
var mrRogers = 'hello, neighbor';
优先使用_等来表示未使用的回调参数

有时回调函数的类型签名需要一个参数,但回调实现不使用该参数。在这种情况下,将未使用的参数命名为 是惯用的做法。如果函数有多个未使用的参数,请使用额外的下划线以避免名称冲突:__等。

✅ 正确写法
futureOfVoid.then((_) {
  print('Operation complete.');
});

本指南仅适用于匿名函数和本地函数。这些函数通常在上下文中立即使用,其中未使用的参数代表什么很清楚。相比之下,顶级函数和方法声明没有这样的上下文,因此必须命名它们的参数,以便清楚地知道每个参数的用途,即使不使用。

不要对非私有标识符使用前导下划线

Dart 在标识符中使用前导下划线来标记成员和顶级声明为私有。这训练用户将前导下划线与其中一种声明联系起来。他们看到“_”就会认为是“私有的”。

局部变量、参数、局部函数或库前缀没有“私有”的概念。当其中一个名称以下划线开头时,它会向读者发出令人困惑的信号。为避免这种情况,请不要在这些名称中使用前导下划线。

不要使用前缀字母

匈牙利表示法和其他方案诞生于 BCPL 时代,当时编译器无法帮助您理解代码。由于 Dart 可以告诉您声明的类型、范围、可变性和其他属性,因此没有必要将这些属性编码到标识符名称中。

✅ 正确写法
defaultTimeout
❌ 错误写法
kDefaultTimeout

不要明确命名库

从技术上来说,在指令中添加名称library是可行的,但是它是一个遗留功能,不建议这么做。

Dart 根据每个库的路径和文件名为其生成一个唯一的标签。命名库会覆盖此生成的 URI。如果没有 URI,工具可能更难找到相关的主库文件。

✅ 正确写法
/// A really great test library.
@TestOn('browser')
library;
❌ 错误写法
library my_library;

订购

为了保持文件序言的整洁,我们规定了指令出现的顺序。每个“部分”应该用空行分隔。

单个 linter 规则处理所有排序指南:directives_ordering。

应将dart:导入的内容放在其他导入内容之前

✅ 正确写法
import 'dart:async';
import 'dart:html';

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

要将package:导入放在相对导入之前

✅ 正确写法
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'util.dart';

在所有导入之后,在单独的部分中指定导出

✅ 正确写法
import 'src/error.dart';
import 'src/foo_bar.dart';

export 'src/error.dart';
❌ 错误写法
import 'src/error.dart';
export 'src/error.dart';
import 'src/foo_bar.dart';

请按字母顺序对部分进行排序

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'foo.dart';
import 'foo/foo.dart';
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';

import 'foo/foo.dart';
import 'foo.dart';

对所有流程控制语句使用花括号

这样做可以避免悬垂 else问题。

✅ 正确写法
if (isWeekDay) {
  print('Bike to work!');
} else {
  print('Go dancing or read a book!');
}

例外:一个if语句没有else子句,其中整个if语句和then主体都适合一行。
在这种情况下,如果你喜欢的话,你可以去掉大括号。

if (arg == null) return defaultValue;

但是,如果流程体超出了一行需要分划请使用大括号:

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

推荐阅读更多精彩内容

  • 命名 1.1 库名、文件名使用小写加下划线来命名❌ library prometheumTools ❌...
    张_何阅读 830评论 0 2
  • 标识符 在 Dart 中标识符有三种风格: 大写驼峰:每个单词的第一个字母大写,包括第一个单词。 小写驼峰:每个单...
    soojade阅读 1,917评论 0 3
  • 编码风格默认规范 UpperCamelCase 每个单词的首字母都大写,包含第一个单词。 lowerCamelCa...
    zcwfeng阅读 575评论 1 3
  • 标识符 UpperCamelCase 每个单词的首字母都大写,包含第一个单词。 Classes(类名)、 enum...
    初见soulmate阅读 329评论 0 0
  • Dart 语法简介 Flutter是使用Dart语言开发的。Dart语言是基于类的纯面向对象语言。Dart 中的所...
    Cheney2006阅读 580评论 0 1