1

タイプの個々のオブジェクトを処理しInternalMessage、それぞれをいくつかのExternalMessageオブジェクトに変換し(InternalMessagesとExternalMessagesの間には1対多の関係があります)、これらのExternalMessageオブジェクトをキューに入れて処理する必要があります。このキューに挿入する2つのモードが必要です。すべてがExternalMessageアトミックにキューに挿入されるバッチ処理と、オブジェクトが作成されるときにオブジェクトがキューに挿入される通常の挿入ExternalMessageです。このキューのメッセージを生成するスレッドが複数あることに注意してください。

これを解決するための私の考えはInserter、挿入を処理するオブジェクトを持つことです。

class Inserter {
public:
    void ProcessMessage(const ExternalMessage& externalMessage) = 0;
};

class SingleInserter {
public:
    SingleInserter(Queue* q) : m_q(q) { }
    void ProcessMessage(const ExternalMessage& externalMessage) {
        m_q->Insert(q);
    }
private:
    Queue* m_q;
};

class BatchInserter {
public:
    BatchInserter(Queue* q) : m_q(q) { }
    void ProcessMessage(const ExternalMessage& externalMessage) {
        m_cache.Insert(externalMessage);
    }
    ~BatchInserter() {
        m_q->BatchInsert(m_cache);
    }

private:
    Queue* m_q;
    List<ExternalMessages> m_cache;
};

Inserter次に、メッセージが作成されるときにコールスタックを渡します。

BatchInserter ins;

また

SingleInserter ins;

その後

HandleMessage(someInternalMessage, ins);

そしてHandleMessageは次のことを行います。

void HandleMessage(const InternalMessage& msg, Inserter& ins) {
    //... do logic, eventually create a externalMsg (note - this could be further down
    //the call stack, in a loop, etc. Multiple external messages could be created each
    //call to HandleMessage)
    ins.ProcessMessage(externalMsg);
}

このデザインは理想的ですか?さまざまな挿入タイプを使用できるのは良いことですが、オブジェクトを呼び出しスタックに渡すことなく(たとえば、テンプレートの特殊化を介して)これを行う方法はありますか?次に、これを実装する際に準拠する必要があるSTLパターンはありますか?

4

1 に答える 1

2

それは私には大丈夫に見えます。私が考えることができる唯一の変更はHandleMessage、テンプレートを作成することです。だからあなたは持っているでしょうtemplate <class T> HandleMessage(const InternalMessage& msg, T& inserter)。これにより、このクラスのユーザーに抽象基本クラスからの派生を強制することはなく、Inserter仮想関数による動的ディスパッチによって引き起こされるわずかなオーバーヘッドを回避できます。

于 2012-05-14T04:10:31.710 に答える