2013-05-07 268 views
11

我正在開發一個向Web服務發送RequestDTO的類。我需要在發送之前驗證請求。如何降低圈複雜度?

該請求可以從3個不同的地方發送,並且對於每個「請求類型」有不同的驗證規則,例如, request1必須有名稱和PhoneNumber,請求2必須有地址等)

我有一個DTO包含的字段(名稱,地址,城市,PHONENUMBER等一長串),它是同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()並返回boolean

這給我的28這些方法之一圈複雜,所以我的問題是..是有可能降低這種複雜性? - 如果是這樣,我會怎麼做呢?

最後,我需要檢查很多領域,我看不出這可以在沒有大量的檢查來完成:/

+1

我的想法是:使用某種封裝空白(或其他)檢查以及要採取的動作('sb.append()')等的'FieldChecker'對象,並遍歷這樣的對象。這使得代碼更清晰,因爲您必須明確定義該檢查的輸出和輸入。 – millimoose 2013-05-07 11:41:51

回答

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這表明某種方法試圖做得太多。通過將問題分成更小的部分來處理複雜性,就像我們在這裏所做的那樣。

1

另一種方法是在Request對象本身中執行該合同。如果一個字段是必需的或不能爲空,請在創建請求時說。

以這種方式創建請求,使其100%有效,並在構造函數存在時準備好。

我也會在Request toString()方法中創建String版本。它應該知道如何呈現自己。