2016-09-22 22 views
0

昨日、私の友人の一人が、車の速度を返すプログラム(依存性注入を実装しなければならない)を作成するように頼んだ。そこで、私はコンストラクタインジェクションを実装するのに疲れた小さなプログラムを作成しました。依存性注入:コンストラクタ注入を使用

class Program 
{ 
    static void Main(string[] args) 
    { 
     Maruti objMaruti = new Maruti(); 
     clientClass obj = new clientClass(objMaruti); 
     obj.getSpeed(); 
    } 
} 

public class clientClass 
{ 
    ISpeed _ISpeed; 
    public clientClass(ISpeed obj) 
    { 
     this._ISpeed = obj; 
    } 

    public int getSpeed() 
    { 
     return _ISpeed.Speed(); 
    } 

} 

public interface ISpeed 
{ 
    int Speed(); 
} 

public class Maruti : ISpeed 
{ 
    public int Speed() 
    { 
     return 200; 
    } 
} 
public class Audi : ISpeed 
{ 
    public int Speed() 
    { 
     return 400; 
    } 
} 
public class BMW : ISpeed 
{ 
    public int Speed() 
    { 
     return 600; 
    } 
} 

ここで、メインメソッドで、私の友人は車の速度を確認できます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Maruti objMaruti = new Maruti(); 
     clientClass obj = new clientClass(objMaruti); 
     obj.getSpeed(); 
    } 
} 

私はこのコンストラクタInjectionとクライアントクラスを作成した理由について質問しました。クラスを直接呼び出すと結果が得られます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Maruti objMaruti = new Maruti(); 
     objMaruti.Speed(); 

     //If user wants to check Audi Speed. 
     Audi objAudi = new Audi(); 
     objAudi.Speed(); 
    } 
} 

彼は正しいですか?どちらの方が最善で、なぜですか?

+0

彼の次の質問は、あなたが手続き型プログラミングまたは関数型プログラミングを使用できるので、なぜOOPを使ったのですか?これは依存性逆転の例です。 –

+0

この例は、引数として 'ISpeedUsingProvider'を受け入れると良いでしょう。 'clientClass'はどこかの' .getSpeed() 'メソッドを使いますが、' Speed() 'メソッドはありません。上で述べたように、あなたが書いた例は、依存関係の逆転の例です。 – ntohl

答えて

0

あなたの友人があなたにこの質問をするのが貧弱な命名だと思います。あなたは別の車の速度を記録する必要があった場合はどうなりますか?クライアントクラスは限りオブジェクトは、パブリックインターフェイスでSpeed方法を持っているとして、任意のオブジェクトの速度を記録することができ、この名前

public class SpeedLog 
{ 
    ISpeed speed; 
    ILogger logger; 
    public SpeedLog(ISpeed speed, ILogger logger) 
    { 
     this.speed = speed; 
     this.logger = logger; 
    } 
    public void Information() 
    { 
     logger.Information($"{speed.GetType().Name} is running with {speed.Speed()}"); 
    } 
} 

このクライアントクラスを持っているでしょう。 ISpeedインターフェイスは、Speedメソッドのシグネチャを定義する機会を私たちに提供します。 SpeedLogタイプは、MarutiまたはAudiのような特定のタイプに依存しません。また、ベースタイプCar(存在する場合)を使用して速度情報を取得することもできます。 SpeedLogは、ISpeedインターフェイスを実装するタイプがStarの場合、星の速度を記録できるようになりました。新しいStarタイプを追加するときは、このタイプのライブラリとSpeedLogタイプのライブラリをそのままコンパイルする必要があります。 Inversion of Controlライブラリに、Starオブジェクトを注入するように要求された場合に注入できるようになりました。