Octet
8 つのサンプルを「パッケージ化」してから送信するクラスがあります。新しいサンプルを追加し、すでにいっぱいかどうかをチェックFrame
し、Octet
.
このOctet
クラスは、「まだいっぱいではないため抽出できません」と「すでにいっぱいであるためにサンプルを追加できません」という 2 種類の例外をスローします。そのために、クライアント コードは を呼び出す前に満杯かどうかを確認し、満杯にAdd
なったらすぐに抽出し、それをリセットする必要があります (正直なところ、非常に不十分なクラス コントラクトです)。
問題は、クライアント クラス (使用している唯一のクラスOctet
) がスローされる操作の前に正しくチェックを実行しているように見えても、2 種類のエラーが発生していますが、エラー条件が発生しているにもかかわらずです。さらに悪いことに、デバッガーが壊れたときに値を確認すると、それらは正しいです。つまり、例外がスローされるべきではありません!
public class Client
{
private Octet _octet = new Octet();
void ProcessNewSamples(IEnumerable<int> newSamples)
{
foreach (int sample in newSamples)
{
if (!_octet.IsFull)
{
_octet.Add(sample);
}
if (_octet.IsFull)
{
var frame = _octet.ExtractFrame();
this.SendElsewhere(frame);
_octet.Reset();
}
}
}
}
public class Octet
{
const int ARRAY_SIZE = 8;
int[] _samples = new int[ARRAY_SIZE];
int _index = 0;
public bool IsFull { get { return _index >= 8; } }
public void Add(int sample)
{
if (IsFull)
{
throw new InvalidOperationException();
}
else
_samples[_index++] = sample;
}
public Frame<int> ExtractFrame()
{
if (!IsFull)
throw new InvalidOperationException();
else
return new Frame<int>(_samples);
}
public void Reset()
{
_samples = new int[ARRAY_SIZE];
_index = 0;
}
}