10

数日前、私は試験で次の理論的な質問を受けました: (a) プログラムの実行中に発生する可能性のある例外的な状況に対処する際の防御的プログラミングとは何を意味するのかを説明してください。クラスで見られる例を参照するか、疑似コードを使用して、たとえばファイルを読み取ろうとするときに特定の状況が発生するのを防ぐために実行される手順を説明できます。[5 点]

(b) Java での例外処理の意味と、これが防御的プログラミングとどのように異なるかを一般的な用語で簡単に説明してください。【5点】

私は常に、防御的プログラミングはプログラミングのパラダイム全体であり、例外処理はその一部であると考えていました。試験中、「防御的プログラミング」では、プログラマーはロジックコードを実行する前に考えられるすべての問題を見つけようとし、後でこの関数からエラー値 (例 0) を返すのに対し、例外処理では潜在的なエラーが発生してキャッチされると書いています。これらのエラーが直接解釈される特別なメカニズムによって。そうですか?正解は何ですか?

4

2 に答える 2

2

私にとって、防御的なプログラミングとは、自分の信念は信頼できないと信じているために、発生するとは思わない、または発生する可能性さえないと思われるケースを処理するコードを作成することを意味します。

例(コンパイルまたはテストされていない場合、利用規約が適用されます):

private String findSmallestString(Collection<String> strings) {
    if (strings == null || strings.isEmpty()) return null;
    Iterator<String> stringsIt = strings.iterator();
    try {
        String smallestString = stringsIt.next();
        while (stringsIt.hasNext()) {
            String candidateString = stringsIt.next();
            if (candidateString == null) continue;
            if (candidateString.compareTo(smallestString) < 0) {
                smallestString = candidateString;
            }
        }
        return smallestString;
    }
    catch (NoSuchElementException e) {
        return null;
    }
}

そこには、間違いなく防御機能が含まれています。

  • 上部のnullまたは空のガード句。これはプライベートメソッドであるため、nullまたは空のコレクションで呼び出されないようにする必要があります。
  • NoSuchElementExceptionのtry-catch; イテレータがコントラクトを実行した場合、含まれているコードがこの例外をスローしないことを証明できます。
  • イテレータから出てくる文字列(最初のもの以外!)のnullityguard句。繰り返しになりますが、これはプライベートメソッドであるため、コレクションパラメーターにnullが含まれていないことを確認できるはずです(とにかくコレクションにnullを入れて何をしますか?)

ヌルチェックが防御的であることに誰もが同意するわけではありません。トライキャッチは、完全に無意味になるまでです。

私にとって、防御プログラミングの酸テストは、防御が使用されることはないと思われるということです。

于 2011-09-22T18:14:23.663 に答える
2

私にとって、防御的プログラミングは最悪のケースを想定しています。つまり、ユーザーは完全に狂った人々であり、彼らの狂った入力から自分自身とプログラムを守らなければならないということです。この引用には多くの知恵があると思います:

ソフトウェア業界は毎日、より大きくより優れたフールプルーフ ソフトウェアを作成しており、毎日、自然はより大きくより優れた愚か者を生み出しています。ここまでは自然が勝っている

また、ユーザーはクライアントだけではないことを忘れないでください。あなたがライブラリ API を担当している場合、ユーザーは別の部門である可能性があります。その場合、私が人生で聞いた中で最も素晴らしい不満の1つは次のとおりでした。

失敗した単体テストをすべて削除しても、プログラムは動作しませんでした

于 2011-09-22T18:20:02.907 に答える