如何降低圈复杂度?(How to reduce cyclomatic complexity?)

2019-09-02 04:04发布

我正在上发送RequestDTO到Web服务类。 我需要在发送之前验证请求。

该请求可以从3米不同的地方发送,并有每个“请求类型”不同的验证规则,例如request1必须有名称和PhoneNumber,请求2必须有地址等)

我有一个DTO包含的字段(名称,地址,城市,PHONENUMBER等)的一个长长的清单,这是相同的DTO发送无论是哪种类型的请求。

我已经创建了3种不同的验证方法和基于适当的方法被称为类型。

在每一种方法我有如果其他的检查所必需的每个请求类型的字段一个长长的清单。

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这些方法之一圈复杂,所以我的问题是..是有可能降低这种复杂性? - 如果是的话,我将如何去这样做呢?

最后,我需要检查很多领域,我看不出如何能没有大量的检查来完成:/

Answer 1:

一个简单的方法是促进支票存入一个单独的方法:

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

然后你就可以用这个方法来代替if块:

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

这会从28降低复杂度下降到3永远记住:高复杂性计数的指示方法试图做太多。 复杂性可以通过将问题分解成较小的碎片,就像我们在这里做处理。



Answer 2:

另一种方法是强制执行的请求对象本身的合同。 如果需要的字段或不能为空,所以说在创建请求的时候。

创建,它是100%有效和准备当构造存在走这样的请求。

我还创建请求的toString()方法的字符串版本。 它应该知道如何来表现自己。



文章来源: How to reduce cyclomatic complexity?