如何閱讀指南
-
DO
應始終遵循的準則 -
DON'T
不應該這么使用的準則 -
PREFER
應該遵循的準則,但是在某些情況下帖世,可以根據(jù)個人理解忽略,不遵循 -
DON'T
不應該這么使用的準則 -
AVOID
不應該遵循的準則沸枯,但是在某些情況下狮暑,可以根據(jù)個人理解忽略,不遵循 -
CONSIDER
可遵循或者不遵循的規(guī)則辉饱,取決于個人偏好
標識符
主要有三種風格:
-
UpperCamelCase
每個單詞的首字母大寫 -
lowerCamelCase
首字母小寫,其余每個單詞的首字母大寫 -
lowercase_with_underscores
單詞全部使用小寫拣展,使用用_
分隔
DO 命名類型使用 UpperCamelCase 風格
Classes
(類), enums
(枚舉), typedef
, and type parameters
(類型參數(shù))應該大寫每個單詞的第一個字母(包括第一個單詞)彭沼,并且不使用分隔符。
Linter規(guī)則:camel_case_type
class SliderMenu { ... }
class HttpRequest { ... }
typedef Predicate<T> = bool Function(T value);
這甚至包括打算在元數(shù)據(jù)注釋中使用的類备埃。(關于元數(shù)據(jù):使用元數(shù)據(jù)來給你的代碼提供附加信息姓惑,以 @
字符開頭,后面跟一個編譯時的常量引用(例如 deprecated)或者調(diào)用常量構造器的語句按脚。)
class Foo {
const Foo([arg]);
}
@Foo(anArg)
class A { ... }
@Foo()
class B { ... }
如果注釋類的構造函數(shù)不帶參數(shù)于毙,則可能使用 lowerCamelCase 風格。
const foo = Foo();
@foo
class C { ... }
DO 命名libraries(庫), packages(包), directories(目錄), source files(源文件)使用 lowercase_with_underscores 風格
Linter規(guī)則:library_names辅搬, file_names
library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';
DO 命名導入文件的名稱前綴使用 lowercase_with_underscores 風格
Linter規(guī)則:library_prefixes
import 'dart:math' as math;
import 'package:angular_components/angular_components'
as angular_components;
import 'package:js/js.dart' as js;
DO 命名其他標識符使用 lowerCamelCase 風格
Linter規(guī)則:non_constant_identifier_names
類成員
唯沮, 頂級定義
脖旱, 變量
, 參數(shù)
和命名參數(shù)
應該大寫除第一個單詞之外的每個單詞的第一個字母介蛉,并且不使用分隔符萌庆。
var item;
HttpRequest httpRequest;
void align(bool clearItems) {
// ...
}
PREFER 命名常量使用 lowerCamelCase 風格
Linter規(guī)則:constant_identifier_names
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}
// 您可以使用`SCREAMING_CAPS`來保持與現(xiàn)有代碼的一致性,如下所示:
// 1. 向已經(jīng)使用 `SCREAMING_CAPS` 的文件或庫添加代碼時币旧。
// 2. 當生成與Java代碼并行的Dart代碼時践险。如,在由protobufs生成的枚舉類型中吹菱。
const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');
class Dice {
static final NUMBER_GENERATOR = Random();
}
DO 首字母縮寫詞和縮寫詞的首字母大寫巍虫,長度不要超過兩個字母。
大寫的首字母縮寫詞很難讀懂鳍刷,多個相鄰的首字母縮寫詞會導致名稱含糊不清占遥。例如,給定一個以HTTPSFTP 開頭的名稱倾剿,無法判斷它是引用HTTPSFTP還是HTTPSFTP筷频。
為了避免這種情況,縮略語和縮寫詞都像普通單詞一樣大寫前痘,只有兩個字母
的縮略語除外凛捏。(ID和Mr這樣的兩個字母縮寫仍然像單詞一樣大寫。)
// Good
HttpConnectionInfo
uiHandler
IOStream
HttpRequest
Id
DB
// Bad
HTTPConnection
UiHandler
IoStream
HTTPRequest
ID
Db
DON’T 使用前綴字母
// Good
defaultTimeout
// Bad
kDefaultTimeout
排序
所有排序準則:directives_ordering
DO “dart:”引入放在最開始的地方
import 'dart:async';
import 'dart:html';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
DO 在相對路徑的引入之前 放置“package:”
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'util.dart';
PREFER 在導入自己的包之前 放置“package:”
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'package:my_package/util.dart';
DO 導出放在所有的導入之后
// Good
import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';
// Bad
import 'src/error.dart';
export 'src/error.dart';
import 'src/foo_bar.dart';
DO 按字母順序排序
// Good
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'foo.dart';
import 'foo/foo.dart';
// Bad
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';
import 'foo/foo.dart';
import 'foo.dart';
格式化
DO 使用格式化代碼 dartfmt
格式化是一項繁瑣的工作芹缔,在重構過程中特別耗時坯癣。幸運的是,你不必擔心它最欠。我們提供了一個名為 dartfmt的自動代碼格式化程序示罗,它可 以為您完成代碼格式化。我們有一些關于它適用的規(guī)則的文檔芝硬,但是Dart的官方空白處理規(guī)則是dartfmt產(chǎn)生的蚜点。
其余的格式指南適用于dartfmt無法為您修復的一些內(nèi)容。
CONSIDER 更改代碼以使其更易于格式化
格式化程序可以使用你拋出的任何代碼盡力而為拌阴,但它無法創(chuàng)造奇跡绍绘。如果您的代碼具有特別長的標識符,深層嵌套的表達式迟赃,不同類型的運算符的混合等陪拘,格式化的輸出可能仍然難以閱讀。
發(fā)生這種情況時纤壁,請重新組織或簡化代碼左刽。考慮縮短局部變量名稱或?qū)⒈磉_式提升到新的局部變量中酌媒。換句話說欠痴,如果您手動格式化代碼并嘗試使其更具可讀性迄靠,請進行相同類型的修改。將dartfmt視為一種合作伙伴關系斋否,您可以協(xié)同工作梨水,有時可以迭代地生成漂亮的代碼。
AVOID 避免行超過80個字符
盡量不要連續(xù)使用超過80個字符
DO 對所有流控制結(jié)構使用花括號
Linter規(guī)則:curly_braces_in_flow_control_structures
// Good
if (isWeekDay) {
print('Bike to work!');
} else {
print('Go dancing or read a book!');
}
if (arg == null) return defaultValue;
if (overflowChars != other.overflowChars) {
return overflowChars < other.overflowChars;
}
// Bad
if (overflowChars != other.overflowChars)
return overflowChars < other.overflowChars;