2017-05-12 30 views
0

を処理するデータを記述するとき、私はプログラミングに新しいですし、あなたの経験を必要とする問題に遭遇:私はデータのリストを持っているint型/列挙型

を。各データにはフォーマットがあります。 私は、データリストをスキャンし、そのフォーマットに従ってデータツリーを構築するBuilder Builderを持っています。 1.各データをint/enum値でバインドして、それが何であるかを記述し、Builderがint/enum値を調べて決定できるようにします。トークンを処理するためにはどの関数を使用すべきです。 2.各データをインターフェイスを実装する仮想関数でバインドし、仮想関数を呼び出してデータを処理します。

2番目の方法が優れているように聞こえます。しかし、私はそれにもいくつかの問題があります。 1.データをデータに変換するコードを埋め込んでも問題ありませんか?いつかBuilderクラスを変更する必要がある場合は、各データクラスを変更する必要がありますか? 2.いくつかのシナリオでは、協力者に2つのデータが必要です。方法2でこれを行うのは難しいです。

どちらが良いか教えてください。

方法1:

struct FormatedData 
{ 
    std::string data; 
    int format; 
}; 

class Builder 
{ 
public: 
    void build(std::list<FormatedData> *data_list) 
    { 
     for (auto it : *data_list) 
     { 
      switch (it.format) 
      { 
      case: 
       do something; 
       break; 
      default: 
       do something; 
       break; 
      } 
     } 
    } 
}; 

方法2:

class Builder; 

struct IIterface 
{ 
    virtual void dosomething(Builder*) = 0; 
}; 

class FormatedData :public IIterface 
{ 
    std::string data; 
    int format; 
    void dosomething(Builder*) override 
    { 
     .... 
    } 
}; 

class Builder 
{ 
public: 
    void build(std::list<IIterface*> *data_list) 
    { 
     for (auto it : *data_list) 
     { 
      it->dosomething(this); 
     } 
    } 
}; 

答えて

0

方法2優れてここ

は、いくつかの例のコードです。一部のコメント:

1)データを処理するためのすべての動作は、データを処理するためのクラスにカプセル化する必要があります。管理クラスのデータの種類に依存する条件文は存在しないはずです。

2)以前に定義されたクラスを変更せずに新しいオブジェクトを作成するために工場パターンを使用します。