私はここで男子学生の間違いを犯したのではないかと疑い、明確化を求めています。私のソリューションの多くのクラス(C#)-あえて過半数を言う-私は対応するインターフェースを書くことになりました。たとえば、「ICalculator」インターフェースと、それを実装する「Calculator」クラス。ただし、その計算機を別の実装に置き換えることは決してないでしょう。また、これらのクラスのほとんどは、依存関係と同じプロジェクトに存在します。実際に必要なのはinternal
、必要なだけですが、public
それぞれのインターフェイスを実装する副作用として存在することになりました。
すべてのインターフェイスを作成するこのプラクティスは、いくつかの偽りに起因すると思います。
1)元々、ユニットテストモックを作成するにはインターフェイスが必要だと思っていました(私はMoqを使用しています)が、その後、そのメンバーがvirtual
であり、パラメーターのないコンストラクターがある場合、クラスをモックできることがわかりました(私が間違っている)。
2)IoCフレームワーク(Castle Windsor)にクラスを登録するにはインターフェースが必要だと当初考えていました。例えば
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
実際、私はそれ自体に対して具体的な型を登録することができました:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3)依存性注入のコンストラクタパラメーターなどのインターフェイスを使用すると、「疎結合」になります。
それで、私はインターフェースに夢中になりましたか?!私は、あなたが「通常」インターフェースを使用するシナリオを知っています。例えば、パブリックAPIを公開したり、「プラグイン可能な」機能のようなもののために。私のソリューションには、そのようなユースケースに適合する少数のクラスがありますが、他のすべてのインターフェースは不要であり、削除する必要があるのでしょうか?上記の3)に関して、これを行う場合、「疎結合」に違反しませんか?
編集:-Moqで遊んでいるだけであり、それらをモックできるようにするには、メソッドがパブリックで仮想であり、パブリックのパラメータレスコンストラクターを必要とするようです。それで、私は内部クラスを持つことができないように見えますか?