私は、そう私を修正し、正しい用語の私の不足を言い訳してくださいSOLIDを使用する新たなんですライブラリを使用しており、プロバイダを変更することなく拡張性の理由からOpen Closedの原則を使用したいと考えました。私はアップグレードの過程で午前:-)</p> <p>を学ぶために探しています必要に応じて
ライブラリの意図は、ビュータイプに基づいてモジュールのリストを提供することです。このタイプに基づいて、モジュールを検索するためのクエリおよび条件が異なります。以下は、現在のコードの簡体版である:
public class ModuleProvider
{
public List<ITreeNode> GetModules(ViewType viewType)
{
switch (viewType)
{
case ViewType.Classes
//build query here that returns List<TreeNode> for classes
return modules;
case ViewType.Queries
//build query here that returns List<TreeNode> for queries
return modules;
}
}
}
私は上記のような例については、switchステートメントを使用することは悪いことを読みました。なぜ私は、新しいViewTypeを追加する場合、GetModulesを変更する必要があるので、私は理解しています。
私は、GetModules関数を持つインターフェイスを作成し、次にQueryModulesクラスとClassModulesクラスのそれぞれのクラスを作成して特定のリストに戻す必要があると思います。しかし、私はこれをサポートするために上記のプロバイダをどのように変更する必要がありますか?私はこれにジェネリックスを使用する必要があると考えて正しいですか?
public interface IModuleProvider
{
List<ITreeNode> GetModules();
}
public class QueryModuleProvider : IModuleProvider
{
public List<ITreeNode> GetModules()
{
return new List<ITreeNode>() { new TreeNode() { Type = "Query Module" } };
}
}
public class ClassModuleProvider : IModuleProvider
{
public List<ITreeNode> GetModules()
{
return new List<ITreeNode>() {new TreeNode() { Type = "Class Module"}};
}
}
正しいトラックにはありますか? stackoverflowの巧妙なメンバーが与えることができるどんな助けも大いに感謝されます。あなたはList<ITreeNode> GetModules()
からList<ITreeNode> GetModules(ViewType viewType)
を変更した - のアプローチは、それは同じではないということはかなり明白である
おかげ
2番目のコードスニペットではまだカバーされていないものは何ですか? –
このアプローチは、同じではないことがかなり明白です。List GetModules(ViewType viewType)をList GetModules()に変更しました。あなたは今モジュールのために1つのクラスを要求していませんが、あなたは2つのクラスの間で決定する必要があります。これは「鶏や卵」の問題です。 –
Enigmativity
戦略パターンを参照してください。これは通常、switch文に対する答えです – Nkosi