2008-09-03 19 views
12

ダウンサイドはありますか?私は今それにほとんど依存しているように感じます。プロジェクトが一定の大きさを過ぎるたびに、標準パターンとのアレルギー反応をほとんど感じ、それを直ちにDependency Injectionフレームワークで再配線します。依存性注射中毒?

私が見つけた最大の問題は、それを学んでいる他の開発者にとって混乱を招く可能性があることです。

また、私が使用していた言語の一部であれば、もっと気分が良くなります。 Javaの場合、少なくともかなり軽量なライブラリが2つあります。

思考?悪い経験ですか?それともそれについて心配するのをやめるか?


[EDIT]日時:依存性の注入の説明自体

漠然としているため申し訳ありません

Martin Fowlerはおそらくこれまでのことよりもはるかに優れていると言います...努力を無駄にする必要はありません。

偶然、これはそれについての一点を確認しています。それはまだ広く実施されておらず、誰もがスピードアップしていないとチームと仕事をするときに障壁になりがちです。

答えて

1

私は考えることができる唯一のマイナス面は、一定の仮想呼び出しを通して小さなパフォーマンスの低下です:)

+0

小文字は72ポイントの文字と太字にする必要がありますか? –

2

あなたは依存性の注入が実際に自宅で一緒に遊んでこれらの私たちのために、何であるかを説明するためのリンクまたは2を追加してもらえますか? wikipedia articleは面白いですが、あまり啓発されていません。

+4

@Finglas、それはあったはずですが、この回答はコメントが実装される前に残されました。 – Blorgbeard

3

を、主要な欠点は、学習曲線(あなたが指摘するように)との潜在的です抽象化が追加され、デバッグがより難しくなりました(これは実際には学習曲線の一部でもあります)。

私にとって、DIは大規模で複雑なシステムに適しているようです。小さな一回限りのアプリでは、アプリがオーバーアーキテクトになる可能性があります。それが提供する価値を最大限補ってくれるものに固執してください。

4

私はIOで大きなビーバーですが、誰も理解していない膨大なXML設定ファイルがあるプロジェクトを見ました。したがって、xmlでのプログラミングに注意してください。

+0

XMLを介した依存性注入は、少なくとも私にとってJavaプログラマーに訪れた最大の悪です。デバッグが難しく、理解が難しく、保守が難しく、一般的にコードが非常に醜いものになる – nflacco

3

で最高の記事のひとつです。時間の経過とともにIoC技術はほとんどの開発者にとって第二の性質となると私は思っています。私はそれについて仕事でここにdevsを教えようとしています、そして、私たちがいつもやったように不自然に感じるので、私はそれを伝えるのが難しいと思っています。また、IoC初心者でも、新しいプロジェクトでも、さらに難しい時間を費やしています。 IDEを使用して依存関係を追跡し、全体が「一緒にハングアップする」方法を理解するのに役立ちます。その情報は、しばしば難解なXMLに書き込まれます。

4

また、使用していた言語の一部である であれば、もっと気分が良くなります。

FYI JDK 6の一部として非常に単純で機能的な依存注射があります。軽量で直接的な依存性注入が必要な場合は、それを使用してください。あなたがクラスに基づいてサービス(またはサービスの多くの実装)を要求することができますServiceLoaderクラス使用

package dependecyinjection; 
import java.util.ServiceLoader; 

public abstract class FooService { 

    public static FooService getService() { 
     ServiceLoader<FooService> loader = ServiceLoader.load(FooService.class); 

     for (FooService service : loader) { 
      return provider; 
     } 

     throw new Exception ("No service"); 
    } 

    public abstract int fooOperation(); 

} 

package dependecyinjection; 
public class FooImpl extends FooService { 
    @Override 
    public int fooOperation() { 
     return 2; 
    } 
} 

はどのようServiceLoaderが返され、サービスの実装を定義していますか?プロジェクトフォルダに

META-INF /サービスという名前のフォルダを作成し、dependencyinjection.FooServiceという名前のファイルを作成します。このファイルには、サービスの実装を示す行が含まれています。その場合、依存注射.FooImpl

これはまだ広く知られていません。問題は、このようなシステムは、コードから理解することができないということです

i = GetServiceOrInterfaceOrObject(...) 

+4

「依存関係注入」ではなく「サービスロケータ」と呼ばれるパターンではありませんか?両方の説明については、http://www.martinfowler.com/articles/injection.htmlを参照してください。 –

+0

このパターンを使用すると、開発者はサービスの隠された依存関係を把握しなければならないときに、狂気になるでしょう。 – mathieu

5

私はDIと持っている問題は、私はCOMとしてのようになります任意のコードを持っている同じ問題です。このサービスは、サービス/インタフェース/オブジェクトXが要求できるサービス/インタフェース/オブジェクトを定義するドキュメント[else]が必要です。このドキュメントは、維持するだけでなく、ソースとして簡単に利用できなければなりません。

文書がよく書かれていない限り、オブジェクト間の関係を見るのは容易ではありません。時には関係が時間的であるため、発見することがさらに困難になります。

私はKISSの原理が好きです。私は仕事に適切なツールを使用することを強く信じています。与えられたプロジェクトのDIの利点が、わかりやすいコードを書く必要性を上回る場合、それを使用するよりも。

+0

私はこの質問を復活させたように見えました。それは私ではありませんでした!それは私がそれを見つけたときにフロントページにあった=) – Tergiver