0

これが私のシナリオです。ユーザーが私のソフトウェアでドキュメントを選択すると、私のソフトウェアがドキュメントからいくつかの重要なデータを抽出します。ソフトウェアは2種類のフォーマットを処理します。PDFとDOCX。これらのタイプごとに、いくつかのテンプレートがあり、アップロードされたドキュメントはこれらのテンプレートの1つに属していると想定されます。これがよく知られた問題であるかどうか、そしてこのシナリオを解決するための確立されたデザインパターンが存在するかどうかはわかりません(そのため、私はSOを使用しています)。これまでに私が設計したものは次のとおりです。

テンプレートごとに特定の構造/コンテンツがあるため、テンプレートごとに個別のクラスを作成することを考えています。IExtractorと呼ばれるトップレベルのインターフェイスがあり、次にPdfExtractorとDocxExtractorと呼ばれる2つのトップレベルのクラスがあり、それぞれがIExtractorインターフェイスを実装します。すべてのPDF(またはDOCX)テンプレートに共通する機能はすべて、これらの親クラスに入ります。

これらの2つの親クラスの下には、テンプレートごとに1つずつ、いくつかのテンプレートクラスがあります。たとえば、PdfExtractorを継承するTemplate571_PdfExtractorというクラスには、テンプレート571に固有のメソッドがありますが、他のエクストラクタと同じ形式で結果を提供します。

それが重要な場合は、C#4.0を使用しています。スケルトンは次のとおりです。

インターフェース:

interface IExtractor
{
void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill);
}

2つの親クラス:

public class DocxExtractor : IExtractor 
{
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill)
    {
    }
}

public class PdfExtractor : IExtractor 
{
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill)
    {
    }
}

具体的なクラスの1つ:

public class Template571_PdfExtractor : PdfExtractor
{
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill)
    {
    }
}

今、私がよくわからないいくつかの重要な質問があります。それらはすべて、具象(テンプレート)クラスのオブジェクトをインスタンス化する方法と場所がわからないという問題を中心に展開しています。ファイル拡張子を使用して、PdfExtractorツリーノードまたはDocxExtractorノードのどちらを下に移動する必要があるかを判断できます。その後、ユーザーのドキュメントが属するテンプレートを教えてくれるのはファイルの内容です。では、この「決定」コードはどこに置くのでしょうか。私のアイデアは、それをPdfExtractorクラス(または、さらに言えばDocxExtractor)に入れることでした。それは正しい方法ですか?

少し長くなって申し訳ありませんが、自分の状況を完全に説明する方法がわかりませんでした。あなたのアイデアをありがとう。

Shujaat

4

1 に答える 1

1

デザインパターンなどを深く掘り下げると、ほとんどの場合、何かを実装する正しい方法が1つもないことが確実にわかります...

考えられる方法の1つは、いわゆるファクトリクラスを作成することです。1つはPdfExtractors用で、もう1つはDocXExtractors用です。各ファクトリクラスには、おそらく次のような単一の静的メソッドがあります。

public final class PdfExtractorFactory {
   public static PdfExtractor getExtractor(String filename) { ... }

   ... // constructor, or singleton getter here
}

返すPdfExtractorインスタンスの具体的なサブクラス(つまり、使用するテンプレート)を決定するロジックは、ファクトリメソッドに存在します。このように、抽象基本クラスPdfExtractorもそのサブクラスも、この決定ロジックで乱雑になることはありません。ファクトリクラスのみがPdfExtractor(またはDocXExtractor)のサブクラスについて知る必要があり、ファクトリはスーパークラスのインスタンスを渡すため、残りのコードは具体的なサブクラスをまったく認識しません。

PdfExtractorFactoryとDocXExtractorFactoryのインスタンスが1つだけ必要になる可能性が高いため、これらのファクトリクラスをシングルトンとして実装することを選択できます。

更新:もちろん、静的ファクトリメソッドまたはシングルトンパターンと静的ファクトリメソッドのいずれかを使用できます(ただし、両方は必要ありません)。

于 2012-07-24T14:08:22.693 に答える