1. ホーム
  2. java

JavaでLBYLとEAFPの比較?

2023-09-24 06:53:20

質問

私は最近Pythonを独学で学んでいて、コード実行前のエラーチェックに関してLBYL/EAFPイディオムを発見しました。Pythonでは、受け入れられたスタイルはEAFPであり、それは言語とうまく動作するように思われます。

LBYL ( L オク B Y ou L eap ):

def safe_divide_1(x, y):
    if y == 0:
        print "Divide-by-0 attempt detected"
        return None
    else:
        return x/y

EAFP ( それは E よりも A スキップ F より強い P 許可 ):

def safe_divide_2(x, y):
    try:
        return x/y
    except ZeroDivisionError:  
        print "Divide-by-0 attempt detected"
        return None

私の質問はこれです。JavaとC++のバックグラウンドを持つ私は、主なデータ検証コンストラクトとしてEAFPを使用することを聞いたことすらありませんでした。EAFP は Java で使用するのが賢明なのでしょうか。それとも、例外によるオーバーヘッドが大きすぎるのでしょうか?実際に例外がスローされたときだけオーバーヘッドがあることは知っていますが、なぜよりシンプルな方法のEAFPが使用されないのかがわかりません。単なる好みなのでしょうか?

どのように解決するのですか?

個人的には、これは慣習に裏打ちされたものだと思いますが、EAFPは決して良い方法とは言えません。 以下と同等と見てよいでしょう。

if (o != null)
    o.doSomething();
else
    // handle

とは対照的に

try {
    o.doSomething()
}
catch (NullPointerException npe) { 
    // handle
}

さらに、次のように考えてみましょう。

if (a != null)
    if (b != null)
        if (c != null)
            a.getB().getC().doSomething();
        else
            // handle c null
    else
        // handle b null
else
    // handle a null

この方法は、見た目はあまりよくありませんが(確かにこれは雑な例ですが、我慢してください)、エラー処理の粒度が大きくなり、try-catchですべてを包んで、このような NullPointerException を取得し、どこで、なぜそれを取得したかを理解しようとするのとは対照的です。

私が考えるに、EAFPはまれな状況を除いて、決して使われてはならないのです。また、問題を提起されたので はい、try-catch ブロックはいくらかのオーバーヘッドを発生させます。 例外がスローされない場合でもです。