⚠️

Flutter/Dart Linterエラー `'bool' parameters should be named parameters`

に公開

はじめに

FlutterやDartで開発をしていると、時々 avoid_positional_boolean_parameters というLinter(コードの静的解析ツール)ルールから 'bool' parameters should be named parameters という警告を受けることがあります。

この記事では、以下の内容について、初心者の方にも分かりやすく解説します:

  • このエラー(警告)が発生する理由
  • なぜ bool 型の位置パラメータが良くないとされるのか
  • コードをどのように改善すればよいか

このエラーはなぜ発生するのか?

結論から言うと、コードの可読性(読みやすさ)を著しく低下させる可能性があるためです。

位置パラメータとは?

まず、「位置パラメータ(Positional Parameters)」について簡単に説明します。
これは、関数を呼び出す際に引数を順番通りに渡す方法です。

// 位置パラメータを持つ関数の定義
void printUserInfo(String name, int age) {
  print('名前: $name, 年齢: $age');
}

// 呼び出し
printUserInfo('田中太郎', 30);

bool型の位置パラメータが引き起こす問題

では、ここに bool 型のパラメータが加わるとどうなるでしょうか?

// 悪い例:bool型の位置パラメータ
void createUser(String name, int age, bool isAdmin) {
  // ... ユーザー作成処理
}

// 呼び出し側
createUser('佐藤花子', 25, true);

この createUser 関数の呼び出しを見て、true が何を意味するのかすぐに分かりますか?
この例では isAdmin だと分かりますが、もし関数定義が別のファイルにあり、パラメータ名が見えない状況だとしたらどうでしょう。

true が「管理者権限あり」なのか、「プレミアム会員」なのか、はたまた「通知を許可する」のか、呼び出し側のコードだけでは全く分かりません。
これが、bool 型の位置パラメータが「良くない」とされる最大の理由です。

エラーの改善方法:名前付きパラメータを使おう

この問題を解決するのが**名前付きパラメータ(Named Parameters)**です。
名前付きパラメータは、引数を渡す際にその名前を指定する方法です。

修正前のコード(悪い例)

// Linterエラーが発生するコード
void showDialog(String title, String message, bool dismissible) {
  // ダイアログを表示する処理
}

// 呼び出し側
showDialog('エラー', '接続に失敗しました', true); // この 'true' は何?

修正後のコード(良い例)

関数定義の引数を {} で囲むことで、名前付きパラメータになります。

// 改善されたコード
void showDialog({
  required String title,
  required String message,
  required bool dismissible,
}) {
  // ダイアログを表示する処理
}

// 呼び出し側
showDialog(
  title: 'エラー',
  message: '接続に失敗しました',
  dismissible: true, // パラメータ名があるので 'true' の意味が一目瞭然!
);

なぜ名前付きパラメータが良いのか?

  1. 圧倒的な可読性: 呼び出し側で dismissible: true と書かれているため、true が「ダイアログが外部タップで閉じられるかどうか」を意味することが一目で分かります。
  2. バグの防止: 引数の順番を気にする必要がありません。もし複数の bool 型パラメータがあっても、名前で指定するため間違えるリスクが低減します。
  3. 保守性の向上: 未来の自分や他の開発者がこのコードを見たときに、関数の使い方をすぐに理解できます。

よくある質問

Q: bool以外の型でも名前付きパラメータを使うべき?

A: ケースバイケースですが、パラメータが3つ以上になる場合や、同じ型のパラメータが続く場合は、名前付きにすることを検討すると良いでしょう。ただし、bool 型は特に意味が分かりにくくなりがちなので、積極的に名前付きにすることが推奨されています。

Q: required は必ず必要?

A: required を付けると、そのパラメータが必須であることを示します。もしパラメータが任意(省略可能)である場合は、デフォルト値を与えます。

void showDialog({
  required String title,
  required String message,
  bool dismissible = true, // デフォルト値を設定
}) {
  // ...
}

// 呼び出し側
showDialog(
  title: '成功',
  message: '処理が完了しました',
  // dismissibleは省略可能(省略した場合はtrueになる)
);

まとめ

  • avoid_positional_boolean_parameters は、コードの可読性を保つための重要なLinterルールです。
  • bool 型のパラメータを関数に渡すときは、位置パラメータではなく名前付きパラメータを使いましょう。
  • 関数を定義するときは、bool 型の引数を {} で囲んで名前付きにすることを習慣づけるのがおすすめです。

Discussion