2010-12-28 12 views
0

多くの開発者がユーティリティクラスを使用してすべての種類のチェックを実行していることに気付きました。つまり、SomeDefenseClass.checkState(arg > 4)などです。それは引数、アプリケーションの状態、nullポインタなどをチェックするためのかなりいい、きれいな方法であると思われます。utilそれは状態のチェックのためだけにIllegalStateExceptionをスローするのも大丈夫です。ヌルポインタのNPEなど。しかし今私は問題に直面しています。違う種類の違法な州のために、多くの異なる例外を投げなければなりません。 ItemNotFoundException、その上UserNotAuthorizedExceptionと... 例外処理の問題

は、だから私はこの問題のための3つの解決策を考えることができますが、残念ながら誰も

1)最も簡単な方法は十分であるように思わない:すべてのユーティリティクラスを使用すると、ちょうど場合は書きませんブロック。 )

3(我々はおよそ30種類の例外を持っているとカウント原因、あまりよくない)可能なすべての例外の異なるstateCheck方法を記述するには(ジャスト

if (!foo) { 
    throw new SomeException(arg1); 
} 
if (!bar) { 
    throw new SomeOtherException(arg1, arg2); 
} 
// and so on 
非常に多くを持って好きではありません)防衛クラスに1つのメソッド書き込むには:このケースではとにかく

public static void checkState(boolean condition, Throwable t) { 
    if (!condition) { 
     throw t; 
    } 
} 

を私は新しい例外オブジェクトに状態チェックが実行されるたびに作成する必要があり、それは全く不要なオブジェクトの数千人が作成されることを意味し、の終わりにそれは問題になるかもしれない日:

だから誰もその問題の良い解決策をお勧めしますか?

あなたは

答えて

3

最初の段落を読んで、ビジネスレベルの例外(ItemNotFoundException、UserNotAuthorizedException)とクラスレベルのアサーション(引数のチェック、アプリケーションの状態、ヌルポインタ)を混在させようとしています。

ビジネス例外は、APIとの契約のようなものであり、あなたのようにビジネスにとって意味のあるものである必要があります。彼らがどこに属しているかを作り出して投げる方が良いです。これは良いカプセル化であるだけでなく、正しいスタックトレースを保持し、問題のデバッグを容易にします。

アサーションは、主に内部ロジック検証用であり、ロジックエラー、開発者ミスなどをテストサイクルの初期段階で見つけ出すためのものです。理想的には、アサーションは開発中とテスト中にオンになり、プロダクションではオフになります。前提条件、事後条件、不変条件は3種類のアサーションカテゴリです。 Design By Contractについて詳しくは、こちらをご覧ください。

アサーションチェックをユーティリティメソッドに移す必要はありません。 Javaの組み込みのassert keywordを使用し、開発およびテスト中に有効にする計画です。あなたのための私の提案は、不変条件と事後条件のチェックにassertキーワードを使用し、前提条件の確認にgoogle-guava's Preconditionsを使用することです。

複数の場所で共通の検証が実行されていることがわかっている場合、それらを独自のクラスにカプセル化して、 AgeValidator、SalaryVaidatorなど(DRYの原則)。ここでも独自のフレームワークを構築する必要はなく、標準Java仕様JSR 303 Bean Validationを使用してください。

1

私はこれらのチェックを実行するユーティリティクラスのアイデアを嫌いありがとうございます。

私の最初の考えは、「それを必要とするオブジェクトの内部に契約の執行を維持する」ことです。ユーティリティクラスを使用すると、再利用の経済性は偽りです。

私の2番目の考えは、Springが持っているようなバインディングと検証のフレームワークです。 UIからの入力をオブジェクトにバインドし、検証して移動します。これは私にとってもっと再利用可能なようです。春が証明です。

0

OValまたは同様のフレームワークを考慮してください。