2

私は、主にUSBシリアル通信に関係するいくつかの単純なC関数からいくつかのC++ライブラリを作成しています。私は、MacとLinuxに移植することを目的として、VisualStudio2010で作成しています。

現在、SerialCommunicationクラスとPumpCommサブクラスがあります。現在、CreateMessage(uint8 msg [])、SendMessage(uint8 msg [])、ReadSerial(uint8 readmsg [])などのC関数があります。

私の質問は、msg []を関数パラメーターではなくメンバー変数に変更することによる不利な点はありますか?(擬似コード):

int main() 
{
    SerialPort sp;
    sp.OpenSerial("COM19");
    sp.CreateMessage("Messagetosend1234");
    sp.SendMsg();
}

class SerialPort 
{
private:
    uint8 msg[];

public:
    int32 OpenSerial();
    int32 CreateMessage(uint8 msg[]);

}

私が見る利点は次のとおりです:1)msgは送信先のシリアルポートによって明確に所有されている、2)msgのスコープはシリアルポートのスコープである、3)msgの実装は非表示にできる(ゲッター/セッターを追加します。つまり、基本的にOOPの利点です。私はc++とOOPにかなり慣れていないので、特にシリアル通信に関しては、何かが足りないかもしれません。御時間ありがとうございます。

4

1 に答える 1

2

メッセージはCOMチャネルの一部ですか?私はあなたがチャネルを介してメッセージを送信すると思います。あなたのデザインは、「方法」(チャネル)と「何」(メッセージ)を緊密に結合しています。また、コードに多くの状態依存関係を暗黙的に追加します。たとえば、SendMsgを呼び出す前にCreateMessageを呼び出す必要があります。

要約すると、後で裏目に出る可能性のあることがいくつかあります。

  • 複数のスレッドからチャネルにアクセスする必要がある場合
  • メッセージがバイトバッファ以上になる場合
  • コードをリファクタリングし、誤って一部の呼び出しを交換した場合

したがって、メッセージとチャネルを2つの別々のクラスに保持します。

class Message {
private:
  uint8 *buffer;
  size_t length;

public:
  Message(uint8 *buf, size_t len) : buffer(buf), length(len) { }

  size_t getLength() const { return length; }
  const uint8 *getData() const { return buffer; }
};

class SerialPort 
{
public:
    int32 OpenSerial();
    int32 SendMsg(const Message& msg);

}
于 2013-01-16T19:52:31.353 に答える