0

私たちのほとんどは、ループに非終了条件があってはならないことを知っています。たとえば、この C# ループには非終了条件があります。つまり、i の偶数値です。これは明らかな論理エラーです。

void CountByTwosStartingAt(byte i) { // If i is even, it never exceeds 254
    for(; i < 255; i += 2) { 
        Console.WriteLine(i);
    }
}

非常にありそうもないが、技術的には終了しない状態を構成するエッジ ケースが時々あります (スタック オーバーフローとメモリ不足エラーは別として)。ストリーム内の連続するゼロの数をカウントする関数があるとします。

int CountZeros(Stream s) {
    int total = 0;
    while(s.ReadByte() == 0) total++;
    return total;
}

さて、あなたがこれを与えたとしましょう:

class InfiniteEmptyStream:Stream
{
    // ... Other members ...

    public override int Read(byte[] buffer, int offset, int count) {      
        Array.Clear(buffer, offset, count); // Output zeros
        return count; // Never returns -1 (end of stream)
    }
}

または、より現実的には、外部ハードウェアからデータを返すストリームで、場合によっては多数のゼロを返す可能性があります (机の上にあるゲーム コントローラーなど)。いずれにせよ、無限ループがあります。この特定の非終了条件は際立っていますが、そうでない場合もあります。

私が書いているアプリのように、完全に現実世界の例です。ゼロのエンドレス ストリームは、無限の「空の」オブジェクトに逆シリアル化されます (アイテムが 20 億を超えたためにコレクション クラスまたは GC が例外をスローするまで)。しかし、これはまったく予想外の状況です (私のデータ ソースを考えると)。

非終了条件がまったくないことはどれほど重要ですか? これは「堅牢性」にどの程度影響しますか? それらが「理論的に」非終了である場合にのみ問題になりますか(例外が暗黙の終了条件を表している場合は問題ありませんか)? アプリが商用かどうかは重要ですか? 一般配布したら?問題のあるコードがパブリック インターフェイス/API を介してアクセスできない場合は問題になりますか?

編集: 私が持っている主な懸念の1つは、非終了条件を作成する可能性のある予期しない論理エラーです。原則として、非終了条件がないことを確認すると、これらの論理エラーをより適切に識別または処理できますが、それだけの価値があるでしょうか? そしていつ?これは、信頼と直交する懸念事項です。

4

4 に答える 4

0

非終了条件がまったくないことはどれほど重要ですか?

それはまったく重要ではありません。つまり、それ自体が目的ではないということです。重要なことは、コードが仕様を正しく実装していることです。たとえば、メイン ループが終了した場合、インタラクティブ シェルにバグがある可能性があります。

あなたが説明しているシナリオでは、無限ゼロの問題は、実際にはメモリ不足の特殊なケースです。これは理論的な問題ではなく、実際に起こりうることです。これをどのように処理するかを決定する必要があります。

于 2009-12-05T21:29:29.583 に答える
0

データソースを「信頼」するか、信頼しないかのどちらかです。

そのデータソースで使用されているソフトウェアを「サポート」するか、しないかのどちらかだと思います。たとえば、メモリ不足の状態を処理しないソフトウェアを見てきましたが、そのソフトウェアではメモリ不足は「サポートされていません」(または、具体的にはそのシステムではサポートされていません)。そのため、そのシステムでメモリ不足の状態が発生した場合の修正は、システムの負荷を軽減するか、メモリを増やすことです (ソフトウェアを修正するのではありません)。そのシステムでは、不十分なメモリの処理は要件ではありません。要件は、システムにかかる負荷を管理し、その特定の負荷に十分なメモリを提供することです。

于 2009-12-05T19:55:32.580 に答える