2012-01-20 4 views
0

ファイルを読み込んで処理した後、変更をコミットするWindows Formsアプリケーションを作成しています。フォームイベントを別のオブジェクトにフックする

特定のオブジェクトと対話するフォームから「処理ボタン」をクリックすると、たとえばファイルの拡張子に応じてファイルが処理される特定のクラスによって処理されますそのタイプのファイル

アプリケーションアーキテクチャに関して、これを行うにはどうすればよいでしょうか?

+0

質問はかなり一般的です。投稿できるコードがありますか? –

+0

コードを投稿して申し訳ありませんが、私はコードを持っていますが、約9000行のコードが混乱しています:s、私は書き直します。アプリケーションはかなり複雑ですが、コアコンセプトは、私が与えた例のようなものです。 –

答えて

2

たとえば、.txtファイルはTextParserで処理され、.csvファイルはCSVParserで処理され、.docファイルはMSWordParserで処理され、その他はすべてGenericParserなどで処理されます。

まず、すべてのクラスに.Parse(ファイル)メソッドがあるように、インターフェイス、つまりIParserを作成することです。

次は、ファイル拡張文字列をクラスと突き合わせるタスクです。私にとって心に浮かぶのは辞書です。キーは文字列としてのファイル拡張子であり、その値はそのファイル拡張子のタイプのパーサーになります。処理を行う前に、サポートしたいすべてのファイル拡張子を辞書に入力します。

これが正常に動作することを前提にしています。 - 非常に多数のサポートされているファイル拡張子はありません。 パーサーの1つのインスタンスを繰り返し使用することができます - パーサーを新しく追加するのは特にコストがかかりません。言語がオブジェクトを新しいものにするために必要とするものを超えて、最小限の初期化が行われます。

+2

これは良いアイデアです。おそらく[Factory Method](http://www.blackwasp.co.uk/FactoryMethod.aspx)パターンを使用して、ファイル拡張子をFactoryMethodに渡すことによって 'IParser'から派生した型のインスタンスを作成しますか? –

0

私はFactoryパターンのようなものに行きます。

public interface IFileParser 
{ 
    void perse(string fileToParse); 
} 


    public static class FileParserFactory 
    { 
     public static IFileParser GetParser(string fileToParse) 
     { 
      FileInfo file = new FileInfo(fileToParse); 
      IFileParser parserToReturn = null; 

      switch (file.Extension.ToLower()) 
      { 
       case "csv": parserToReturn = new CSVFileParser(fileToParse); 
        break; 
       case "txt": parserToReturn = new TextFileParser(fileToParse); 
        break; 
      } 

      return parserToReturn; 
     } 
    } 
関連する問題