免責事項:このプロジェクトで依存性注入を使用し、インターフェイスベースの設計を全面的に緩く結合したいと思いますが、このプロジェクトでは依存性注入の使用が打ち切られました。また、 SOLIDの設計原則(および一般的な設計パターン)は、私が仕事をしている場所では異質なものであり、私自身もそれらの多くに慣れていません。したがって、この問題に対してより良い設計を提案するときは、それを考慮に入れてください。
これは私が取り組んでいるコードの簡略化されたバージョンであり、そのため、それは不自然に見えるかもしれません。もしそうなら、私はお詫び申し上げます。次のクラスを検討してください。
// Foo is a class that wraps underlying functionality from another
// assembly to create a simplified API. Think of this as a service layer class,
// a facade-like wrapper. It contains a helper class that is specific to
// foo. Other AbstractFoo implementations have their own helpers.
public class Foo : AbstractFoo
{
private readonly DefaultHelper helper;
public override DefaultHelper Helper { get { return helper; } }
public Foo()
{
helper = new Helper("custom stuff");
}
public override void Operation1(string value)
{
Console.WriteLine("Operation1 using " + value);
}
public override void Operation2()
{
Console.WriteLine("Operation2");
}
}
// Helper derives from a default implementation and allows us to
// override it's methods to do things specific for the class that
// holds this helper. Sometimes we use a custom helper, sometimes
// we use the default one.
public class Helper : DefaultHelper
{
private readonly string customStuff;
public Helper(string value)
{
customStuff = value;
}
public override void DoSomethingHelpful()
{
Console.WriteLine("I was helpful using " + customStuff);
}
}
これらの2つのクラスが次のように使用されているとします。
// foo referenced and used in one part of code
var foo = new Foo();
foo.Operation2(); // or foo.Operation1();
// some other point in the program where we don't have a reference to foo
// but do have a reference to the helper
helper.DoSomethingHelpful();
しかし、私は今、 ?foo.Operation1
のいくつかの実装でも実行する必要があることがわかりました。helper.DoSomethingHelpful();
私が考えた潜在的な回避策は次のとおりです。
- fooとhelperに双方向の関係を持たせます。DoSomethingHelpfulでfoo.Operation2を呼び出すことができるように
- fooにIHelpインターフェースを実装させ、「ヘルパー」コードをfooに移動させます
- 委任を使用し、メソッドOperation2を
Action<string>
委任としてHelperのコンストラクターに渡します。
これらのアプローチはどれも理想的ではないようです(オプション1は好きではないと判断しましたが、後でさらに多くのデリゲートを渡す必要があることがわかった場合、オプション3の保守性について心配しています)。Helper
これは、 /Foo
コンボの初期設計に問題があるのではないかと思います。考え?