関数型プログラミング チェックリスト(Functional Programming Checklist)
※ CLI やプレーンな形式で使いやすい、テキスト版チェックリストです。
■ 純粋関数(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 などで失敗を表現しているか?
- [ ] エラー処理が関数合成の一部として管理されているか?
■ テストのしやすさ
- [ ] 関数は小さく、純粋で、単体テストしやすいか?
- [ ] 状態や副作用に依存せずに検証できるか?
■ 状態の明示的な管理
- [ ] 状態の変化が明示的に設計されているか?
- [ ] ストリームやデータ構造を用いて管理されているか?
- [ ] 暗黙の共有状態を避けているか?