2016-10-05 5 views
1

私は、そう私を修正し、正しい用語の私の不足を言い訳してください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)を変更した - のアプローチは、それは同じではないということはかなり明白である

おかげ

+0

2番目のコードスニペットではまだカバーされていないものは何ですか? –

+0

このアプローチは、同じではないことがかなり明白です。List GetModules(ViewType viewType)をList GetModules()に変更しました。あなたは今モジュールのために1つのクラスを要求していませんが、あなたは2つのクラスの間で決定する必要があります。これは「鶏や卵」の問題です。 – Enigmativity

+0

戦略パターンを参照してください。これは通常、switch文に対する答えです – Nkosi

答えて

0

。あなたは今モジュールのために1つのクラスを要求していませんが、あなたは2つのクラスの間で決定する必要があります。これは「鶏や卵」の問題です。

代わりに、ツリーノードの構築方法を動的に決定する方法を導入する必要があります。ここで

はアプローチです:あなたはModuleProviderを作成するとき

public class ModuleProvider 
{ 
    private Dictionary<ViewType, Func<List<ITreeNode>>> _factory; 

    public ModuleProvider(Dictionary<ViewType, Func<List<ITreeNode>>> factory) 
    { 
     _factory = factory; 
    } 

    public List<ITreeNode> GetModules(ViewType viewType) 
    { 
     return _factory[viewType](); 
    } 
} 

あなたはツリーノードを生成するために、工場の辞書に注入しています。アセンブリを再コンパイルせずに無数の方法でその辞書を構築することができます。

関連する問題