2013-05-07 2 views
11

웹 서비스에 RequestDTO를 보내는 클래스 작업 중입니다. 요청을 전송하기 전에 유효성을 검사해야합니다.순환 복잡도를 줄이는 방법은 무엇입니까?

요청을 3 곳에서 보낼 수 있으며 각 요청 유형에 대해 다른 유효성 검사 규칙이 있습니다 (예 : request1에는 이름과 전화 번호가 있어야하며, request2에는 주소가 있어야합니다.)

필자는 긴 필드 목록 (이름, 주소, 도시, 전화 번호 등)을 포함하는 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() 검사 널 (null)과 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,"); 

이 항상 기억 28 3. 아래에서 복잡성을 줄일 : 높은 복잡성 coun에를 ts는 메소드가 너무 많이 수행하려고한다는 표시입니다. 복잡성은 우리가 여기에서했던 것처럼 문제를 더 작은 조각으로 나눔으로써 처리 할 수 ​​있습니다.

1

또 다른 접근법은 요청 개체 자체에 해당 계약을 적용하는 것입니다. 필드가 필수이거나 널이 될 수없는 경우, 요청이 작성 될 때 그렇게 말하십시오.

생성자가 존재할 때 100 % 유효하며 진행할 수 있도록 요청을 만듭니다.

또한 Request toString() 메소드에서 해당 String 버전을 만들 수 있습니다. 자신을 렌더링하는 방법을 알아야합니다.