Functional core, imperative shell
関数的コア、命令的シェル
コアは中心
シェルは外殻
メソッドをユニットテストしやすくするための考え方
例えば、「記事を公開したら投稿者のフォロワーにメール通知する」機能があったとして
処理の内容は
- 記事の投稿者をDBから取得
- 投稿者をフォローしてるユーザー情報をDBから取得
- 対象者ごとに
- メールタイトルや本文組み立て
- メール送信
- 成功or失敗ログ
だとすると
I/Oが絡むものは全部シェル(外殻)に押し出したい
これでいうとメールタイトルや本文ぼ組み立て以外は全部I/Oがある
だから、こういう処理にする
【シェル】
- 記事の投稿者をDBから取得
- 投稿者をフォローしてるユーザーの情報をDBから取得
[メール送信対象ユーザーの情報を渡す]
↓
【コア】
- メール送信対象者のメアドや名前から、メールアドレスとメール本文のリスト作成して返す
↓
【シェル】 メールアドレスとメール本文のリスト一行ごとに
- メール送信
- ログ
この方法だと、コアの部分は他のサービスへの依存ゼロ、ということはつまり、モックゼロでテストできる
純粋関数というらしい
要件次第でコアがないこともあるらしいけど
ロジックらしきものがあるときはこんなふうに純粋化するといいかも
パズルみたいで面白いねぃ
関数型プログラミングの考え方らしいけどオブジェクト指向でも全然使えるって思ったぃ