2013-05-07 10 views
11

WebサービスにRequestDTOを送信するクラスを作成しています。私はそれが送信される前に要求を検証する必要があります。循環器系の複雑さを減らすには?

リクエストは3つの異なる場所から送信でき、リクエストタイプごとに異なる検証ルールがあります。 (名前、住所、市、電話番号など)の長いリストを含むDTOを持っていて、それは関係なく送られた同じDTOです。どのタイプの要求であるか。

私は3つの異なる検証方法を作成し、そのタイプに基づいて適切なメソッドが呼び出されました。

これらのメソッドのそれぞれでは、各リクエストタイプに必要なフィールドをチェックするif-elseの長いリストがあります。

private void validateRequest1(Request request) { 
    StringBuilder sb = new StringBuilder(); 
    if (null == request) { 
     throw new IllegalArgumentException("Request is null"); 
    } 
    if (isFieldEmpty(request.getName())) { *see below 
     sb.append("name,")); 
    } 
    if (isFieldEmpty(request.getStreet())) { 
     sb.append("street,")); 
    } 
    ... 

isFieldEmpty()チェックヌルとisEmpty()のための文字列と私の質問があるので、これは私にそれらのいずれかの方法で28の循環的複雑度を与えるブール

を返します。..それはこの複雑さを低減することができますか?もしそうなら、私はどうしたらいいのですか?

最終的に、私は多くの分野をチェックする必要があると私は、これはチェックの多くなしで行うことができる方法を見ることができません:/

+1

私の考えは:空の(または他の)チェック、および取るべきアクション( 'sb.append()')などをカプセル化する何らかの 'FieldChecker'オブジェクトを使用し、そのようなオブジェクト。これにより、そのチェックの出力と入力を明示的に定義する必要があるため、コードが明確になります。 – millimoose

答えて

22

簡単な方法は、別の方法にチェックを促進することである。

private String getAppendString(String value, String appendString) { 
    if (value == null || value.isEmpty()) { 
     return ""; 
    } 
    return appendString; 
} 

そして、あなたが代わりにifのブロックで、このメソッドを使用することができます。

sb.append(getAppendString(request.getStreet(), "street,"); 

これは3までの28から複雑さを軽減します常に覚えている:複雑性の高いCOUNをtsはメソッドがあまりにも多くをやろうとしていることを示しています。複雑さは、私たちがここで行ったように、問題をより小さな部分に分割することで対処することができます。

1

もう1つのアプローチは、Requestオブジェクト自体にその契約を強制することです。フィールドが必要な場合、またはnullにすることができない場合は、リクエストが作成されたときにそのフィールドを指定します。

リクエストが100%有効で、コンストラクタが存在するときに準備が整うようにリクエストを作成します。

また、Request toString()メソッドでそのStringバージョンを作成します。自分自身をレンダリングする方法を知っている必要があります。

関連する問題