2017-01-19 8 views
1

このスレッドの最適な名前はわかりませんでしたが、いくつかのコードをリファクタリングしてデカップリングを削除しようとしています。私は、Visual Studio 2005 C++を使用せずに使用することを余儀なくされました。質問しません。(C++ 11以降ではありません)これらのクラスを正常にデカップリングする方法

メッセージを受信するプロトコルがあり、プロトコルにはパーサとプロセッサが含まれています。パーサーは、メッセージから情報を抽出し、構造体に値を設定します。次に、構造体はプロセッサーに渡され、それ以上の処理が行われます。

私はこれをやってから私を妨げている唯一の問題は、私が持っている必要がありますです

class Protocol 
{ 
    Parser parser; 
    Processor processor; 

public: 
    Protocol() : parser(processor) 
    { 

    } 

    handleMessage(Message& message) 
    { 
     ParsedData parsedData; 
     parser.parse(message, parsedData); //This will not call the processor from within it 
     processor.process(parsedData); //This is the new 

    } 
} 

...それはもっとこのようになったので、パーサからプロセッサを除去するために期待していた

class Protocol 
{ 
    Parser parser; 
    Processor processor; 

public: 
    Protocol() : parser(processor) 
    { 

    } 

    handleMessage(Message& message) 
    { 
     ParsedData parsedData; 
     parser.parse(message, parsedData); 
    } 
} 

class Parser 
{ 
    Processor processor; 

public: 
    Parser() 
    { 

    } 

    Parser(Processor& p) : processor(p) 
    { 
    } 

    parse(Message& message, ParsedData& parsedData) 
    { 
     if(message.type == "whatever") 
     { 
      parseLevel2(message.message, parsedData); 
     } 
     //else if Other message types 
    } 

    parseLevel2(MessageLevel2& message, ParsedData& parsedData) 
    { 
     //Keep going down the rabbit hole, but for simplicity it ends here 
     parsedData.blah = "some data"; 
     processor.ProcessBlahMessage(parsedData); 
    } 
} 

class Processor 
{ 
public: 
    Processor() 
    { 
    } 

    ProcessBlahMessage(ParsedData& parsedData) 
    { 
     //Do logic 
    } 
} 

プロセスメソッドのif文の束。

process(ParsedData& parsedData) 
{ 
    if(parsedData.type == "blah") 
    { 
     ProcessBlahMessage() 
    } 
    else if(parsedData.type == "grah") 
    { 
     ProcessGrahMessage() 
    } 
    //etc... 
} 

私の質問は、私は基本的にちょうどそれを再度解析していますこれらすべてのif文を避けるどうやっているのですか?私が関数ポインタ、またはラムダをparsedDataに渡すと、パーサのプロセッサへの参照が必要になります。

+0

処理メッセージの一般的なパターンはありますか?そうであれば、基本クラス 'MessageData'を作成し、各メッセージタイプに対して、' BlahMessageData'、 'GrahMessageData'のようなデータの派生クラスを作成することができます。この後、解析メソッドは[FactoryMethod](https://sourcemaking.com/design_patterns/factory_method)のように動作する 'MessageData'を返します。そして、 'MessageData'はif文なしで普通の方法で処理されます:) – MrPisarik

+0

@Taztingo私は間違っているかもしれませんが、' Parser'から 'Processor'を削除しても' if'条件。 *ストリッピングは何と関係がありますか?また、あなたは本当に何を意味していますか*これは*を呼びませんか?あなたはまだデータを解析する必要がありますか? – CKing

+0

@Ckingコメントが途切れてしまった。これは、プロセッサーを手動で呼び出さないことを意味していました。私はそれを更新し、うまくいけばそれは再び切断されません。問題の目的は、それを除去する方法と、if文をプロセッサから削除する方法です。 – Taztingo

答えて

0

あなたはこれを試すことができます: 1)の代わりに.blahと.grah店のあなたの解析されたデータにどのようなメッセージタイプの新しい何とかオブジェクト(または作成)とタイプを使用して(ベクターに、それへのポインタを置くと仮定しvector<void*> 2)インデックスとして)。 3)プロセッサストアのハンドラのベクトル。あなたは正しいポインタのために正しいハンドラを呼び出すことができます 4)あなたのハンドラの中でvoid *をblah *に(または実際の型は何でも)

+0

これは、unordered_mapを除いて、私が考えていたものに似ています。良いアイデア。 – Taztingo

関連する問題