Null Check增加了圈复杂度

时间:2015-11-10 11:59:53

标签: java string exception sonarqube cyclomatic-complexity

我有一个java POJO类,如下所示。

 public class EmployeeVo {
        private String firstName;
        private String middleName;
        private String lastName;
        private String suffix;
        private String addressline1;
        private String addressline2;
        private String city;
        private String state;
        private String zipCode;
        private String country;

            public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getMiddleName() {
            return middleName;
        }
        public void setMiddleName(String middleName) {
            this.middleName = middleName;
        }
        public String getLastName() {
            return lastName;
        }
        .// Setters and getters for other fields.
        .
        .

        }

有没有办法一次检查一个对象的所有字段是否为null,而不是检查每个字段是否为null?

从EmployeeVo对象

中检索这些值时
public static boolean isEmpty(String string){
    if(null==string || string.trim().length()==0){
        return true;
    }
    return false;
}

我必须在使用它之前手动空检查每个字段。 由于上面的Object有10个以上的字段,显然会增加该方法的Cyclomatic Complexity。 对它有什么最佳解决方案吗?

if(CommonUtil.isNotEmpty(employeeVO.getCity())){
            postalAddress.setCity(employeeVO.getCity());
        }
        if(CommonUtil.isNotEmpty(employeeVO.getCity())){
            postalAddress.setState(employeeVO.getState());
        }
        if(CommonUtil.isNotEmpty(employeeVO.getZipCode())){
            postalAddress.setPostalCode(employeeVO.getZipCode());
        }
        if(CommonUtil.isNotEmpty(employeeVO.getCountry())){
            postalAddress.setCountryCode(employeeVO.getCountry());
        }

我们可以使用

String country=employeeVO.getCountry();
postalAddress.setCountryCode( (country!=null) ? country: "");

只是为了降低复杂性?这是根据标准吗?

2 个答案:

答案 0 :(得分:5)

调用者不负责决定是否设置字段,它应该是自己的方法。

在你的情况下,这意味着设置者必须决定参数的值是否设置。

这将一种方法的复杂性转移到单个单独的方法,从而降低了调用者的复杂性

答案 1 :(得分:1)

此代码不会减少CC。使用三元时,你仍然有一个分支。

String country=employeeVO.getCountry();
postalAddress.setCountryCode( (country!=null) ? country: "");

我想出了一个处理这个问题的简单方法。

ifNotBlank(String input, String output);

如果输入为空,则返回输出。如果输入不为空,则返回输入。因此,当应用于您的代码时,它看起来就像这样。

        postalAddress.setCity(ifNotBlank(employeeVO.getCity(), ""));
        postalAddress.setState(ifNotBlank(employeeVO.getState(), ""));
        postalAddress.setPostalCode(ifNotBlank(employeeVO.getZipCode(), ""));
        postalAddress.setCountryCode(ifNotBlank(employeeVO.getCountry(), ""));

ifNotBlank的代码看起来像这样。

import org.apache.commons.lang3.StringUtils;

public class ComplexityUtils{

    public static String ifNotBlank(String input, String output){
        return StringUtils.isBlank(input) ? output : input;
    }

}