4

アプリケーション間の制御フローに関連して、これについて興味深い投稿がここにあります。

さて、最近、興味深い問題に出会いました。潜在的に (実質的に) 無限の再帰シーケンスで n 番目の値を生成します。この特定のアルゴリズムは、成功した時点で少なくとも 10 ~ 15 のスタック参照の深さになります。私が最初に考えたのは、次のような SuccessException をスローすることでした (C#):

class SuccessException : Exception
{
    public string Value
    { get; set; }

    public SuccessException(string value)
        : base()
    {
        Value = value;
    }
}

次に、次のようにします。

try
{
    Walk_r(tree);
}
catch (SuccessException ex)
{
    result = ex.Value;
}

そこで、フロー制御に例外を使用しないように何度も聞いてきました。言い訳はありますか?また、実装する場合、このようなものをどのように構築しますか?

4

7 に答える 7

5

この場合、私はあなたの Walk_r メソッドを見ています。値を返し、成功を示すために例外をスローするものを用意する必要があります。これは一般的な方法ではなく、少なくともコードを見る人を非常に混乱させるでしょう。例外に関連するオーバーヘッドは言うまでもありません。

于 2008-10-06T14:22:46.150 に答える
1

私はここで悪魔の代弁者を演じ、成功を示すために例外を除いて固執すると言います。スロー/キャッチするのはコストがかかるかもしれませんが、それは検索自体のコストと比較して取るに足らないものであり、メソッドを早期に終了するよりも混乱が少ない可能性があります。

于 2008-10-06T15:00:06.963 に答える
1

walk_r は、ヒットしたときに単純に値を返す必要があります。これはかなり標準的な再帰の例です。私が見る唯一の潜在的な問題は、それが潜在的に無限であるとあなたが言ったことです。これは、再帰の深さのカウントを維持し、いくつかの最大値で停止することにより、walk_r コードで補償する必要があります。

メソッド呼び出しは、単に「通常」を返すのではなく、値を返すために例外をスローするようになったため、例外は実際にはコーディングを非常に奇妙にします。

try
{
    Walk_r(tree);
}
catch (SuccessException ex)
{
    result = ex.Value;
}

になる

result = Walk_r(tree);
于 2008-10-06T14:30:40.440 に答える
0

特に .net では、アルゴリズムの一部として例外をスローすることはあまり良い考えではありません。一部の言語/プラットフォームでは、例外がスローされたときに非常に効率的であり、通常は、たとえば iterable が使い果たされたときに発生します。

于 2008-10-06T14:26:09.310 に答える
0

結果の値を返さないのはなぜですか? 何かが返された場合は、成功したと見なしてください。値を返さない場合は、ループが失敗したことを意味します。

失敗から復帰する必要がある場合は、例外をスローすることをお勧めします。

于 2008-10-06T14:28:28.823 に答える
0

例外を使用する際の問題は、(大まかに言えば) 非常に非効率的で遅いことです。再帰関数内に if 条件を設定して、必要に応じて返されるようにするのは簡単です。正直なところ、最近の PC のメモリ量では、再帰呼び出しの数が少ない (<100) だけでスタック オーバーフローが発生する可能性はほとんどありません (不可能ではありません)。

スタックが実際の問題である場合は、「創造的」で「深さを制限した検索戦略」を実装し、関数が再帰から戻り、最後の (最も深い) ノードから検索を再開できるようにすることが必要になる場合があります。

要約すると、例外は例外的な状況でのみ使用する必要があります。関数呼び出しの成功は、そのようなものではないと思います。

于 2008-10-06T14:28:40.867 に答える
0

私の本の通常のプログラム フローで例外を使用することは、これまでで最悪のプラクティスの 1 つです。飲み込まれた例外を探していて、例外が発生するたびに停止するように設定されたデバッガーを実行している貧しい sap を考えてみてください。あの男は今怒っている....そして彼は斧を持っている. :P

于 2008-10-06T14:30:32.813 に答える