関数型プログラミングとDIコンテナは相性が悪いのでしょうか? 私は仕事で TypeScript を用いた Web API バックエンドの開発をしています。これまで依存性注入が必要な場面では InversifyJS や TSyringe 等のDIコンテナライブラリを使用して依存性注入を行ってきたのですが、DIコンテナライブラリはクラスに対するDIを前提としており、これを使用すると必然的にオブジェクト指向プログラミングをせざるを得ません。 しかし最近 Google のAPIクライアント等が徐々にオブジェクト指向から関数型で作られたモジュラーSDKに移行していることに気づき、業界全体的に関数型プログラミングに移行するトレンドなのかと考えています。しかし全ての関数の引数が増えたコードはリファクタリングが大変そうに見え、あまりスマートではないような気もしてしまいます。それでも、これから先はこのトレンドに即してDIコンテナに頼らない関数型プログラミングのコード書いていくべきなのでしょうか。

 相性というよりもDIコンテナ自体がそもそもオブジェクト指向プログラミング「言語」を前提として作られた技術であるということをまず書いておきたいと思います。「DIという考え方」は関数型プログラミング言語でも応用できるかもしれませんが、「DIコンテナ」はオブジェクト指向言語(特にクラスがある言語)特有のものと言えます。

 また、業界全体が徐々に関数型的に作られたライブラリなどに移行しているという潮流は確かに感じますが、別にオブジェクト指向プログラミングができなくなることを意味しません。というのは、そもそも関数型プログラミングとオブジェクト指向プログラミングは別に相反するものではないからです。

 たとえば、Javaでもセッターなどの副作用を使わないプログラミングスタイルは「関数型プログラミング」ですし、いわゆる関数型プログラミング言語でもオブジェクト指向プログラミングをすることはできます。パラダイムと言語はある程度独立しているということに注意してください。

 その上で言うと、DIコンテナという「ソフトウェア」は現状、オブジェクト指向言語(JavaやJavaScriptなど)でしか提供されていないので、DIコンテナがない言語ならその言語での作法を踏まえるべきです。一方、Javaで関数型プログラミングをするとしても、DIコンテナが有効であれば特に躊躇する必要はありません。DIという考え方の根底にある「依存性を外から注入する」という思想自体は別に関数型プログラミングと相反するものではありませんから。 

 プロジェクトでDIコンテナを使わないという方針で行くのならそれに従うべきだと思いますが「DIコンテナ」について特別避けようと意識しなくても良いかと思います。

2023/01/28Posted
Loading...
Send anonymous messages to kmizu
0 / 20000

Please read and agree to the Terms of Service and Privacy Policy before using.

Loading...