mcpField
K
kotlin-control-flow

kotlin-control-flow

github.com/chrisbanes開発1.1k1.2k 回インストール1 日前に更新
リポジトリ

kotlin-control-flow について

開発者やコーディングエージェント向けの Kotlin 制御フロースキルです。subject 付き `when`、ガード分岐、網羅的な分岐選択に加え、プロジェクトのビルドツールによる検証も扱います。

主な機能

  1. 01`when` と `if` の選択指針
  2. 02条件を絞るガード分岐
  3. 03閉じた型の網羅的な分岐
  4. 04無効状態を除く早期リターン
  5. 05スマートキャストを使う分岐処理
  6. 06プロジェクトのビルドとテストの検証

活用シーン

  1. 01同じ値を調べる条件のリファクタリング
  2. 02enum や sealed 型の結果処理
  3. 03無効値や nullable 状態を主経路から除外

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/chrisbanes/skills --skill kotlin-control-flow

インストール後、Claude Code で/kotlin-control-flowを入力して読み込まれたか確認します。

詳細

Kotlin の制御フロー

基本原則

分類する値が明確に分かるようにし、分岐固有の述語はその分岐内に置き、閉じた値域の網羅性はコンパイラーに証明させます。

手順

  1. 分類する値に名前を付けます。すべての分岐がその値をテストするなら、when (subject) を使います。それ以外の場合は、subject のない when または if チェーンを使います。

  2. 分岐の形を選びます。

    コードの形推奨
    1 つの値を分類するwhen (subject)
    関連のないブール条件subject のない when または if/else
    主条件と分岐固有の述語ガード条件
    メインの処理経路より前に無効な入力を処理する早期リターン、require、または check
    閉じた値域で値を返す網羅的な when 式
    開いた入力または意図的なフォールバック明示的な else
  3. ガードは、subject のある when で主条件の後にのみ使います。追加の述語がその分岐に属し、ガードなしの分岐でも主条件を処理する場合に使います。ガード付きの分岐を先に置きます。カンマで区切られた条件のうち 1 つにガードを付けるのではなく、条件を分割します。ガードは Kotlin 2.2 以降で安定しています。明示的な languageVersion の設定があればそれに従います。設定がない場合は、ビルドファイルまたはバージョンカタログに記載されたプロジェクトの Kotlin バージョンでサポートを確認できます。そのため、さらなる証拠がないことを理由にガードの使用を避けないでください。

  4. 閉じた列挙型、Boolean、sealed 型、または閉じた nullable 型では、すべてのケースを列挙し、else を省略します。オブジェクトは値で、クラスや data class のサブタイプは is で照合します。入力が開いたサーバー/プラットフォームの値である場合や、実際にフォールバックやログ出力が必要な場合は、else を残します。catch-all にまとめるサブタイプも含め、データを持つ各サブタイプにそれぞれ独自の is 分岐を設けます。そのデータがマッピングや安全な処理に影響する場合は、公開される値が一定のままでも、指摘や変更にスマートキャストされたメンバーアクセスを含める必要があります。

    is Outcome.Failed -> safeFailureLabel(outcome.reason)
    

    is チェックによって outcome がスマートキャストされるため、この分岐ではキャストせずに reason を使えます。ヘルパー名は例示です。ケース名を列挙するだけ、または元の値を呼び出し元に確認させるだけでは、分岐の案内として不十分です。データが結果に影響しない場合は、その is 分岐で現在の値を維持し、データの用途を作り出さないでください。

  5. 早期リターンは、メインの処理経路から無効な状態または nullable な状態を取り除く場合にのみ使います。クリーンアップ、トランザクション、エラー処理を表すネストは維持します。

  6. as、!!、可変の一時変数、重複したキャストを使わずに、スマートキャストが引き続き機能することを確認します。機能しない場合は、元の形を維持するか、より小さなリファクタリングにとどめます。

  7. プロジェクト固有のビルドツールでコンパイルとテストを行います。Gradle プロジェクトでは、Gradle の実行ワークフローを使い、生の Gradle は使わないでください。失敗した場合は、該当する最も小さな前の手順に戻るか、以前の形を維持します。subject、フォールバック、関連する分岐データが読み手に明確で、結果の形がより読みやすくなったら完了です。

レシピ

ネストした if の代わりに、1 つのケースを絞り込むガード付き分岐を使います。

return when (event) {
    is Event.Message if event.isUnread -> Row.Highlighted(event.message)
    is Event.Message -> Row.Normal(event.message)
    Event.Empty -> Row.Empty
}

繰り返し現れる条件で 1 つの値を分類する場合は、subject のある when を使います。より大きな分類の 1 ケースとして null がある場合は、分岐に含めます。

return when (val selected = selection) {
    null -> SelectionUi.None
    is Selection.Single if selected.item.isArchived -> SelectionUi.Archived(selected.item)
    is Selection.Single -> SelectionUi.Active(selected.item)
    is Selection.Multiple -> SelectionUi.Count(selected.items.size)
}

サポートされていない Kotlin バージョンでガードを導入したり、関連のないブールチェックを無理に subject のある when にしたり、開いた値域のフォールバックを削除したり、クリーンアップ、トランザクション、エラーを分かりにくくするコードを平坦化したりしないでください。

関連項目

コメント