2016-05-06 4 views
4

私はいくつかの方法で作成することができるデータセットを持って、そのうちの一つは、いくつかのテキストを解析することによって、他の方法は、CSV形式からです、第三の方法はですそれをデータベースからインポートします。何パターン、この場合に使用するには(インタフェースの実装)

現在のところ、これはインターフェイスです:

public interface IMyDataMaker 
{ 
     public MyDataSet MakeData(); 
} 

と、これはテキストパーサクラスです:

public class MyDataSetTextParser : IMyDataMaker 
{ 
     private readonly string textToParse; 
     public MyDataSetTextParser(string text) 
     { 
      textToParse = text; 
     } 

     public MyDataSet MakeDate() 
     { 
      // parse the text and return the dataset 
     } 
} 

のCSVパーサはテキストパーサに近い、これはデータベースクラスです:

public class DbMyDataSetMaker : IMyDataMaker 
{ 
     private readonly SqlConnection connection; 
     public DbMyDataSetMaker(SqlConnection sqlConn) 
     { 
      connection = sqlConn; 
     } 

     public MyDataSet MakeDate() 
     { 
      // connect to the db and make the dataset 
     } 
} 

この場合、これは正しいパターンですか?

+2

この場合、戦略はうまくいくでしょう。 –

+0

これは正しいアプローチですが、それだけではありません。戦略は、実行時にアプリケーションの動作を変更する必要がある場合には非常に便利ですが、特に戦略に1つのメソッドしかない場合は、デリゲートを使用することもできます。 'パブリック静的クラスMyDataMakerBehaviourFactory {パブリック静的のFunc (INT基準)を作成 {//が設け基準に従ってデリゲートを作成します。 } } ' コード内のどこかに: ' var func = MyDataMakerBehaviourFactory.Create(criterion); func.Invoke(); ' –

答えて

2

うん、それは絶対にそれを行うには正しい方法です。コンストラクタを使用して、各サブタイプの接続情報を分離し、あなたがやったのと同じように、共通の 'read'メソッドで終了します。ただ、あなたの目標のあなたの説明で行く

1

、これは正しいアプローチのように見えます。これは、オブジェクト指向の設計ほど優れた設計パターンではありません。クリーンな方法でデータソースをどのように相互作用させるかを記述する抽象基本クラス/インタフェースがあります。消費するクラスは、基礎となる実装またはデータソースを気にすることなく、与えられた任意のIMyDataMakerを使用できます。 "多態性"はそれにふさわしい単語です。

3

これは本当に良いと思います。これは古典的なStrategyの実装です。

あなたは今、あなたが必要とするインタフェースの1つのインスタンスを受け取るために dependency injectionや作成方法により実際の実装を選ぶことができます。

1

すでに我々の仲間の同僚で述べたようにはい、あなたのアプローチは正しいです。しかし、私はここに何かを追加したいと思います。

同じように抽象クラスを使用できます。

public abstract class MyDataMaker 
{ 
    public abstract MyDataSet MakeData(); 
} 

ここで、インターフェイスではなくこの抽象クラスから継承することができます。これも正しい設計でなければなりません。どのシナリオでどのデザインを選択するのかという疑問が生じますか?

1インターフェイスオプションを使用すると、インターフェイスを実装している任意のオブジェクトが来てパーティに参加できるようになります。あなたは絶対にその包含を支配しません。普遍的なアプローチです。私たちは、抽象オプションを使用する場合

2は、我々は、それが元であるソースから知っているので、パーティーに参加したいオブジェクトの上にある程度の制御を持つことになります。つまり、MyDataMakerから継承する必要があります。あなたは抽象的なことができるようにしたい場合は、いくつかのビットとピースのいくつかの内部、民間または公共の実装を行うことができます。

非常に主観的な問題があり、目的を完全に明確にする必要がある場合に、どちらが適切なのですか。

はい、あなたが構造を継承することができないので、構造が唯一のオプションなので、抽象的なオプションが出てきます。

+1

そして、実装のすべてまたは一部が共有する必要のあるコードがある場合は、両方を行うことができます。クライアントコードのインタフェースを使用すると、それを使用しているのは 'IDataMaker'だけです。そして、 'DbDataMaker'が派生できる' CreateDataSet'や 'AddColumn'のように、皆さんが必要とする保護されたメソッドを実装する抽象的な' DataMaker'を作成することができます。また、_that_のサブクラスを作成することもできます。これは、テキストとCSVの実装が派生するテキスト解析を処理する 'TextDataMaker'です。 [1/2] – CompuChip

+1

これは、1つのインターフェース、抽象クラスのツリー、および下にあるコンクリートクラスの1つのみのレイヤーを提供します。もちろん、これをやり直して、必要のないすべてのインターフェイスの抽象クラスを作成しないでください。 [2/2] – CompuChip

+0

@CompuChipあなたは本当にあなたのコメントでスポットです。それを超過しないことが鍵です。それは私が主観的だと強調したことです。私は一度すべての答えを読んで、あなたはこのセッションのプログラミングでキャリアを始めたばかりなので、ここで答えたすべての人におめでとう、本当の頭出しを与えることができます。 –

関連する問題