前言
我们之前介绍了 Dart 的命名规范,本篇来介绍 Dart 的代码次序和格式化规范。开篇还是重复那句话:代码是写给人看的。
import 导入次序
导入次序本身并不会影响代码的执行,但是整齐的导入会让你的代码看起来更加舒适,也会让人感觉你的代码更有条理。官方对于导入的顺序建议如下图所示。
导入次序.png而对于同级别的,建议是按字母次序排序(这个有点难😂)。下面是示例:
// 正确示例
import 'dart:async';
import 'dart:html';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import '../components/buttons.dart';
import '../utils/http.dart';
// 错误示例 (未按字母排序)
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';
import 'foo/foo.dart';
import 'foo.dart';
export 应当排在所有 import 之后,并在二者之间空一行
这个好理解,导出应当放在导入之后,而且为了区别,在之间空一行,下面是示例:
// 正确示例
import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';
// 错误示例
import 'src/error.dart';
export 'src/error.dart';
import 'src/foo_bar.dart';
使用 dart format 工具格式化代码
Dart 提供了 dart format 工具来格式化代码。简单的命令如下,详细可以查看官方文档:dart-format。
# 格式化当前文件夹文件
dart format .
# 使用空格分隔格式化多个目录或文件
dart format lib bin/updater.dart
当然,对于 VSCode 而言,推荐使用 Prettier - Code Formatter
这个插件,保存后会自动格式化。
单行代码不要超过80个字符
这个是大多数编程语言的要求,屏幕大的可能没太大感知,但是屏幕小的时候代码阅读体验及其糟糕。对于 Flutter,使用了 Prettier 插件后,一个好的习惯是在属性后面加一个逗号,这样会自动换行。比如下面是没有逗号和逗号的区别,显然加了逗号的阅读体验更好。
// 每个属性后加逗号
PrimaryButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) =>
const WindmillIndicatorDemo(),
),
);
},
title: '大风车动画',
),
// 不加逗号的情况
PrimaryButton(
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) =>
const WindmillIndicatorDemo(),
));
},
title: '大风车动画'),
使用 Prettier 也可以设置超出字符后自动换行。关于 Prettier 的设置可以查看 GitHub 的说明文档:prettier-vscode。
分支代码
对于存在多个分支的控制代码,统一使用大括号将各个分支包裹起来。
// 正确示例
if (isWeekDay) {
print('Bike to work!');
} else {
print('Go dancing or read a book!');
}
// 错误示例
if (isWeekDay) {
print('Bike to work!');
} else print('Go dancing or read a book!');
对于只有一条分支语句,且一行可以写完的(80个字符以内)可以不适用大括号。
if (arg == null) return defaultValue;
而对于一行写不完的,那么还是需要使用大括号包裹起来:
// 正确示例
if (overflowChars != other.overflowChars) {
return overflowChars < other.overflowChars;
}
// 错误示例
if (overflowChars != other.overflowChars)
return overflowChars < other.overflowChars;
操作符
对于赋值,运算符、条件判断、箭头函数等,在操作符前后各空一格,以增强阅读体验。下面的示例对比,哪个阅读体验更好,一目了然!
// 正确示例
double r = 3.0;
double area = pi * r * r;
_elevation = _elevation == 0 ? 10.0 : 0.0;
if (area <= 2.0) {
print('Less than 2.0. ');
}
MaterialPageRoute(
builder: (BuildContext context) => const AnimatedWidgetDemo(),
),
// 错误示例
double r=3.0;
double area=pi*r*r;
_elevation=_elevation==0?10.0:0.0;
if (area<=2.0) {
print('Less than 2.0. ');
}
MaterialPageRoute(
builder: (BuildContext context)=>const AnimatedWidgetDemo(),
),
总结
本篇介绍了 Dart 语言的导入导出次序,以及编码的最基本的规则。这样的规则也适用于其他语言,只要记住那句话:代码是写给人看的!注重代码命名风格和编码风格,然后,善用一些代码格式化工具,就能够让你的编码看起来井井有条!
网友评论