Closed24

Dartのコーディングスタイルガイド「Effective Dart: Style」を読んでいく

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO name libraries, packages, directories, and source files using lowercase_with_underscores.

ライブラリ、パッケージ、ディレクトリ、ソースファイルにはlowercase_with_underscoresを使う。

import 'file_system.dart';

ライブラリって何だろう?

今のところよくわからないけれど下記のページが参考になりそう。

https://zenn.dev/littleforest/articles/a4fc5bc7c944d42f66d2

https://dart.dev/guides/libraries/create-library-packages

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO name import prefixes using lowercase_with_underscores.

インポートプレフィックスにはlowercase_with_underscoresを使う。

import 'package:angular_components/angular_components.dart' as angular_components;

インポートプレフィックスがよくわからないけど上の例だとangular_components.xxxとかで関数やクラスにアクセスできるようになるのかな?

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO name other identifiers using lowerCamelCase.

他の識別子(変数名や関数名)にはlowerCamelCaseを使う。

var count = 3;
void align(bool clearItems) {}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

PREFER using lowerCamelCase for constant names.

定数にはlowerCamelCaseを使う方が良い。

const pi = 3.14;

定数にはSCREAMING_CAPSなのかと思っていたので意外。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO capitalize acronyms and abbreviations longer than two letters like words.

3文字以上の頭字語と略語は1文字目を大文字にする(普通の単語のように扱う)

class HttpConnection {}
class DBIOPort {}

HTTPは4文字なのでHttpにするがDBやIOは2文字なのでそれぞれDBIOのままにする。

頭字語と略語の違いがわからない...

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

PREFER using _, __, etc. for unused callback parameters.

未使用のコールバック引数には___を使用した方が良い。

futureOfVoid.then((_) {
  print('Operation complete.');
});
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DON’T use a leading underscore for identifiers that aren’t private.

プライベートではない識別子はアンダースコアから始めない。

class A {
  final public = "public";
  final _private = "private";
}

DartではJavaのようにpublicprivateなどのキーワードが無いようだ。

void main() {
  final a = new A();
  print(a.public);
  print(a._private);
}

これが普通に動くのでプライベートなフィールドにアクセスできない訳でも無い。

https://www.woolha.com/tutorials/dart-using-access-modifiers-private-public

上記のページによると他のファイルからインポートした場合はコンパイルエラーが表示されるらしい。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

今気づいたけどEffective Dart: Styleは下記の3つのチャプターから構成されている。

  1. Identifiers: 識別子
  2. Ordering: 順序
  3. Formatting: 整形

以上までIdentifiersチャプター、以下からOrderingチャプター。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO place “dart:” imports before other imports.

dart:から始まるインポートは他のインポートよりも前に置く。

import 'dart:async';
import 'dart:html';

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

これはVSCodeがよろしくやってくれているので大丈夫そう。いつもありがとう、VSCode。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO place “package:” imports before relative imports.

package:から始まるインポートは相対的なインポートよりも前に置く。

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'util.dart';
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO specify exports in a separate section after all imports.

エクスポートはインポートとは別のセクションで指定する。

import 'src/error.dart';
import 'src/foo_bar.dart';

export 'src/error.dart';

エクスポートはまだ使ったことがないが、インポートしたものを再エクスポートする機能だろうか?

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO sort sections alphabetically.

インポートやエクスポートは辞書順に並べ替える。

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'foo.dart';
import 'foo/foo.dart';
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO format your code using dart format.

dart formatコマンドを使ってコードを整形する。

dart format main.dart

VSCodeならFormat Documentを実行するか、macOSの場合はOption + Shift + Fを押す。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

CONSIDER changing your code to make it more formatter-friendly

どうすればフォーマッターが整形しやすいかを意識してコーディングする。

一例として長い識別子、ネストが深い式、異なる種類のオペレーターの混合などを避けることが紹介されている。

オペレーターって何だろう?

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

AVOID lines longer than 80 characters.

1行が81文字以上になることを避ける。

これは普段から気をつけているけれど、どうしても超えてしまう時ってあるよね。

とても長いクラス名(VeryLongCamelCaseClassNames )が元凶であることが多いと紹介されている。

あまり冗長にならないコンパクトな名前を付けられるようになるといいな。

ちなみにURLや複数行の文字列などは例外とされている。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

DO use curly braces for all flow control statements.

iffor{}を省略しない。

if (isWeekDay) {
  print('Bike to work!');
} else {
  print('Go dancing or read a book!');
}

例外としてifelseがなく、かつ、すべてが1行に収まる場合は{}は省略しても良い。

if (arg == null) return defaultValue;
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

まとめてみる。

  • 識別子
    • 型にはUpperCameraCaseを使う。
    • エクステンションにはUpperCamelCaseを使う。
    • ライブラリ、パッケージ、ディレクトリ、ソースファイルにはlowercase_with_underscoresを使う。
    • インポートプレフィックスにはlowercase_with_underscoresを使う。
    • 他の識別子(変数名や関数名)にはlowerCamelCaseを使う。
    • 定数にはlowerCamelCaseを使う方が良い。
    • 3文字以上の頭字語と略語は1文字目を大文字にする(普通の単語のように扱う)
    • 未使用のコールバック引数には___を使用した方が良い。
    • プライベートではない識別子はアンダースコアから始めない。
    • 変数名などに接頭辞を使わない。
  • 順序
    • dart:から始まるインポートは他のインポートよりも前に置く。
    • package:から始まるインポートは相対的なインポートよりも前に置く。
    • エクスポートはインポートとは別のセクションで指定する。
    • インポートやエクスポートは辞書順に並べ替える。
  • 整形
    • dart formatコマンドを使ってコードを整形する。
    • どうすればフォーマッターが整形しやすいかを意識してコーディングする。
    • 1行が81文字以上になることを避ける。
    • ifやforの{}を省略しない。
このスクラップは2023/01/10にクローズされました