Effective Dart
過去数年間にわたって、私たちは大量のDartコードを記述し、何がうまく機能し、何が機能しないのかについて多くのことを学びました。私たちはこれを皆さんと共有することで、皆さんも一貫性があり、堅牢で、高速なコードを記述できるようにします。2つの主要なテーマがあります。
一貫性を保つ。フォーマットやケースなどに関しては、どちらが良いかについての議論は主観的で、解決不可能です。私たちが知っているのは、一貫性が客観的に役立つということです。
2つのコードが異なって見える場合、それは何らかの意味のある方法で実際に異なるためであるはずです。コードの一部が目立って目を引く場合、それは有用な理由によるはずです。
簡潔にする。Dartは使い慣れたものになるように設計されているため、C、Java、JavaScriptなどの他の言語と同じ多くのステートメントと式を継承しています。しかし、私たちは、これらの言語が提供するものを改善する余地が非常に多いため、Dartを作成しました。文字列補間から初期化形式まで、多くの機能を追加して、より簡単に、そして簡単にあなたの意図を表現できるようにしました。
何かを言うための複数の方法がある場合、一般的に最も簡潔な方法を選択する必要があります。これは、コードゴルフをしてプログラム全体を1行に詰め込むべきだと言っているわけではありません。目標は、密度の高いコードではなく、経済的なコードです。
ガイド
#理解しやすいように、ガイドラインをいくつかの別々のページに分割しました。
スタイルガイド – これは、コードのレイアウトと構成に関するルール、あるいは少なくとも
dart format
が処理しない部分を定義しています。スタイルガイドでは、識別子のフォーマットも指定されています:camelCase
、using_underscores
など。ドキュメントガイド – これは、コメントの中に何が含まれるべきかについて知っておく必要があるすべてを説明しています。ドキュメントコメントと通常のコードコメントの両方についてです。
使用方法ガイド – これは、言語機能を最適に使用して動作を実装する方法を教えます。ステートメントや式にある場合は、ここで説明されています。
設計ガイド – これは最も柔軟なガイドですが、最も広い範囲をカバーしています。ライブラリの、一貫性があり、使いやすいAPIを設計することについて学んだことが記載されています。型シグネチャや宣言にある場合は、ここで説明されています。
すべてのガイドラインへのリンクについては、概要を参照してください。
ガイドの読み方
#各ガイドはいくつかのセクションに分割されています。セクションには、ガイドラインのリストが含まれています。各ガイドラインは、次のいずれかの単語で始まります。
DOガイドラインは、常に従うべき実践を記述しています。それらから逸脱する正当な理由はほとんどありません。
DON'Tガイドラインは、その逆です。ほとんどの場合、良い考えではありません。歴史的な負担が少ないため、他の言語ほど多くはないことを願っています。
PREFERガイドラインは、従うべき実践です。ただし、そうでない方が理にかなう状況もあるかもしれません。ガイドラインを無視する場合、その完全な意味を理解するようにしてください。
AVOIDガイドラインは「prefer」の反対です。行うべきではないものですが、まれに良い理由がある場合もあります。
CONSIDERガイドラインは、状況、先例、そしてあなた自身の好みによっては、従うか従わないかのいずれかになる可能性のある実践です。
一部のガイドラインでは、ルールが適用されない例外について説明しています。リストされている場合、例外は網羅的ではない可能性があります。他のケースでは、判断が必要になる場合があります。
靴紐が正しく結ばれていないと、警察がドアを叩き壊してくるように聞こえます。それほど悪いことではありません。ここのガイドラインのほとんどは常識であり、私たちは皆理性的な人間です。目標は、常に、美しく、読みやすく、保守しやすいコードです。
Dartアナライザーは、これらのガイドラインおよびその他のガイドラインに従った、良好で一貫性のあるコードを記述するのに役立つリンターを提供します。ガイドラインに従うのに役立つリンタールールが1つ以上存在する場合は、ガイドラインがそれらのルールにリンクされます。リンクは次の形式を使用します。
リンタールール: unnecessary_getters_setters
リンターの使用方法については、リンタールールの有効化とリンタールールのリストを参照してください。
用語集
#ガイドラインを簡潔にするために、異なるDart構成体を指すためにいくつかの略語を使用しています。
ライブラリメンバーとは、トップレベルのフィールド、ゲッター、セッター、または関数です。基本的に、型ではないトップレベルのすべてです。
クラスメンバーとは、クラス内で宣言されたコンストラクタ、フィールド、ゲッター、セッター、関数、または演算子です。クラスメンバーは、インスタンスまたは静的、抽象または具体的ないずれかになります。
メンバーとは、ライブラリメンバーまたはクラスメンバーのいずれかです。
変数は、一般的に使用される場合、トップレベル変数、パラメーター、およびローカル変数を指します。静的またはインスタンスフィールドは含まれません。
型とは、クラス、typedef、または列挙型など、名前付きの型宣言です。
プロパティとは、トップレベル変数、ゲッター(クラス内またはトップレベル、インスタンスまたは静的)、セッター(同じ)、またはフィールド(インスタンスまたは静的)です。おおよそ「フィールドのような」名前付き構成体です。
すべてのルールの概要
#スタイル
#識別子
- 型には
UpperCamelCase
を使用してください。 - 拡張機能には
UpperCamelCase
を使用してください。 - パッケージ、ディレクトリ、ソースファイルには
lowercase_with_underscores
を使用してください。 - インポートプレフィックスには
lowercase_with_underscores
を使用してください。 - その他の識別子には
lowerCamelCase
を使用してください。 - 定数名には
lowerCamelCase
を使用することを推奨します。 - 2文字以上の頭字語と略語は大文字で単語のように記述してください。
- 未使用のコールバックパラメーターには
_
、__
などを使用することを推奨します。 - 非プライベートの識別子には先頭にアンダースコアを使用しないでください。
- プレフィックス文字を使用しないでください。
- ライブラリを明示的に名前付けないでください。
順序
dart:
インポートを他のインポートの前に配置してください。package:
インポートを相対インポートの前に配置してください。- すべてのインポートの後、エクスポートを別のセクションに指定してください。
- セクションをアルファベット順にソートしてください。
フォーマット
ドキュメント
#コメント
ドキュメントコメント
- メンバーと型を記述するには、
///
ドキュメントコメントを使用してください。 - 公開APIについては、ドキュメントコメントを記述することを推奨します。
- ライブラリレベルのドキュメントコメントの記述を検討してください。
- 非公開APIについても、ドキュメントコメントの記述を検討してください。
- ドキュメントコメントは、1文のサマリーで始めるようにしてください。
- ドキュメントコメントの最初の文は、独立した段落にするようにしてください。
- 周囲のコンテキストとの重複は避けてください。
- 関数またはメソッドのコメントは、三人称の動詞で始めることを推奨します。
- ブール型でない変数またはプロパティのコメントは、名詞句で始めることを推奨します。
- ブール型の変数またはプロパティのコメントは、「Whether」に続いて名詞句または動名詞句で始めることを推奨します。
- プロパティのゲッターとセッターの両方にドキュメントを記述しないでください。
- ライブラリまたは型のコメントは、名詞句で始めることを推奨します。
- ドキュメントコメントにコードサンプルを含めることを検討してください。
- スコープ内の識別子を参照するには、ドキュメントコメントで角括弧を使用してください。
- パラメータ、戻り値、例外を説明するには、散文を使用してください。
- メタデータアノテーションの前にドキュメントコメントを配置してください。
Markdown
記述
使用方法
#ライブラリ
part of
ディレクティブには文字列を使用してください。- 別のパッケージの
src
ディレクトリ内にあるライブラリをインポートしないでください。 - インポートパスが
lib
ディレクトリの内外にアクセスすることを許可しないでください。 - 相対インポートパスを推奨します。
Null
- 変数を明示的に
null
に初期化しないでください。 null
を明示的なデフォルト値として使用しないでください。- 等価演算で
true
またはfalse
を使用しないでください。 - 初期化されているかどうかを確認する必要がある場合は、
late
変数を避けてください。 - null許容型を使用するには、型昇格またはnullチェックパターンを検討してください。
文字列
コレクション
- 可能な限り、コレクションリテラルを使用してください。
- コレクションが空かどうかを確認するために
.length
を使用しないでください。 - 関数リテラルで
Iterable.forEach()
を使用しないでください。 - 結果の型を変更する意図がない限り、
List.from()
を使用しないでください。 - 型でコレクションをフィルタリングするには、
whereType()
を使用してください。 - 近くの操作で済む場合、
cast()
を使用しないでください。 cast()
の使用を避けてください。
関数
変数
メンバー
- フィールドをゲッターとセッターで不必要にラップしないでください。
- 読み取り専用のプロパティを作成するには、
final
フィールドを使用することを推奨します。 - 単純なメンバーには
=>
を使用することを検討してください。 - 名前付きコンストラクタにリダイレクトする場合、またはシャドウイングを回避する場合を除き、
this.
を使用しないでください。 - 可能な限り、宣言時にフィールドを初期化してください。
コンストラクタ
- 可能な限り、初期化子付き仮引数を使用してください。
- コンストラクタ初期化子リストで済む場合、
late
を使用しないでください。 - 空のコンストラクタ本体には
;
を{}
の代わりに使用してください。 new
を使用しないでください。const
を冗長に使用しないでください。
エラー処理
on
句のないcatch句を避けてください。on
句のないcatch句からエラーを破棄しないでください。- プログラムエラーに対してのみ、
Error
を実装するオブジェクトをスローしてください。 Error
またはそれを実装する型を明示的にキャッチしないでください。- キャッチされた例外を再スローするには、
rethrow
を使用してください。
非同期処理
設計
#名前
- 用語を常に一貫して使用してください。
- 省略形を避けてください。
- 最も記述的な名詞を最後に置くことを推奨します。
- コードを文のように読めるようにすることを検討してください。
- ブール型でないプロパティまたは変数には、名詞句を推奨します。
- ブール型のプロパティまたは変数には、命令形ではない動詞句を推奨します。
- 名前付きブール型の*パラメータ*には、動詞を省略することを検討してください。
- ブール型のプロパティまたは変数には、「肯定的」な名前を推奨します。
- 主要な目的が副作用である関数またはメソッドには、命令形の動詞句を推奨します。
- 値を返すことが主要な目的である関数またはメソッドには、名詞句または命令形ではない動詞句を推奨します。
- 実行する作業に注意を引く必要がある場合は、関数またはメソッドに命令形の動詞句を検討してください。
- メソッド名を
get
で始めることを避けてください。 - オブジェクトの状態を新しいオブジェクトにコピーする場合は、メソッド名を
to___()
にすることを推奨します。 - 元のオブジェクトによって裏付けられた異なる表現を返す場合は、メソッド名を
as___()
にすることを推奨します。 - 関数またはメソッドの名前でパラメータを記述することを避けてください。
- 型パラメータを命名する際には、既存のニーモニック規則に従ってください。
ライブラリ
クラスとmixin
- 単純な関数で済む場合、1つのメンバーを持つ抽象クラスを定義しないでください。
- 静的メンバーのみを含むクラスを定義しないでください。
- サブクラス化することを意図していないクラスを拡張しないでください。
- クラスが拡張をサポートしている場合は、文書化してください。
- インターフェースとして意図されていないクラスを実装しないでください。
- クラスがインターフェースとして使用できる場合は、文書化してください。
mixin class
よりも、純粋なmixin
または純粋なclass
を優先してください。
コンストラクタ
メンバー
- フィールドとトップレベル変数を
final
にすることを推奨します。 - 概念的にプロパティにアクセスする操作には、ゲッターを使用してください。
- 概念的にプロパティを変更する操作には、セッターを使用してください。
- 対応するゲッターがないセッターを定義しないでください。
- オーバーロードを偽装するために、ランタイム型テストを使用しないでください。
- 初期化子を持たない公開
late final
フィールドを避けてください。 - null許容可能な
Future
、Stream
、およびコレクション型を返さないでください。 - 流暢なインターフェースを有効にするためだけに、メソッドから
this
を返さないでください。
型
- 初期化子を持たない変数は型注釈を付けてください。
- 型が明らかでない場合は、フィールドとトップレベル変数に型注釈を付けてください。
- 初期化されたローカル変数に冗長に型注釈を付けないでください。
- 関数宣言では戻り値の型を注釈付けてください。
- 関数宣言ではパラメータの型を注釈付けてください。
- 関数式では、推論されたパラメータの型を注釈付けないでください。
- 初期化子付き仮引数の型注釈を付けないでください。
- 推論されないジェネリック呼び出しには、型引数を記述してください。
- 推論されるジェネリック呼び出しには、型引数を記述しないでください。
- 不完全なジェネリック型を記述しないでください。
- 推論が失敗する代わりに、
dynamic
で注釈を付けてください。 - 関数型の注釈には、シグネチャを優先してください。
- セッターの戻り値の型を指定しないでください。
- レガシーなtypedef構文を使用しないでください。
- typedefよりもインライン関数型を優先してください。
- パラメータには関数型構文を使用することを推奨します。
- 静的チェックを無効にする場合を除き、
dynamic
の使用を避けてください。 - 値を生成しない非同期メンバーの戻り値の型には、
Future
を使用してください。 - 戻り値の型として
FutureOr
を使用しないでください。
パラメータ
- 位置指定されたブール型パラメータを避けてください。
- ユーザーが以前のパラメータを省略する可能性がある場合は、オプションの位置指定パラメータを避けてください。
- 特別な「引数なし」値を受け入れる必須パラメータを避けてください。
- 範囲を受け入れるには、包含開始と排他的終了パラメータを使用してください。
等価性
特に明記されていない限り、このサイトのドキュメントはDart 3.5.3を反映しています。ページは2024年5月6日に最終更新されました。ソースを表示 または 問題を報告してください。