美文网首页Flutter圈子Android开发Flutter 入门与实战
构建良好的 Dart 编码风格:导入导出次序和基本编码规范

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

作者: 岛上码农 | 来源:发表于2022-04-11 20:53 被阅读0次

    前言

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

    相关文章

      网友评论

        本文标题:构建良好的 Dart 编码风格:导入导出次序和基本编码规范

        本文链接:https://www.haomeiwen.com/subject/wnswsrtx.html