5

最近、C# と ActiveMQ を (Apache.NMS ライブラリ経由で) 使用しているときに、次のプロパティに出くわしました。ActiveMQBytesMessage

public new byte[] Content
{
  get
  {
    byte[] buffer = (byte[]) null;
    this.InitializeReading();
    if (this.length != 0)
    {
      buffer = new byte[this.length];
      this.dataIn.Read(buffer, 0, buffer.Length);
    }
    return buffer;
  }
  ..(setter omitted)
}

InitialiseReadingメソッドは、アクティブな MQ から.dataInフィールドへのデータの接続とストリーミングを処理しました。問題は、ITが毎回これを行ったことです。そして、そのデータが読み取られると、二度と読み取ることができず、dataIn フィールドはゼロになってリセットされました。したがって、単にプロパティを観察して再度観察するだけで、データが失われます。これにより、次のような非常に奇妙なバグが発生しました。

byte [] myBytes = new byte[msg.Content.Length]; 
//Touched the property. Data read in.

msg.Content.CopyTo(myBytes,0); 
//Uh oh! touched it again, copying a zero'd array.

または、デバッグ中にウォッチ変数をプロパティに固定したり、誤ってマウスをプロパティの上に置いたりした場合。

この種のメカニズムは、ストリーミングされたデータのプロパティを使用する方法として受け入れられているか、または普及していますか?

4

6 に答える 6

6

非常貧弱なコード。

一般的な知恵は、プロパティがオブジェクトの内部状態に影響を与えてはならないということです。setを呼び出す場合は、設定した値を常に取得する必要があります。get twicweを呼び出すと、同じ結果が2回得られるはずです。

GetContentこれは少なくとも呼び出されるメソッドであるはずですが、idはそれでもそのメソッドを繰り返し呼び出して、同じ結果を得ることができることを期待しています。

于 2012-08-09T10:50:50.717 に答える
2

その悪いコードは、Command Query Separation ( CQS ) と呼ばれるものを壊します。

クエリは副作用なしで繰り返し可能でなければならないという考えです。コマンド/アクションは、オブジェクトに関する情報を実際に提供するべきではなく、変更を加えるだけです。(ただし、実際には、コマンドをチェーンするために実行できます)

于 2012-08-09T10:54:40.543 に答える
2

これは非常に貧弱なコードです。プロパティにはほとんどロジックを含めず、決して副作用を引き起こさないようにする必要があります。

このプロパティは、getNextContent という名前のメソッドとして使用する方が適切です。

于 2012-08-09T10:54:10.043 に答える
1

その貧弱なコードは、明らかに、そして私はそれをあまり見ていません。

于 2012-08-09T10:50:31.950 に答える
1

明らかに、これはまさにあなたが与えた理由からひどいコードです。

于 2012-08-09T10:51:57.337 に答える
1

バグを報告する必要があります。彼らがそれを修正する可能性がどれほど低いかに関係なく.

于 2012-08-09T11:55:59.617 に答える