2012-02-15 7 views
0

まずで書かれた既存のアプリケーションを構成し、これは設計上の問題ではなく、問題です:は、すべてのC++

私はC++で書かれた既存のアプリケーションを持っています。

構造は以下の通りである:私は今、現在のアーキテクチャを変更させていただいておりますが、外部からのすべての手順を設定するために必要とされる

class Step1 
{ 
    public: 
     Step1(); 
     void process(); 
     void setValue(int v); // is to change the value 
    private: 
     int value; 
} 

class Step2 
{ 
    public: 
     Step2(); 
     void process(); 
     void setValue(int v); // is to change the value 
    private: 
     int value; 
} 

void main() 
{ 
    Step1 step1(); 
    Step2 step2(); 

    step1.setValue(1); 
    step2.setValue(2); 

    step1.process(); 
    step2.process(); 
} 

。私は、構成設定を保持するXMLファイルを作成することを提案しています:

<?xml version="1.0"?> 
<Steps> 
    <Step id="step1"> 
     <param method="setValue" variable="v" value="1" /> 
    </Step> 
    <Step id="step2"> 
     <param method="setValue" variable="v" value="2" /> 
    </Step> 
</Steps> 

そして私は、XMLファイル解析するクラスを追加します。

クラスXMLPARSER { 公共: XMLPARSERを(); int parse(文字列xmlファイル、文字列paramValue); }

その後、私は私が唯一のメインクラスを変更すると思います:

void main() 
{ 
    Step1 step1(); 
    Step2 step2(); 

    XmlParser xmlParser(); 

    step1.setValue(xmlParser.parse(,)); 
    step2.setValue(xmlParser.parse(,)); 

    step1.process(); 
    step2.process(); 
} 

私は20の以上のステップを持っており、すべてのステップで設定される約10の方法があります。この方法でアーキテクチャを変更して、XmlParserクラスがXMLファイルを解析し、その値をステップの設定メソッドに渡すことをお勧めします。それとももっと良い方法がありますか?

私はあなたの意見を知りたいと思います。

ありがとうございます。

+0

XMLは、データが別に存在するという意味で、コードが複数の構成になりしかし、それはxmlを解析する少しオーバーヘッドを追加します。それはあなたの主な目的はデザインの変更に依存します。 –

+0

私の目的は、外部からアプリケーションを構成可能にすることです。したがって、xmlを導入して構成設定を保持し、xmlParserクラスを追加しました。はい、私はxmlParserのparse()メソッドが非常に複雑で読みにくいことにあなたに同意します。何をお勧めしますか?前もって感謝します。 – olidev

+2

あなたのアプリケーションを外部から設定できるようにする場合は、xmlを使用することをお勧めします。xml解析を別のクラスにカプセル化することも良いアイデアです。また、いくつかのオープンソースのxml解析ライブラリを使用して、あなたは正しいアプローチをしています。すべて最高です。 –

答えて

1

私はすでにこの問題に直面しており、私は何か似たようなことをしています。私はそれが最も合理的な解決策だと思う。処理クラスのインスタンスを作成して設定するには(例では、ステップ)、メインサブルーチン/クラスを担当する必要があります。

1つの問題はXMLを解析することです。現在のソースコードを混乱させる可能性があります。これを防ぐには、構文解析、エラー処理、および設定のデフォルト値を担う「設定」クラスを作成する必要があります。 Configurationクラスインターフェイスの

簡単な例:

class Configuration { 
public: 
    // basic configuration 
    Configuration(); 
    // parsing, DTD validation 
    void parse(const std::string& filename); 
    // get some value 
    // you can provide default value if necessary 
    // or you can have some more robust accessing methods 
    // depends on complexity of your settings 
    int getSomeValue(int default); 
    ... 
}; 

メインサブルーチンは、構文解析のもので満たされていない:

void main() 
{ 
    Configuration config; 
    config.parse("path/to/config.xml"); 

    Step1 step1(); 
    Step2 step2(); 

    int someValue = config.getValue(5); 
    step1.setSomeValue(someValue); 
    ... 

    step1.process(); 
    step2.process(); 
    ... 
} 
0

dependency injectionを使用してください。

あなたがオブジェクトのステップにXmlParserを渡すことにした場合、その後、あなたの例は次のようになります。あなたのユニットテストのステップオブジェクトにモックオブジェクトを渡すことができるので、

int main() 
{ 
    XmlParser xmlParser(); 

    Step1 step1(xmlParser); 
    Step2 step2(xmlParser); 


    step1.setValue(); 
    step2.setValue(); 

    step1.process(); 
    step2.process(); 
} 

これは、良いです。

+0

しかし、このアプローチでは、ステップのコンストラクタを変更するか、既存のステップクラスのサブクラスを導入する必要があります。そうですか?私はあなたがsetValue()メソッドをどのように行うのだろうかと思います。 – olidev

+0

@devnはい、setValueメソッドの代わりにコンストラクタを変更してください。 setValueの中で、xmlファイルを解析して値を設定します。 –

関連する問題