2012-05-01 4 views
2

私はアレイに存在するかもしれない複数の処理単位を持っていて、それぞれが独自のパラメーターを持っています。私は、それがsolution to another questionとして示唆した後コンテキストパターンを用いて、各処理ユニットのパラメータを通信したいです。しかし、私はパターンのオンラインの簡単なC + +の例を見つけることができません。私はあなたの検査のために以下の簡単な実装を行いました。コードは正常に動作しコンパイルされますが、は正しくパターンを実装していますか?スタイル改良のためのすべての提案が大歓迎です。この「コンテキストパターン」の実装は正常ですか?

#include <iostream> 
#include <sstream> 

#include <map> 

class cParamsContext 
{  
    typedef std::map<std::string, float> myMap_t; //Make the return type of getter less wordy 
    myMap_t paramMap; 

public:    
    cParamsContext() 
    { 
     paramMap["a0"] = 1.f; 
     paramMap["a1"] = 2.f; 
    } 

    myMap_t const& getMap() const {return paramMap;} //Return read-only alias 
}; 

class cProcessUnit 
{ 
    float parameter; 
    int id; 

public: 
    cProcessUnit(cParamsContext &contextObj, int id_) : parameter (0.f), id(id_) 
    { 
     std::stringstream idStream; 
     idStream << id; 

     std::string key = std::string("a" + idStream.str()); 

     if(contextObj.getMap().find(key) != contextObj.getMap().end())   
      parameter = contextObj.getMap().find(key)->second; // https://stackoverflow.com/questions/10402354/using-overloaded-operator-via-an-accessor-function#10402452     
    } 

    float getParam() {return parameter;} 
}; 


int main(int argc, char *argv[]) 
{ 
    cParamsContext contextObj; 


    for (int nn=0; nn<3; nn++) 
    { 
     cProcessUnit temp(contextObj, nn); 
     std::cout << "Processing unit " << nn << " param = " << temp.getParam() << std::endl; 
    } 
} 

さらに、パラメータマップが変更された場合、各クラス内のパラメータを自分自身で更新できるようにする方法を提案できますか?あなたが興味を持っていた包み

出力は次のようになります。 。 。 。

Processing unit 0 param = 1 
Processing unit 1 param = 2 
Processing unit 2 param = 0 
+2

これは、コードレビューに行く必要があります。 –

答えて

1

これは有効な実装のようです。あなたのテストに合格しますか?私はこの特定の方法でコンテキストパターンを使用して経験はありませんが、それは私によく見えます。

値を更新するように、私は現在、私が割り当てられてきたプロジェクトでは非常に似た何かをやっていると私はObserver Patternを使用しています。 cParamsContextは、この場合にに観察だろう。私は、オブザーバパターンの実装をsignal/slot/event/delegate使っています。これまでのところ、それは私の仕事に不思議に思っていました。

+0

'cParamsContext'を観測可能に設定すると良いアイデアです。 +1 – learnvst

1

それが正常に動作しますように見えますが、ここではいくつかの提案されています

  1. は、よりパフォーマンスになるハッシュマップ/テーブルを使用することを検討してください。あなたが見ることができるものを増強してください。 std :: mapはパフォーマンスは良いですが、データセットに応じて、ハッシュテーブルがより効率的になる可能性があります。

  2. 、値をtemplatizing検討、または少なくともそれぞれのタイプとそれに対応するゲッター/セッターのためのマップを作成することにより、異なるタイプのを可能にします。今のように、使用されているパラメータは浮動するだけですが、将来別のパラメータが必要な場合はどうなりますか?

+0

提案していただきありがとうございますが、(1)std :: mapの何が問題なのですか(2)私がテンプレート化している値は何ですか?明確にしてください。 – learnvst

関連する問題