関数型プログラミング チェックリスト(Functional Programming Checklist)
関数型プログラミングにおける良い設計のためのチェックリストです。以下の観点ごとに、基本項目と詳細項目を整理しています。
観点 | 基本項目 | 詳細項目 |
---|---|---|
純粋関数(Pure Functions) | □ 同じ入力に対して常に同じ出力か? □ 副作用を持たないか? | □ I/Oや状態変更などの副作用を含まないか? □ ランダムや日時など非決定的要素を扱っていないか? |
不変性(Immutability) | □ 変数や状態を変更していないか? | □ ミュータブルなデータ構造の使用を避けているか? □ 更新処理が新しい値を返すようになっているか? |
合成性(Composability) | □ 関数は小さく分離されているか? □ 関数同士が組み合わせられるか? | □ pipe や compose を使って流れを構成できるか? □ 高凝集・疎結合の設計になっているか? |
宣言的スタイル(Declarative Style) | □ 「何をしたいか」が記述されているか? | □ for文やif文など命令型スタイルを避け、map / filter / reduce 等を使っているか? |
副作用の封じ込め | □ 副作用は関数の外に押し出されているか? | □ HTTP通信やログ出力などは明示的に管理されているか? □ Task / IO / Observable 等のエフェクト型を利用しているか? |
高階関数(Higher-Order Functions) | □ 関数を引数や戻り値として使っているか? | □ 汎用的な関数が再利用可能な構造になっているか? |
データと処理の分離 | □ データ構造と処理が分かれているか? | □ 関数が特定のデータ構造に依存していないか? □ 型に基づいた処理の分離が行われているか? |
エラーハンドリングの明示性 | □ 例外に依存していないか? | □ Option / Either / Result などでエラーを表現しているか? □ エラー処理が合成の一部として扱われているか? |
テストのしやすさ | □ 関数が小さく、純粋でテストしやすいか? | □ 状態や副作用に依存せず、単体でテスト可能か? |
状態の明示的な管理 | □ 状態の変化が明示的に管理されているか? | □ ストリームやデータ構造を使って状態変化を記述しているか? □ 暗黙の共有状態を使っていないか? |