前言
我們之前介紹了 Dart 的命名規(guī)范,本篇來(lái)介紹 Dart 的代碼次序和格式化規(guī)范抑党。開(kāi)篇還是重復(fù)那句話:代碼是寫給人看的包警。
import 導(dǎo)入次序
導(dǎo)入次序本身并不會(huì)影響代碼的執(zhí)行,但是整齊的導(dǎo)入會(huì)讓你的代碼看起來(lái)更加舒適底靠,也會(huì)讓人感覺(jué)你的代碼更有條理害晦。官方對(duì)于導(dǎo)入的順序建議如下圖所示。
而對(duì)于同級(jí)別的,建議是按字母次序排序(這個(gè)有點(diǎn)難??)壹瘟。下面是示例:
// 正確示例
import 'dart:async';
import 'dart:html';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import '../components/buttons.dart';
import '../utils/http.dart';
// 錯(cuò)誤示例 (未按字母排序)
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';
import 'foo/foo.dart';
import 'foo.dart';
export 應(yīng)當(dāng)排在所有 import 之后鲫剿,并在二者之間空一行
這個(gè)好理解,導(dǎo)出應(yīng)當(dāng)放在導(dǎo)入之后稻轨,而且為了區(qū)別灵莲,在之間空一行,下面是示例:
// 正確示例
import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';
// 錯(cuò)誤示例
import 'src/error.dart';
export 'src/error.dart';
import 'src/foo_bar.dart';
使用 dart format 工具格式化代碼
Dart 提供了 dart format 工具來(lái)格式化代碼殴俱。簡(jiǎn)單的命令如下政冻,詳細(xì)可以查看官方文檔:dart-format。
# 格式化當(dāng)前文件夾文件
dart format .
# 使用空格分隔格式化多個(gè)目錄或文件
dart format lib bin/updater.dart
當(dāng)然线欲,對(duì)于 VSCode 而言明场,推薦使用 Prettier - Code Formatter
這個(gè)插件,保存后會(huì)自動(dòng)格式化李丰。
單行代碼不要超過(guò)80個(gè)字符
這個(gè)是大多數(shù)編程語(yǔ)言的要求苦锨,屏幕大的可能沒(méi)太大感知,但是屏幕小的時(shí)候代碼閱讀體驗(yàn)及其糟糕趴泌。對(duì)于 Flutter舟舒,使用了 Prettier 插件后,一個(gè)好的習(xí)慣是在屬性后面加一個(gè)逗號(hào)嗜憔,這樣會(huì)自動(dòng)換行秃励。比如下面是沒(méi)有逗號(hào)和逗號(hào)的區(qū)別,顯然加了逗號(hào)的閱讀體驗(yàn)更好痹筛。
// 每個(gè)屬性后加逗號(hào)
PrimaryButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) =>
const WindmillIndicatorDemo(),
),
);
},
title: '大風(fēng)車動(dòng)畫',
),
// 不加逗號(hào)的情況
PrimaryButton(
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) =>
const WindmillIndicatorDemo(),
));
},
title: '大風(fēng)車動(dòng)畫'),
使用 Prettier 也可以設(shè)置超出字符后自動(dòng)換行。關(guān)于 Prettier 的設(shè)置可以查看 GitHub 的說(shuō)明文檔:prettier-vscode廓鞠。
分支代碼
對(duì)于存在多個(gè)分支的控制代碼帚稠,統(tǒng)一使用大括號(hào)將各個(gè)分支包裹起來(lái)。
// 正確示例
if (isWeekDay) {
print('Bike to work!');
} else {
print('Go dancing or read a book!');
}
// 錯(cuò)誤示例
if (isWeekDay) {
print('Bike to work!');
} else print('Go dancing or read a book!');
對(duì)于只有一條分支語(yǔ)句床佳,且一行可以寫完的(80個(gè)字符以內(nèi))可以不適用大括號(hào)滋早。
if (arg == null) return defaultValue;
而對(duì)于一行寫不完的,那么還是需要使用大括號(hào)包裹起來(lái):
// 正確示例
if (overflowChars != other.overflowChars) {
return overflowChars < other.overflowChars;
}
// 錯(cuò)誤示例
if (overflowChars != other.overflowChars)
return overflowChars < other.overflowChars;
操作符
對(duì)于賦值砌们,運(yùn)算符杆麸、條件判斷、箭頭函數(shù)等浪感,在操作符前后各空一格昔头,以增強(qiáng)閱讀體驗(yàn)。下面的示例對(duì)比影兽,哪個(gè)閱讀體驗(yàn)更好揭斧,一目了然!
// 正確示例
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(),
),
// 錯(cuò)誤示例
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(),
),
總結(jié)
本篇介紹了 Dart 語(yǔ)言的導(dǎo)入導(dǎo)出次序峻堰,以及編碼的最基本的規(guī)則讹开。這樣的規(guī)則也適用于其他語(yǔ)言盅视,只要記住那句話:代碼是寫給人看的!注重代碼命名風(fēng)格和編碼風(fēng)格旦万,然后闹击,善用一些代碼格式化工具,就能夠讓你的編碼看起來(lái)井井有條成艘!