2017-08-10 4 views
-1

XMLを解析して特定の値を取得するメソッドを持つ既存のCalss MyParserがあります。現在、これはXPathを使用しています。C#クラスの既存の使用法を変更せずに新しいロジックを導入するデザインパターン

class MyParser 
{ 
    public Parse(xmldoc) { ... } 
    public GetProperties(...) { ... } 
    public Validate(...) { .... } 
} 

用法:

MyParser myParser = new MyParser(); 
myParser.Parse(); 
.... 

MyParser.GetProperties(...); 
.... 

MyPaser.Validate(...); 

クラスはXMLのために定義された何のスキーマがありませんでした設計されていたその時。このコードはすでに製品に含まれています。

このXMLの製品スキーマが定義され、XML構造も変更されました。製品の現在のバージョンでは、XMLを解析するためにSchemaクラス(XSDから生成されたクラス)を使用することにしました。

したがって、両方のXMLタイプの解析をサポートする必要があるロジックをサポートする必要があります。クラスをインスタンス化して使用する場所からコードを変更する必要はありません。 Myparserに渡されたXMLを識別するために、新しいスキーマに導入されたタグがあります。

私は、この構造化プログラミング方法を行うにはしたくない

以下のような条件を追加することによって、既存の解析方法を変更することができます。 OOPSの方法でこの問題に対処するための明確な設計パターンはありますか?

// code get version info from XML 

if(version exists and version == 2) 
{ 
    // existing code 
} 
else 
{ 
    // new code. 
} 

答えて

1

Factory Methodパターンは、インターフェース

interface IParser 
{ 
    public Parse(xmldoc) { ... } 
    public GetProperties(...) { ... } 
    public Validate(...) { .... } 
} 

既存の実装

class MyParser : IParser 
{ 
    //existing implementation - using xpath & so on 
} 

新しい実装

class NewParser : IParser 
{ 
    //latest implementation with xsd & dynamic 
} 
定義...理想的なフィットする

ファクトリメソッド

IParser GetParser(string version) 
{ 
    switch (type) 
    { 
     case "2": 
      return new MyParser(); 
     default: 
      throw new NewParser(); 
    } 
} 

使用:。GetParser( "2")Prase(XML)。

+0

答えていただきありがとうございます。私は、外部からXMLのバージョンを抽出するロジックを追加しないと考えています。このロジックをファクトリメソッド内に保持するのは正しいですか? –

関連する問題