12

テスト可能なC#コードを作成するために、私はDIを多用します。

しかし最近、私はIronPythonをいじり回していて、任意のメソッド/クラス/関数などをモックできるので、DIの必要性がなくなっていることがわかりました。

これはPythonなどの動的言語の場合ですか?

それ以外の:

class Person(Address) {
...

あなたが持つことができます:

class Person() {
...
    // Address initialised in here.

動的言語の場合、したがって動的言語の手動DIに従う必要はありません。

これについて何かアドバイスはありますか?

4

4 に答える 4

10

依存性注入は、物事をどのように結び付けるかということでもあります。これは、依存するオブジェクトのモック可能性とは何の関係もありません。ある種の接続Fooを必要とするインスタンスを直接インスタンス化することと、接続がある限りその接続を取得する方法を完全に無視することに違いがあります。Bar

依存性注入を使用すると、テスト容易性向上します。しかし、その逆は真実ではありません。何でも上書きできることによるより簡単なテスト容易性は、依存性注入の他の利点をもたらしません。これらの理由から、Python用の多くのコンポーネント/DIフレームワークが利用可能です。

于 2009-12-24T01:02:21.017 に答える
10

依存性注入は動的型付け言語では必要ないというあなたの声明には強く反対します。DI が有用で必要な理由は、言語の型付け規則とは完全に無関係です。

主な違いは、動的型付け言語での DI は簡単で痛みがないことです。重いフレームワークや膨大な行の XML 構成は必要ありません。

たとえば、Ruby には 2 つの DI フレームワークしかありません。どちらも Java プログラマーによって書かれました。2 つのフレームワークはどちらも、1 つのプロジェクトでは使用されません。それらのフレームワークの作成者によるものでさえありません。

しかし、DIはRubyのいたるところで使われています。

これら 2 つのフレームワークの作成者である Jamis Buck は、 RubyConf 2008 で、 Recovering from Enterpriseというタイトルで、これらのフレームワークを作成した方法と理由、およびそれが悪い考えである理由について講演しました。読みたい場合は、付随するブログ投稿もあります。(彼が「Ruby」と言うたびに「Python」に置き換えるだけで、すべてが同じように有効になります。)

于 2009-12-24T01:24:39.920 に答える
0

もう一度やってみます。私の最後の回答は、質問を1マイルも見逃しており、トピックから大きく外れていました。

疑似コードを使用すると、依存性注入は次のように言います。

class Person
  def Chat() { 
    someOperation("X","Y","Z")
  end
end
...
Person.new().Chat()

とで:

class Person
  initialize(a,b,c)
    @a=a
    @b=b
    @c=c
  end
  def Chat()
    someOperation(@a,@b,@c)
  end
end
...
Person.new("X","Y","Z").Chat()

、.、そして一般的には、SCM の目的でオブジェクトと呼び出しを別のファイルに入れます。

「X」、「Y」、または「Z」がモック可能かどうか (...代わりにオブジェクトだった場合...(!)...(!)...) は、DI が良いかどうかとはまったく関係ありません。 . 本当。:-)

Jörg が言うように、DI は、他の多くのタスクと同様に、Python や Ruby で簡単に実行できます。また、もちろん、定数とアダプターをモデルとグローバル定数に取り込む必要があるという文化や傾向も少なくなります。

私にとって実際的に言えば、DI は、これらのアプリケーション パラメーター、API 定数、およびファクトリを個別のファイルに分離して、リビジョン追跡レポートがスパゲッティのように見えないようにするための最初のステップです (「構成を変更するために、AppController で追加のチェックインが行われたか. .? または、コードを更新するには...?") より多くの情報を提供し、より読みやすくします。

私の推奨事項:DIを使い続けてください... :-)

于 2009-12-27T20:39:14.617 に答える
-2

あなたはベストプラクティスについてのように見えますが、実際には実行時のパフォーマンスについての質問を提示していると思います。

依存性注入を取り除きますか?ソフトウェアリリースマネージャーはどのようにして夜眠ることができますか?

実行する関数のテストは、プログラムを確実に1つか2つの速度で遅くする必要があります。

// my generic function entry point - IronPython
if func="a":
  ...
if func="b":
  ...
if func="c":
  ...

クラスで標準のPythonを使用することも、関数ポインタを関数ポインタメンバーに割り当てることもできます。どんな獣なのか…?分かった分かった。Python定義するのは難しいと思いますが、気に入っています。そして、私は依存性注入が好きで、高く評価しています。私が長い間、そのような長い名前を練習に割り当てようと思っていたわけではありません。

于 2009-12-24T01:12:32.797 に答える