C++ リーダーを実装する必要があるバイナリ パケット形式があります。ライブラリは Qt 4 を使用し、パケット ソースは任意の QIODevice (QTcpSocket、QFile、QBuffer など) にすることができます。フォーマットにはパケットフォーマットが含まれ、各パケットには多くのサブ構造が含まれている場合があります。リーダーに次の情報を返す必要があります。
- パケット ヘッダー。
- サブ構造の配列。
- 読み取り操作のエラー ステータス - 成功、エラー、またはデータが不十分 (特にソケットまたは別の種類のバッファリング デバイスから読み取る場合)。
リーダー API にはさまざまなアプローチが考えられます。
Packet read(Status &status);
- 値で戻り、参照引数を介してエラー ステータスを返します。Packet *read(bool *ok);
- エラーが発生した場合は NULL を返すか、十分なデータがない場合は、ok
それに応じて true または false を変数 (NULL でない場合) に書き込みます。Packet *read();
- エラーの場合は NULL を返すか、十分なデータがない場合は、別のメソッドを呼び出しbool wasError();
て何が起こったかを確認します。ok
これは、パラメーターのデフォルト値を にすることで、前のものとマージできますNULL
。Status read(Packet &packet);
- 返されたステータスが のOk
場合、読み取った値がpacket
変数に格納されます。それ以外の場合は、エラーまたは EOF のいずれかを示します。Packet read();
- 値で返す。EOF またはエラーの場合は、特別な「ヌル パケット」値を返します。wasError()
何が起こったのかを確認するために呼び出します。
もちろん、他の組み合わせも可能です。最善の選択はないようです。アプローチ 1、2、および 4 では、呼び出し元が結果を格納する別の変数を宣言する必要があります。アプローチ 2 と 3 にはヒープをいじる必要がありますが、これは明らかな理由でやりたくありません。アプローチ 1 では、エラーの場合に何が返されるかが明確になりません。アプローチ5はそれを修正しますが、パケット構造に特別な「null」フラグを導入しますが、おそらくそこに属していません.
5 番目のアプローチを取ることもできますが、パケットとステータス情報を含む特別な構造を返しますが、それは別の「合成」タイプを導入し、「エラーが発生した場合、パケット フィールドには何が含まれますか?」という疑問が残ります。
または、3 番目のアプローチを取り、QSharedPointer<Packet>
代わりに a を返すこともできます。これにより、呼び出し元が手動でヒープをいじる必要がなくなります。しかし、Packet
構造体は、Pimpl のために、おそらくすでに一種のスマート ポインター (共有クラス) になっているでしょう。isNull()
代わりにその内部ポインターを使用して、QString のようにメソッドを導入できるかもしれません。
それを行うためのより良い、または伝統的な方法はありますか?