これは技術的な問題ではなく、C++ の設計上の問題です。
ある種の接続、解析ステージ、および抽象ビューを持つプロトコルを管理する必要があるプログラムを設計する必要があるように思われることがよくあります。通常、私は最前線で関心事を分離してプログラムを設計しようとします。
私はオブジェクトの「スタック」で終わり続けます。システムはパーサーの上にあり、パーサーは接続の上にあります(多くの場合、より多くのレイヤーがあります)。次に、これらのオブジェクトはメンバー関数呼び出しを使用してその下のレイヤーを呼び出し (Tx)、コールバック (std::function
通常は ) を使用して他の方向 (Rx) からの情報を取得します。
この設計は、複雑さが増し、各レイヤーには次第に大きなコンストラクターなどが必要になるため、実際には劣っているように見えます。また、接続は通常 ASIO のようなものを使用するため、コールバックは一般に異なるスレッド上にあるため、スレッドの安全性について推論するのは困難です。
この構造/機能をよりよく表す設計パターンまたはイディオムはありますか?
編集
簡単な例
class basic_connection {
basic_connection(std::string address);
void send(std::string);
std::function<void(std::string)> on_receive;
};
このようないくつかのクラスがあり、そのレイヤーの状態を保持し、パブリック メンバー関数とコールバックによって結合されています。
この上のレイヤーは、ネットワークのコマンド データ プロセスを受け取り、 を呼び出しますbasic_connection::send
。生データを取得しbasic_connection
、未処理のレイヤーのコマンドに変換します。
EDIT2:
言及するのを忘れていたもう 1 つの問題は、スタックを介してインターフェイスの一部を転送することになることです。たとえば、トップ レイヤーは接続ステータスを知る必要があります。