前言
好的編碼風(fēng)格非常重要念搬,保持一致的命名能夠讓代碼閱讀體驗(yàn)更好抑堡,能夠讓團(tuán)隊(duì)協(xié)作的效率更高。本篇介紹一下官方推薦的命名規(guī)范朗徊。
標(biāo)識符定義
- 大寫駝峰首妖,例如UpperCamelCase,每個(gè)單詞的首字母大寫爷恳。
- 小寫駝峰悯搔,例如 lowerCamelCase,第一個(gè)單詞全部小寫舌仍,之后每個(gè)單詞的首字母大寫妒貌。
- 使用下劃線“_”拼接全部小寫單詞,例如 lowercase_with_underscores铸豁。
命名規(guī)則1:統(tǒng)一使用大寫駝峰命名類型
例如類灌曙、枚舉、別名(typedefs)等使用大寫駝峰节芥,并且不使用分隔符在刺。下面是示例:
class SliderMenu { ... }
class HttpRequest { ... }
typedef Predicate<T> = bool Function(T value);
包括攜帶參數(shù)注解也應(yīng)該遵循這樣的原則:
class Foo {
const Foo([Object? arg]);
}
@Foo(anArg)
class A { ... }
@Foo()
class B { ... }
如果注解沒有攜帶參數(shù)逆害,那么可以使用小寫駝峰的方式。
const foo = Foo();
@foo
class C { ... }
命名規(guī)則2:類擴(kuò)展使用大寫駝峰
和類型一樣蚣驼,類擴(kuò)展定義也應(yīng)該使用大寫駝峰:
extension MyFancyList<T> on List<T> { ... }
extension SmartIterable<T> on Iterable<T> { ... }
命名規(guī)則3:庫魄幕、包名、目錄和源文件應(yīng)當(dāng)使用下劃線“_”拼接小寫單詞
由于某些文件系統(tǒng)不區(qū)分大小寫颖杏,而有的系統(tǒng)是區(qū)分的纯陨。因此很多項(xiàng)目要求文件名全部小寫。這種情況下使用分隔符可讀性會更高留储。下面是示例對比:
// 正確示例
library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';
// 錯(cuò)誤示例
library pegparser.SourceScanner;
import 'file-system.dart';
import 'SliderMenu.dart';
命名規(guī)則4:import 的別名使用下劃線“_”拼接小寫單詞
當(dāng)你要對引入的包或插件重命名時(shí)翼抠,應(yīng)當(dāng)使用下劃線“_”拼接小寫單詞的形式。
// 正確示例
import 'dart:math' as math;
import 'package:angular_components/angular_components'
as angular_components;
import 'package:js/js.dart' as js;
// 錯(cuò)誤示例
import 'dart:math' as Math;
import 'package:angular_components/angular_components'
as angularComponents;
import 'package:js/js.dart' as JS;
命名規(guī)則5:變量名获讳、類成員屬性阴颖、參數(shù)和常量使用小寫駝峰
類的成員屬性、變量丐膝、函數(shù)參數(shù)量愧、頂級定義參數(shù)和命名參數(shù)都應(yīng)該使用小寫駝峰方式。
// 正確示例
var count = 3;
HttpRequest httpRequest;
void align(bool clearItems) {
// ...
}
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}
// 錯(cuò)誤示例
const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');
class Dice {
static final NUMBER_GENERATOR = Random();
}
這里需要注意帅矗,很多語言都推薦常量使用下劃線+全部大寫字母的方式定義侠畔,但是 Dart 推薦的是小寫駝峰形式。這是因?yàn)榇蠖鄶?shù)情況下全部大寫的可讀性差损晤,尤其是對于像 CSS 顏色那樣的枚舉值软棺;常量有可能會更改為普通變量,這樣可能增加名稱修改尤勋。
命名規(guī)則6:縮寫命名規(guī)則
對于縮寫單詞喘落,如果字符多的時(shí)候全部大寫會很奇怪,例如 HTTPSFTP 這樣看起來顯然沒有 HttpsFtp 的可讀性好最冰。但是對于那種兩個(gè)字母的縮寫瘦棋,推薦根據(jù)可讀性決定是否要全部大寫還是大寫駝峰,比如 IO這類通用的可以寫成 IO暖哨,而ID 的話寫成 Id 可讀性也不差赌朋。下面是一個(gè)對比示例。
// 正確示例
class HttpConnection {}
class DBIOPort {}
class TVVcr {}
class MrRogers {}
var httpRequest = ...
var uiHandler = ...
Id id;
// 錯(cuò)誤示例
class HTTPConnection {}
class DbIoPort {}
class TvVcr {}
class MRRogers {}
var hTTPRequest = ...
var uIHandler = ...
ID iD;
命名規(guī)則7:參數(shù)列表中未使用的參數(shù)使用篇裁,_標(biāo)識
有些回調(diào)方法只使用部分參數(shù)沛慢,這個(gè)時(shí)候可以將未使用的參數(shù)使用下劃線替換,明確表示這個(gè)參數(shù)不會使用达布。而如果有多個(gè)參數(shù)沒被使用的話团甲,可以依次使用多個(gè)下劃線標(biāo)識。下面是一個(gè)例子:
futureOfVoid.then((_) {
print('Operation complete.');
});
這個(gè)指導(dǎo)原則只適用于匿名方法或局部方法黍聂。而對于聲明式函數(shù)不應(yīng)該這么做躺苦,即便是不使用也需要有正確命名身腻,以保持參數(shù)語義明確。
命名規(guī)則8:僅對私有類成員屬性使用下劃線標(biāo)識匹厘。
Dart 使用下劃線開頭標(biāo)識類成員為私有屬性嘀趟,頂級定義的變量是文件局部變量。因此僅對這類使用下劃線標(biāo)識愈诚。同時(shí)她按,對于局部變量、參數(shù)和局部方法這些并沒有私有成員的概念扰路,因此沒必要使用下劃線開頭尤溜,避免引起誤解倔叼。
命名規(guī)則9:不要使用前綴字母
有些編程語言會建議使用一些特殊的字母標(biāo)識變量汗唱,例如數(shù)值類的使用 k 開頭。這種約定一方面挺難持續(xù)遵循丈攒,而且對可讀性的幫助也不大哩罪。下面是對應(yīng)的示例:
// 正確示例
defaultTimeout
// 錯(cuò)誤示例
kDefaultTimeout
總結(jié)
擁有良好且一致的命名風(fēng)格能夠讓你的代碼看起來更加舒服,愉悅巡验。其實(shí)也是個(gè)人軟實(shí)力的一個(gè)特征际插。記住一條,代碼是寫給人看的显设!