Dart语言学习 - 35 - 代码分格 effective style
本节目标
环境
使用 UpperCamelCase 风格来命名类型名称
1 2 3 4 5
| class SliderMenu { ... }
class HttpRequest { ... }
typedef bool Predicate<T>(T value);
|
使用 lowercase_with_underscores 风格来命名库和文件名名字
1 2 3 4
| library peg_parser.source_scanner;
import 'file_system.dart'; import 'slider_menu.dart';
|
使用 lowercase_with_underscores 风格命名导入的前缀
1 2 3 4
| import 'dart:json' as json; import 'dart:math' as math; import 'package:javascript_utils/javascript_utils.dart' as js_utils; import 'package:js/js.dart' as js;
|
使用 lowerCamelCase 风格来命名其他的标识符
1 2 3 4 5 6 7
| var item;
HttpRequest httpRequest;
align(clearItems) { }
|
使用 lowerCamelCase 来命名常量
1 2 3 4 5 6 7
| const pi = 3.14; const defaultTimeout = 1000; final urlScheme = new RegExp('^([a-z]+):');
class Dice { static final numberGenerator = new Random(); }
|
把 “dart:” 导入语句放到其他导入语句之前
1 2 3 4 5
| import 'dart:async'; import 'dart:html';
import 'package:bar/bar.dart'; import 'package:foo/foo.dart';
|
把 “package:” 导入语句放到相对导入语句之前
1 2 3 4
| import 'package:bar/bar.dart'; import 'package:foo/foo.dart';
import 'a.dart';
|
把”第三方” “package:” 导入语句放到其他语句之前。
1 2 3 4 5
| import 'package:bar/bar.dart'; import 'package:foo/foo.dart';
import 'package:myapp/io.dart'; import 'package:myapp/util.dart';
|
把导出(export)语句放到所有导入语句之后的部分
1 2 3 4
| import 'src/error.dart'; import 'src/string_source.dart';
export 'src/error.dart';
|
按照字母顺序来排序每个部分中的语句
1 2 3 4 5
| import 'package:bar/bar.dart'; import 'package:foo/bar.dart';
import 'a.dart'; import 'a/b.dart';
|
在所有的控制结构上使用大括号
1 2 3 4 5
| if (true) { print('sanity'); } else { print('opposite day!'); }
|
当只有 if 语句没有 else 语句并且 所有语句可以放到一行的时候,可以省略大括号
1
| if (arg == null) return defaultValue;
|
通常用于当条件满足的时候就跳出 if 或者 返回的情况。 但是对于其他表达式,如果可以放到一行中, 也可以这样使用
1
| if (parameter == null) parameter = defaultValue;
|
在每个语句或者声明后面添加一个空行
1 2 3 4 5 6
| main() { first(statement); second(statement); }
anotherDeclaration() { ... }
|
在关键字 operator 后面添加一个空格
1
| bool operator ==(other) => ...;
|
在二元和三元操作符之间添加空格
1 2 3 4
| average = (a + b) / 2; largest = a > b ? a : b; if (obj is! SomeType) print('not SomeType'); optional([parameter = defaultValue]) { ... }
|
不要 在一元操作符前后添加空格
把开始的大括号 ({) 放到同一行上
1 2 3 4 5 6 7 8 9
| class Foo { method() { if (true) { } else { } } }
|
在函数和方法体的 { 之前添加一个空格
1 2 3
| getEmptyFn(a) { return () {}; }
|
把三元操作符放到多个表达式的下一行开始位置
1 2 3
| return someCondition ? whenTrue : whenFalse;
|
把 . 放到下一行开头当表达式换行的时候
1 2
| someVeryLongVariable.withAVeryLongProperty .aMethodOnThatObject();
|
把构造函数初始化列表中的每个参数和值都放到同一行
1 2 3 4 5 6
| MyClass() : firstField = 'some value', secondField = 'another', thirdField = 'last' { }
|
当无法在一行写完集合的时候,把每个元素都用集合定义的方式来表达
1 2 3 4 5 6 7 8 9 10
| mapInsideList([ { 'a': 'b', 'c': 'd' }, { 'a': 'b', 'c': 'd' }, ]);
|
用两个空格来缩进代码块和集合体
1 2 3 4 5 6 7 8 9
| if (condition) { print('hi');
[ long, list, literal ]; }
|
缩进 switch case 两个空格, case 体四个空格
1 2 3 4 5 6 7 8 9
| switch (fruit) { case 'apple': print('delish'); break;
case 'durian': print('stinky'); break; }
|
只少使用两个空格来缩进多行函数级联调用
1 2 3 4
| buffer ..write('Hello, ') ..write(name) ..write('!');
|
使用四个空格来缩进同一行的换行
1 2 3 4 5
| someLongObject.aReallyLongMethodName(longArg, anotherLongArg, wrappedToNextLine);
bobLikes() => isDeepFried || (hasPieCrust && !vegan) || containsBacon;
|
当表达式包含多行函数或者 集合声明定义的时候除外
1 2 3 4 5 6 7 8 9
| new Future.delayed(const Duration(seconds: 1), () { print('I am a callback'); });
args.addAll([ '--mode', 'release', '--checked' ]);
|
参考
© 猫哥
https://ducafecat.tech
邮箱 ducafecat@gmail.com / 微信 ducafecat / 留言板 disqus