高效編寫Dart--樣式指南

如何閱讀指南

  • DO 應(yīng)始終遵循的準(zhǔn)則
  • DON'T 不應(yīng)該這么使用的準(zhǔn)則
  • PREFER 應(yīng)該遵循的準(zhǔn)則,但是在某些情況下,可以根據(jù)個人理解忽略,不遵循
  • DON'T 不應(yīng)該這么使用的準(zhǔn)則
  • AVOID 不應(yīng)該遵循的準(zhǔn)則,但是在某些情況下,可以根據(jù)個人理解忽略,不遵循
  • CONSIDER 可遵循或者不遵循的規(guī)則,取決于個人偏好

標(biāo)識符

主要有三種風(fēng)格:

  • UpperCamelCase 每個單詞的首字母大寫
  • lowerCamelCase 首字母小寫,其余每個單詞的首字母大寫
  • lowercase_with_underscores 單詞全部使用小寫,使用用_ 分隔

DO 命名類型使用 UpperCamelCase 風(fēng)格

Classes(類), enums(枚舉), typedef, and type parameters(類型參數(shù))應(yīng)該大寫每個單詞的第一個字母(包括第一個單詞),并且不使用分隔符。
Linter規(guī)則:camel_case_type

class SliderMenu { ... }

class HttpRequest { ... }

typedef Predicate<T> = bool Function(T value);  

這甚至包括打算在元數(shù)據(jù)注釋中使用的類。(關(guān)于元數(shù)據(jù):使用元數(shù)據(jù)來給你的代碼提供附加信息,以 @ 字符開頭,后面跟一個編譯時的常量引用(例如 deprecated)或者調(diào)用常量構(gòu)造器的語句。)

class Foo {
  const Foo([arg]);
}

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

@Foo()
class B { ... }

如果注釋類的構(gòu)造函數(shù)不帶參數(shù),則可能使用 lowerCamelCase 風(fēng)格。

const foo = Foo();

@foo
class C { ... }

DO 命名libraries(庫), packages(包), directories(目錄), source files(源文件)使用 lowercase_with_underscores 風(fēng)格

Linter規(guī)則:library_names, file_names

library peg_parser.source_scanner;

import 'file_system.dart';
import 'slider_menu.dart';

DO 命名導(dǎo)入文件的名稱前綴使用 lowercase_with_underscores 風(fēng)格

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 命名其他標(biāo)識符使用 lowerCamelCase 風(fēng)格

Linter規(guī)則:non_constant_identifier_names
類成員, 頂級定義, 變量參數(shù)命名參數(shù)應(yīng)該大寫除第一個單詞之外的每個單詞的第一個字母,并且不使用分隔符。

var item;

HttpRequest httpRequest;

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

PREFER 命名常量使用 lowerCamelCase 風(fēng)格

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. 當(dāng)生成與Java代碼并行的Dart代碼時。如,在由protobufs生成的枚舉類型中。
const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');

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

DO 首字母縮寫詞和縮寫詞的首字母大寫,長度不要超過兩個字母。

大寫的首字母縮寫詞很難讀懂,多個相鄰的首字母縮寫詞會導(dǎo)致名稱含糊不清。例如,給定一個以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

排序

所有排序準(zhǔn)則: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 在導(dǎo)入自己的包之前 放置“package:”

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

import 'package:my_package/util.dart';

DO 導(dǎo)出放在所有的導(dǎo)入之后

// 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

格式化是一項繁瑣的工作,在重構(gòu)過程中特別耗時。幸運(yùn)的是,你不必?fù)?dān)心它。我們提供了一個名為 dartfmt的自動代碼格式化程序,它可 以為您完成代碼格式化。我們有一些關(guān)于它適用的規(guī)則的文檔,但是Dart的官方空白處理規(guī)則是dartfmt產(chǎn)生的。

其余的格式指南適用于dartfmt無法為您修復(fù)的一些內(nèi)容。

CONSIDER 更改代碼以使其更易于格式化

格式化程序可以使用你拋出的任何代碼盡力而為,但它無法創(chuàng)造奇跡。如果您的代碼具有特別長的標(biāo)識符,深層嵌套的表達(dá)式,不同類型的運(yùn)算符的混合等,格式化的輸出可能仍然難以閱讀。

發(fā)生這種情況時,請重新組織或簡化代碼。考慮縮短局部變量名稱或?qū)⒈磉_(dá)式提升到新的局部變量中。換句話說,如果您手動格式化代碼并嘗試使其更具可讀性,請進(jìn)行相同類型的修改。將dartfmt視為一種合作伙伴關(guān)系,您可以協(xié)同工作,有時可以迭代地生成漂亮的代碼。

AVOID 避免行超過80個字符

盡量不要連續(xù)使用超過80個字符

DO 對所有流控制結(jié)構(gòu)使用花括號

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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 更新時間:2016/5/13 介紹 本文檔所提供的編碼規(guī)范,適用于主要的Python發(fā)行版中組成標(biāo)準(zhǔn)庫的Pytho...
    超net閱讀 5,987評論 0 15
  • 原文 原文下載之后的格式略有點(diǎn)不友好,利用簡述的markdown,編輯一下.版權(quán)歸原作者 PEP Index > ...
    大飛哥閱讀 2,612評論 0 0
  • 如何閱讀指南 DO 應(yīng)始終遵循的準(zhǔn)則 DON'T 不應(yīng)該這么使用的準(zhǔn)則 PREFER 應(yīng)該遵循的準(zhǔn)則,但是在某些情...
    _白羊閱讀 1,731評論 2 1
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,701評論 0 5
  • 如何閱讀指南 DO 應(yīng)始終遵循的準(zhǔn)則 DON'T 不應(yīng)該這么使用的準(zhǔn)則 PREFER 應(yīng)該遵循的準(zhǔn)則,但是在某些情...
    _白羊閱讀 3,213評論 0 3

友情鏈接更多精彩內(nèi)容