デカップリング
プログラミングと設計では、これは通常、可能な限り少ない依存関係で再利用可能なコードを作成する行為です。
このコンテキストでのファクトリパターン
ファクトリパターンを使用すると、オブジェクトを定義しなくてもオブジェクトを作成できる一元化されたファクトリがあります。それはオブジェクトの定義次第です。
抽象とインターフェース
インターフェース
インターフェイスを定義することは、推論に軽量タイプを使用できるようにし、すべての継承クラスが従わなければならない青写真を提供するため、ベストプラクティスです。たとえば、メソッドIDisposable
を実装する必要があります。継承する各クラスがメソッドの独自の関数を定義するため、Dispose
これはインターフェイスから切り離されていることに注意してください。IDisposable
Dispose
概要
Abstractは、継承と推論に使用されるという点でインターフェイスに似ていますが、すべてのクラスが継承する定義が含まれています。すべての自動車の範囲で何かがエンジンを持っているので、自動車の優れた抽象クラスには、エンジンの事前定義されたメソッドのセットを含めることができます。
編集
説明
ここでは、インターフェースと抽象クラスを使用した継承の簡単な例を示します。デカップリングは、インターフェイスが抽象クラスに継承され、そのメソッドがカスタマイズされたときに発生します。これにより、クラスは抽象クラスを継承し、インターフェースと同じタイプを維持できます。利点は、期待される型が元のインターフェースである場合に、抽象クラスを継承するクラスを使用できることです。
デカップリング
この利点により、期待されるインターフェースに準拠する任意の実装を使用できます。そのため、さまざまなオーバーロードを書き込んで渡すことができます。その一例を次に示します。
例
インターフェイス定義
public interface IReady
{
bool ComputeReadiness();
}
継承
public abstract class WidgetExample : IReady
{
public int WidgetCount { get; set; }
public int WidgetTarget { get; set; }
public bool WidgetsReady { get; set; }
public WidgetExample()
{
WidgetCount = 3;
WidgetTarget = 45;
}
public bool ComputeReadiness()
{
if (WidgetCount < WidgetTarget)
{
WidgetsReady = false;
}
return WidgetsReady;
}
}
public class Foo : WidgetExample
{
public Foo()
{
this.WidgetTarget = 2;
}
}
public class Bar : IReady
{
public bool ComputeReadiness()
{
return true;
}
}
デカップリング
public class UsesIReady
{
public bool Start { get; set; }
public List<string> WidgetNames { get; set; }
//Here is the decoupling. Note that any object passed
//in with type IReady will be accepted in this method
public void BeginWork(IReady readiness)
{
if (readiness.ComputeReadiness())
{
Start = true;
Work();
}
}
private void Work()
{
foreach( var name in WidgetNames )
{
//todo: build name
}
}
}
ポリモーフィズム
public class Main
{
public Main()
{
//Notice that either one of these implementations
//is accepted by BeginWork
//Foo uses the abstract class
IReady example = new Foo();
UsesIReady workExample = new UsesIReady();
workExample.BeginWork(example);
//Bar uses the interface
IReady sample = new Bar();
UsesIReady workSample = new UsesIReady();
workSample.BeginWork(sample);
}
}