さて、前回は2種類C++で役に立つサイトを紹介してみました。
今回はそれらのサイトに書いてあることを利用するとどんなことが出来るのか?
という紹介記事です。
ちなみにサンプルコードは掲載していますが、
非常にオーソドックスなTCP/IPソケットの例なのでやり尽くされた感はありますし、思ったより行数が増えたので敢えてエラー処理を一切合切そぎ落としています。
なので、ご利用は計画的に❤
まずはサンプルコード
ざっと概要を説明すると、純粋仮想クラスでインターフェースの実装を強制した上で、サーバとクライアントのラッパクラスを作成、ホストクラスで使い分ける。
それだけです。
まぁそれだけで結構な行数使ってしまったわけですが、それは私の能力のなさでしょうね……
まぁいいや
インターフェースの実装強制
class TCPIPInterface { public: virtual void create_connection() = 0; virtual void write_data(const char* data, size_t data_length) = 0; virtual void read_data(char* data, size_t data_length) = 0; virtual void wait_for_incomming(){ return; }; };
おそらくC#を組む方なら見慣れていると思うのですが、インターフェースを定義することで、俯瞰すると定型的な処理の実装を強制しています。
個人開発では冗長な実装ではあるのですが、チーム開発を行う上ではこうした縛りを規定しておくことはじわじわ効いてきます。
同時にCIサーバを運用する上でも、このようなインターフェースで開発者がいじれる個所を絞っておくことは、テストケース、テストパターンの削減につながります。
おそらくはここが最もツッコミが入るところだと思うのですが、高速な静的ポリモーフィズムを使用せずに、動的な純粋仮想クラスによるポリモーフィズムを使用しているのは、私の職場で使っている開発環境をC++17で規定しているため、自宅で組むときもそれに合わせているからです。
C++20を使用するのであれば、conceptを使用して簡単に実装できるので、
TCP/IPのポリシークラス
class ServerPolicy : TCPIPInterface //以下略 class ClientPolicy : TCPIPInterface //以下略
Cで書かれているSocket.hのラッパークラスです。
説明することは特にないと思います。
ホストクラス
templateclass TCPIPHostClass : public T_policy //以下略
ポリシーに基づく設計のホストクラスに当たります。
しかし、Hostとか名前つけちゃうとネットワークのホストなんだかホストクラスなんだかわけわからないですねw
呼び方
TCPIPHostClass/lt;serverpolicy/gt; tcpip_object(testip.ip_value, 10101); tcpip_object.create_connection(); tcpip_object.wait_for_incomming(); tcpip_object.read_write_data(test, sizeof(test), buffer, sizeof(buffer));適当にサーバだけ呼んでいます。
一応同じソースからサバクラそれぞれバイナリ作って、接続できることは確認しましたが……
テンプレートの特殊化の時点でサーバとクライアントを書き分けるだけで、このソースコードから作るソフトウェアがたった一行の変更でサーバにもクライアントにもなります
さいごに
今回はやり尽くされた感のある内容をやりました。
Boostのようなライブラリの使用できる開発現場であればほぼ使うことはないと思うやり方ですが、もし昔の仕様で苦労している方がいるのであれば、そういう方の少しでも助けになれればと思います。
0 件のコメント:
コメントを投稿