和其他語言類似,Dart 會忽略空白。但是,人們卻不會這樣。在代碼中加入空格調(diào)整樣式后可以讓人們看到內(nèi)容和編譯器看到的類似。
不要使用 Tab 縮進。
使用空白符來格式化代碼可以保證每個人在編輯器中看到的內(nèi)容是一樣的。這也會和傳送到博客上的樣式一樣,或者是一些代碼站點,比如 Github。
現(xiàn)在的編輯器在縮進的時候可以模擬 tab 鍵來進行縮進,以讓你在編寫代碼的時候更加輕松,并且可以保證代碼的一致性。
你應該避免在編寫代碼時一行的長度超過八十個字符。
可讀性研究表明,過長的文本不適合閱讀,因為當你看到下一行的時候眼睛移動的距離過大。這就是為什么新聞以及雜志的文本都是多行的。
如果你在編碼時希望一行的代碼可以超過八十個字符,那么對于閱讀者而言你的代碼過于冗長并且有點太緊湊了。你真的希望調(diào)用一個名為 AbstractWidgetFactoryManagerBuilder
的函數(shù)嗎?
應該將二元操作符放在多行表達式的前一行。
各種樣式的參數(shù)都是有效的,但是大多數(shù)情況下代碼看起來都是下面這個樣子的,并且這樣更容易保證代碼的一致性。
// good
if (isDeepFried ||
(hasPieCrust && !vegan) ||
containsBacon) {
print('Bob likes it.');
}
注意這也可以直接使用 =>
:
// good
bobLikes() =>
isDeepFried || (hasPieCrust && !vegan) || containsBacon;
// bad
bobLikes()
=> isDeepFried || (hasPieCrust && !vegan) || containsBacon;
應該將三元運算符放在多行表達式的下一行。
同樣的,如果你在操作符之前換行了,那么全部操作符之前都要換行。
// good
return someCondition
? whenTrue
: whenFalse;
// bad
return someCondition ?
whenTrue :
whenFalse;
return someCondition
? whenTrue : whenFalse;
在多行表達式中應該在下一行加入 .
操作符。
這條規(guī)則優(yōu)先級高于上一條。可其他操作符不同,如果你使用 .
來分隔一個表達式,那就應該把它放在第二行的開頭。
// good
someVeryLongVariable.withAVeryLongProperty
.aMethodOnThatObject();
在代碼塊中應該縮進兩格。
// good
if (condition) {
print('hi');
}
如果代碼過長需要換行,那么下一行應該縮進四格。
// good
someLongObject.aReallyLongMethodName(longArg, anotherLongArg,
wrappedToNextLine);
你也可以按照你的喜好來進行縮進:
// good
someLongObject.aReallyLongMethodName(longArg, anotherLongArg,
wrappedToNextLine);
注意使用 =>
也是可以的:
// good
bobLikes() =>
isDeepFried || (hasPieCrust && !vegan) || containsBacon;
// bad
bobLikes() =>
isDeepFried || (hasPieCrust && !vegan) || containsBacon;
如果某一行的上一行是一個函數(shù)表達式,那么該行不應該縮進。
上面這個規(guī)則的一個例外就是函數(shù)表達式嵌套在另一個表達式中,比如是作為參數(shù)傳遞給一個方法。這些應該寫成下面的格式:
// good
new Future.delayed(const Duration(seconds: 1), () {
print('I am a callback');
});
// bad
new Future.delayed(const Duration(seconds: 1), () {
print('I am a callback');
});
花括號({)應該放在它之前那一行的后面。
// good
class Foo {
method() {
if (true) {
// ...
} else {
// ...
}
}
}
對于全部的控制語句,都應該使用括號括起來。
這樣做有助于避免 else 懸掛 的問題。
// good
if (true) {
print('sanity');
} else {
print('opposite day!');
}
// bad
if (true) print('sanity');
else
print('opposite day!');
這種情況有個特例:單個 if
語句,如果沒有相應的 else
語句就可以不實用括號。
// good
if (arg == null) return defaultValue;
switch 語句中的 case 語句應該縮進兩個空格,case 語句的函數(shù)體應該縮進四個空格。
// good
switch (fruit) {
case 'apple':
print('delish');
break;
case 'durian':
print('stinky');
break;
}
在函數(shù)、操作符或者 setter 的名稱與其參數(shù)列表間不要加入空格。
// good
bool convertToBool(arg) { ... }
bool operator ==(other) { ... }
set contents(value) { ... }
// bad
bool convertToBool (arg) { ... }
bool operator == (other) { ... }
set contents (value) { ... }
在 operator
關鍵字之后應該空一格。
// good
bool operator ==(other) => ...;
// bad
bool operator==(other) => ...;
二元、三元運算符的周圍應該空一格,逗號之后也應該空一格,但是在一元運算符周圍不應該留空格。
注意 <
以及 >
用在表達式中時是作為二元操作符的,但是作為泛型的時候則不是。is
以及 !is
只能作為二元運算符。另外,.
用于訪問成員的時候絕對不能插入空格。
// good
a = 1 + 2 / (3 * -b);
c = !condition == a > b;
d = condition ? b : object.method(a, b, c);
if (obj is! SomeType) print('not SomeType');
// bad
a=1+2/(3* - b);
c= ! condition==a>b;
d= condition?b:object.method(a,b,c);
if (obj is !SomeType) print('not SomeType');
在循環(huán)語句中,in
的周圍以及每個 ;
之后都應該空一格。
// good
for (var i = 0; i < 100; i++) {
// ...
}
for (final item in collection) {
// ...
}
流控制的關鍵字之后應該空一格。
這和函數(shù)調(diào)用不同,函數(shù)調(diào)用中函數(shù)名和括號之間不應該有空格。
// good
while (foo) {
// ...
}
try {
// ...
} catch (e) {
// ...
}
在 (
、[
、{
之前,以及 )
、]
、}
之后不應該有空格。
同樣的,如果 <
和 >
用作泛型的話也不應該在其中間留空格。
// good
var numbers = <int>[1, 2, (3 + 4)];
在函數(shù)體內(nèi)的 {
前應該空一格。
上述規(guī)則有一個特殊情況。如果 {
是用在某個函數(shù)的參數(shù)列表之后,那么在 )
和它之間應該空一格。
// good
getEmptyFn(a) {
return () {};
}
// bad
getEmptyFn(a){
return (){};
}
構造函數(shù)中的初始化應該保證每個字段都單獨占一行。
// good
MyClass()
: firstField = "some value",
secondField = "another",
thirdField = "last" {
// ...
}
注意 :
應該放在函數(shù)名稱的下一行開頭,并且應該縮進四格。而字段則應該對齊(也就是說第一個字段總共縮進六格)。
對于已命名的的實參和形參,在 :
之后應該空一格。
// good
class ListBox {
bool showScrollbars;
ListBox({this.showScrollbars: false});
}
main() {
new ListBox(showScrollbars: true);
}
// bad
new ListBox(showScrollbars:true);
new ListBox(showScrollbars : true);
可選位置參數(shù)的 =
周圍應該空一格。
// good
class HttpServer {
static Future<HttpServer> listen([int port = 80]) {
// ...
}
}
// bad
import 'dart:async';
class HttpServer {
static Future<HttpServer> listen([int port=80]) {
// ...
}
}
方法的級聯(lián)應該縮進兩格。
// good
list = new List()
..addAll([1, 2, 3])
..addAll([4, 5, 6]);
// bad
list = new List()
..addAll([1, 2, 3])
..addAll([4, 5, 6]);
以前的時候這條規(guī)則是“縮進四格”,但是根據(jù)我們對于已有代碼的調(diào)查結果來看,級聯(lián)使用兩格縮進更加常見。
多行列表以及映射的字面值的代碼如果采取多行形式,那么應該縮進兩行,并且把閉合的 ]
或者 }
放在下一行。
多行列表以及映射的字面值最好是在逗號之后換行。
]
或者 }
應該根據(jù)上下文代碼來進行縮進,以匹配上下文代碼的格式。
// good
var simpleList = [1, 2, 3];
var simpleMap = {'a': 1, 'b': 2, 'c': 3};
var fooList = [
'a',
'b',
'c'
];
var barMap = {
'a': 'b',
'c': 'd'
};
var listInsideMap = {
'a': ['b', 'c', 'd'],
'e': [
'f',
'g',
'h'
]
};
var mapInsideMap = {
'a': {'b': 'c', 'd': 'e'},
'f': {
'f': 'g',
'h': 'i'
}
};
var mapInsideList = [
{
'a': 'b',
'c': 'd'
},
{
'a': 'b',
'c': 'd'
},
];
// bad
var fooList = [
1,
2,
3
];
var fooList = [
1,
2,
3];
var fooList = [1, 2,
3, 4];
更多建議: