依存関係の注入から依存関係の排除へ
2025-06-17 10:00:25
原文: From dependency injection to dependency rejection by Mark Seemann
オブジェクト指向プログラミングにおいて依存関係の注入で解決される問題は、関数型プログラミングではまったく異なるアプローチで解決されます。
数年前、私は『Dependency Injection in .NET』という本を執筆し、2011年に出版されました。この本では C# を用いた例を紹介していますが、それ以来、私は関数型プログラミングにますます興味を持つようになり、現在では F# を主な使用言語と考えています。
このような背景もあって、「関数型プログラミングでは依存関係の注入をどのように行うのか?」とよく尋ねられます。
他の方による「部分適用は依存関係の注入と同等である」といった説明を何度か目にしたことがあります。この短い記事シリーズでは、それがなぜ正しいのか、そしてなぜ「関数型的ではないのか」を解説します。そのうえで、ロジックと(副)作用を分離する関数型の代替手段も紹介します。
(John Muellerleile 氏と Igal Tabachnik 氏による コミック )
関数型プログラミングにおいて Free モナドを使って依存関係の注入を行う、という考え方の流派もあります。
とはいえ、そこまで複雑にしなくても、たいていは十分対応できます。
私の経験では、ユニット(関数やモジュールなど)を、直接の入力と出力だけを受け取るようにリファクタリングし、不純/純粋/不純の「サンドイッチ」 構造に組み立てれば、たいていのケースで対応可能です。後ほどその例をご覧いただきます。
この記事シリーズは以下のような構成です:
最初の3本の記事では、私のお気に入りのシナリオの一つである「オンラインでのレストラン予約」を題材にしています。実際のクライアント例は、私の Pluralsight 講座『Functional Architecture with F#』 でもご覧いただけます。少し古いですが、クライアントのソースコードは GitHub で公開しています。また、本記事シリーズに対応する F# および Haskell によるサーバーサイドのサンプルコードも GitHub にて公開中です。
このシナリオでは、レストランの予約情報を表す JSON ドキュメントを受け取る HTTP ベースの API を実装するという課題に取り組みます。
第4回「純粋なインタラクション」は、Free モナドを扱う別の連載記事への入口でもあります。
最後に念のためお伝えしておきますが、本記事シリーズでは、オブジェクト指向のパターンとしての依存関係の注入を否定しているわけではありません。オブジェクト指向プログラミングにおいて、依存関係の注入は疎結合やテストのしやすさを実現するための、よく知られた、そして広く解説された手法です。次回の記事では、C# における依存関係の注入を簡単におさらいします。
次回: 依存関係の注入とは引数を渡すこと