构建良好的 Dart 编码风格:导入导出次序和编码规范

6,937 阅读3分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

前言

我们之前介绍了 Dart 的命名规范,本篇来介绍 Dart 的代码次序和格式化规范。开篇还是重复那句话:代码是写给人看的

import 导入次序

导入次序本身并不会影响代码的执行,但是整齐的导入会让你的代码看起来更加舒适,也会让人感觉你的代码更有条理。官方对于导入的顺序建议如下图所示。

import 次序

而对于同级别的,建议是按字母次序排序(这个有点难😂)。下面是示例:

// 正确示例
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 语言的导入导出次序,以及编码的最基本的规则。这样的规则也适用于其他语言,只要记住那句话:代码是写给人看的!注重代码命名风格和编码风格,然后,善用一些代码格式化工具,就能够让你的编码看起来井井有条!

我是岛上码农,微信公众号同名,这是Flutter 入门与实战的专栏文章,提供体系化的 Flutter 学习文章。对应源码请看这里:Flutter 入门与实战专栏源码。如有问题可以加本人微信交流,微信号:island-coder

👍🏻:觉得有收获请点个赞鼓励一下!

🌟:收藏文章,方便回看哦!

💬:评论交流,互相进步!