一、命名规范
1、类名,枚举,类型定义,类型参数采用首字母大写的驼峰式命名方式
class SliderMenu { ... }
class HttpRequest { ... }
typedef Predicate<T> = bool Function(T value);2、扩展函数(extension-method)同样采用首字母大写的驼峰式命名
extension MyFancyList<T> on List<T> { ... }
extension SmartIterable<T> on Iterable<T> { ... }3、库名(libraries)、包名(packages)、文件夹(directories)、资源文件(source)、文件名(file)采用小写字母命名,当字母数量大于一个的时候使用下划线分割
library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';4、在使用import as,引用名采用下小写+下划线
import 'dart:math' as math;
import 'package:angular_components/angular_components' as angular_components;
import 'package:js/js.dart' as js;5、变量定义采用首字母小写的驼峰式命名
var item;
HttpRequest httpRequest;
void align(bool clearItems) {
// ...
}6、常量定义采用首字母小写的驼峰式命名
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}7、相关具有特殊意义的命名
good:
HttpConnectionInfo
uiHandler
IOStream
HttpRequest
Id
DB
bad:
HTTPConnection
UiHandler
IoStream
HTTPRequest
ID
Db8、定义变量名不要使用字母作为前缀
good:
defaultTimeout
bad:
kDefaultTimeout二、头文件引入的顺序(import)
1、dart相关的放在最上面
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'util.dart';2、外部引入的包放在最前面
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'package:my_package/util.dart';3、import和export采用空行分割
import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';4、引入按字母排序
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'foo.dart';
import 'foo/foo.dart';三、编码规范
1、字符串操作规范
good:
//字符串拼接使用换行符
print(
'ERROR: Parts of the spaceship are on fire. Other '
'parts are overrun by martians. Unclear which are which.');
//字符串拼接时取值使用$
'Hello, $name! You are ${year - birth} years old.';
bad:
print(
'ERROR: Parts of the spaceship are on fire. Other '+
'parts are overrun by martians. Unclear which are which.');
'Hello, ' + name + '! You are ' + (year - birth).toString() + ' y...';2、集合操作规范(List,Map)
good:
//一般集合定义
var points = [];
var addresses = {};
//指定类型集合的定义
var points = <Point>[];
var addresses = <String, Address>{};
//集合判空(不要通过.legnth来判断集合是否为空)
if (lunchBox.isEmpty) return 'so hungry...';
if (words.isNotEmpty) return words.join(' ');
//避免使用cast来转换集合的类型
List<int> singletonList(int value) {
var list = <int>[];
list.add(value);
return list;
}
bad:
//一般集合定义
var points = List();
var addresses = Map();
//指定类型集合的定义
var points = List<Point>();
var addresses = Map<String, Address>();
//集合判空
if (lunchBox.length == 0) return 'so hungry...';
if (!words.isEmpty) return words.join(' ');
//避免使用cast来转换集合的类型
List<int> singletonList(int value) {
var list = []; // List<dynamic>.
list.add(value);
return list.cast<int>();
}3、类成员变量的定义规范
good:
//不写多余的get,set函数
class Box {
var contents;
}
bad:
class Box {
var _contents;
get contents => _contents;
set contents(value) {
_contents = value;
}
}4、构造函数
good:
class Point {
num x, y;
Point(this.x, this.y);
}
bad:
class Point {
num x, y;
Point(num x, num y) {
this.x = x;
this.y = y;
}
}5、一般函数(function)
//代码逻辑简单,推荐使用=>
double get area => (right - left) * (bottom - top);
bool isReady(num time) => minTime == null || minTime <= time;
String capitalize(String name) =>
'${name[0].toUpperCase()}${name.substring(1)}';6、异常处理
good:
//使用 rethrow 重新抛出异常
try {
somethingRisky();
} catch (e) {
if (!canHandle(e)) rethrow;
handle(e);
}
bad:
try {
somethingRisky();
} catch (e) {
if (!canHandle(e)) throw e;
handle(e);
}