Python では IoC / DI が一般的でないのはなぜですか? 質問する

Python では IoC / DI が一般的でないのはなぜですか? 質問する

ジャワ島情報化社会/DIIoC は、Web アプリケーション、ほぼすべての利用可能なフレームワーク、および Java EE で広く使用されている非常に一般的な方法です。一方、大規模な Python Web アプリケーションも多数ありますが、Zope (コーディングが非常に難しいと聞いています) を除けば、IoC は Python の世界ではあまり一般的ではないようです。(間違っていると思われる場合は、いくつか例を挙げてください)。

もちろん、Pythonで利用できる人気のJava IoCフレームワークのクローンもいくつかあります。スプリングパイソン例えば、どれも実際には使われていないようです。少なくとも、私はジャンゴまたはsqlalchemy+<insert your favorite wsgi toolkit here>のようなものを利用するベースの Web アプリケーションです。

私の意見では、IoC にはそれなりの利点があり、たとえば django-default-user-model を簡単に置き換えることができますが、Python でインターフェイス クラスと IoC を多用するのは少し奇妙で、''Python らしくない« ように見えます。しかし、IoC が Python で広く使用されていない理由について、もっと良い説明ができる人がいるかもしれません。

ベストアンサー1

実際のところ、 Python ではDI/IoC はそれほど珍しいものではないと思います。ただし、珍しいのはDI/IoCフレームワーク/コンテナです。

考えてみてください。DIコンテナは何をするのでしょうか?

  1. 独立したコンポーネントをまとめて完全なアプリケーションにします...
  2. ...実行時に。

「接続」と「実行時」には次のような名前があります。

  1. スクリプト
  2. 動的

つまり、DI コンテナーは、動的スクリプト言語のインタープリターに他なりません。実際、言い換えると、典型的な Java/.NET DI コンテナーは、ひどく醜い、場合によっては XML ベースの構文を持つ、非常に質の悪い動的スクリプト言語の粗悪なインタープリターに他なりません。

Python でプログラミングする場合、美しくて優れたスクリプト言語が利用できるのに、なぜ醜くて質の悪いスクリプト言語を使用するのでしょうか。実際、これはより一般的な質問です。ほとんどすべての言語でプログラミングする場合、Jython や IronPython が利用できるのに、なぜ醜くて質の悪いスクリプト言語を使用するのでしょうか。

まとめると、 DI/IoC の実践は、まったく同じ理由で、Python でも Java でも同様に重要です。ただし、DI/IoC の実装は言語に組み込まれており、非常に軽量であるため、完全に消えてしまうことがよくあります。

(ここで、例え話として少し余談をします。アセンブリでは、サブルーチン呼び出しはかなり重要な処理です。ローカル変数とレジスタをメモリに保存し、戻りアドレスをどこかに保存し、呼び出しているサブルーチンへの命令ポインタを変更し、終了時に何らかの方法でサブルーチンに戻るように手配し、呼び出し先が見つけられる場所に引数を配置する、などを行う必要があります。つまり、アセンブリでは、「サブルーチン呼び出し」はデザイン パターンであり、サブルーチン呼び出しが組み込まれた Fortran などの言語が登場する前は、人々は独自の「サブルーチン フレームワーク」を構築していました。サブルーチン フレームワークを使用していないという理由だけで、Python ではサブルーチン呼び出しが「一般的ではない」と言えますか?)

ところで、DIを論理的に結論づけるとどうなるかの例については、以下をご覧ください。ギラド・ブラチャニュースピークプログラミング言語そしてこの主題に関する彼の著作:

おすすめ記事