Dart 空白符

2018-09-28 18:39 更新

空白符

和其他語言類似,Dart 會(huì)忽略空白。但是,人們卻不會(huì)這樣。在代碼中加入空格調(diào)整樣式后可以讓人們看到內(nèi)容和編譯器看到的類似。

不要使用 Tab 縮進(jìn)。

使用空白符來格式化代碼可以保證每個(gè)人在編輯器中看到的內(nèi)容是一樣的。這也會(huì)和傳送到博客上的樣式一樣,或者是一些代碼站點(diǎn),比如 Github

現(xiàn)在的編輯器在縮進(jìn)的時(shí)候可以模擬 tab 鍵來進(jìn)行縮進(jìn),以讓你在編寫代碼的時(shí)候更加輕松,并且可以保證代碼的一致性。

你應(yīng)該避免在編寫代碼時(shí)一行的長度超過八十個(gè)字符。

可讀性研究表明,過長的文本不適合閱讀,因?yàn)楫?dāng)你看到下一行的時(shí)候眼睛移動(dòng)的距離過大。這就是為什么新聞以及雜志的文本都是多行的。

如果你在編碼時(shí)希望一行的代碼可以超過八十個(gè)字符,那么對(duì)于閱讀者而言你的代碼過于冗長并且有點(diǎn)太緊湊了。你真的希望調(diào)用一個(gè)名為 AbstractWidgetFactoryManagerBuilder 的函數(shù)嗎?

應(yīng)該將二元操作符放在多行表達(dá)式的前一行。

各種樣式的參數(shù)都是有效的,但是大多數(shù)情況下代碼看起來都是下面這個(gè)樣子的,并且這樣更容易保證代碼的一致性。

// good
if (isDeepFried ||
    (hasPieCrust && !vegan) ||
    containsBacon) {
  print('Bob likes it.');
}

注意這也可以直接使用 =>

// good
bobLikes() =>
    isDeepFried || (hasPieCrust && !vegan) || containsBacon;
// bad
bobLikes()
    => isDeepFried || (hasPieCrust && !vegan) || containsBacon;

應(yīng)該將三元運(yùn)算符放在多行表達(dá)式的下一行。

同樣的,如果你在操作符之前換行了,那么全部操作符之前都要換行。

// good
return someCondition
    ? whenTrue
    : whenFalse;
// bad
return someCondition ?
    whenTrue :
    whenFalse;
return someCondition
    ? whenTrue : whenFalse;

在多行表達(dá)式中應(yīng)該在下一行加入 . 操作符。

這條規(guī)則優(yōu)先級(jí)高于上一條??善渌僮鞣煌绻闶褂?. 來分隔一個(gè)表達(dá)式,那就應(yīng)該把它放在第二行的開頭。

// good
someVeryLongVariable.withAVeryLongProperty
    .aMethodOnThatObject();

在代碼塊中應(yīng)該縮進(jìn)兩格。

// good
if (condition) {
  print('hi');
}

如果代碼過長需要換行,那么下一行應(yīng)該縮進(jìn)四格。

// good
someLongObject.aReallyLongMethodName(longArg, anotherLongArg,
    wrappedToNextLine);

你也可以按照你的喜好來進(jìn)行縮進(jìn):

// good
someLongObject.aReallyLongMethodName(longArg, anotherLongArg,
                                     wrappedToNextLine);

注意使用 => 也是可以的:

// good
bobLikes() =>
    isDeepFried || (hasPieCrust && !vegan) || containsBacon;
// bad 
bobLikes() =>
  isDeepFried || (hasPieCrust && !vegan) || containsBacon;

如果某一行的上一行是一個(gè)函數(shù)表達(dá)式,那么該行不應(yīng)該縮進(jìn)。

上面這個(gè)規(guī)則的一個(gè)例外就是函數(shù)表達(dá)式嵌套在另一個(gè)表達(dá)式中,比如是作為參數(shù)傳遞給一個(gè)方法。這些應(yīng)該寫成下面的格式:

// 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');
    });

花括號(hào)({)應(yīng)該放在它之前那一行的后面。

// good
class Foo {
  method() {
    if (true) {
      // ...
    } else {
      // ...
    }
  }
}

對(duì)于全部的控制語句,都應(yīng)該使用括號(hào)括起來。

這樣做有助于避免 else 懸掛 的問題。

// good
if (true) {
  print('sanity');
} else {
  print('opposite day!');
}
// bad
if (true) print('sanity');
else
  print('opposite day!');

這種情況有個(gè)特例:單個(gè) if 語句,如果沒有相應(yīng)的 else 語句就可以不實(shí)用括號(hào)。

// good
if (arg == null) return defaultValue;

switch 語句中的 case 語句應(yīng)該縮進(jìn)兩個(gè)空格,case 語句的函數(shù)體應(yīng)該縮進(jìn)四個(gè)空格。

// 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 關(guān)鍵字之后應(yīng)該空一格。

// good
bool operator ==(other) => ...;
// bad
bool operator==(other) => ...;

二元、三元運(yùn)算符的周圍應(yīng)該空一格,逗號(hào)之后也應(yīng)該空一格,但是在一元運(yùn)算符周圍不應(yīng)該留空格。

注意 < 以及 > 用在表達(dá)式中時(shí)是作為二元操作符的,但是作為泛型的時(shí)候則不是。is 以及 !is 只能作為二元運(yùn)算符。另外,. 用于訪問成員的時(shí)候絕對(duì)不能插入空格。

// 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 的周圍以及每個(gè) ; 之后都應(yīng)該空一格。

// good
for (var i = 0; i < 100; i++) {
  // ...
}

for (final item in collection) {
  // ...
}

流控制的關(guān)鍵字之后應(yīng)該空一格。

這和函數(shù)調(diào)用不同,函數(shù)調(diào)用中函數(shù)名和括號(hào)之間不應(yīng)該有空格。

// good 
while (foo) {
  // ...
}

try {
  // ...
} catch (e) {
  // ...
}

(、[、{ 之前,以及 )、]} 之后不應(yīng)該有空格。

同樣的,如果 <> 用作泛型的話也不應(yīng)該在其中間留空格。

// good
var numbers = <int>[1, 2, (3 + 4)];

在函數(shù)體內(nèi)的 {應(yīng)該空一格。

上述規(guī)則有一個(gè)特殊情況。如果 { 是用在某個(gè)函數(shù)的參數(shù)列表之后,那么在 ) 和它之間應(yīng)該空一格。

// good
getEmptyFn(a) {
  return () {};
}
// bad
getEmptyFn(a){
  return (){};
}

構(gòu)造函數(shù)中的初始化應(yīng)該保證每個(gè)字段都單獨(dú)占一行。

// good
MyClass()
    : firstField = "some value",
      secondField = "another",
      thirdField = "last" {
  // ...
}

注意 : 應(yīng)該放在函數(shù)名稱的下一行開頭,并且應(yīng)該縮進(jìn)四格。而字段則應(yīng)該對(duì)齊(也就是說第一個(gè)字段總共縮進(jìn)六格)。

對(duì)于已命名的的實(shí)參和形參,在 : 之后應(yīng)該空一格。

// good
class ListBox {
  bool showScrollbars;

  ListBox({this.showScrollbars: false});
}

main() {
  new ListBox(showScrollbars: true);
}
// bad
new ListBox(showScrollbars:true);
new ListBox(showScrollbars : true);

可選位置參數(shù)的 = 周圍應(yīng)該空一格。

// good
class HttpServer {
  static Future<HttpServer> listen([int port = 80]) {
    // ...
  }
}
// bad
import 'dart:async';

class HttpServer {
  static Future<HttpServer> listen([int port=80]) {
    // ...
  }
}

方法的級(jí)聯(lián)應(yīng)該縮進(jì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]);

以前的時(shí)候這條規(guī)則是“縮進(jìn)四格”,但是根據(jù)我們對(duì)于已有代碼的調(diào)查結(jié)果來看,級(jí)聯(lián)使用兩格縮進(jìn)更加常見。

多行列表以及映射的字面值的代碼如果采取多行形式,那么應(yīng)該縮進(jìn)兩行,并且把閉合的 ] 或者 } 放在下一行。

多行列表以及映射的字面值最好是在逗號(hào)之后換行。

] 或者 } 應(yīng)該根據(jù)上下文代碼來進(jìn)行縮進(jìn),以匹配上下文代碼的格式。

// 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];
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)