2013-05-07 211 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版本。它应该知道如何呈现自己。