Возрастающая цикломатическая сложность Null Check

У меня есть класс 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;
}

Я должен вручную проверять каждое поле, прежде чем использовать его где-нибудь. Поскольку указанный выше объект имеет более 10 полей, это, очевидно, увеличит цикломатическую сложность для этого метода. Есть ли для него оптимальное решение?

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: "");

Только для уменьшения сложности? Это по стандартам?


person Nayeem    schedule 10.11.2015    source источник
comment
Очень похоже: stackoverflow.com/q/32884754/1743880   -  person Tunaki    schedule 10.11.2015
comment
Можете ли вы иметь адресный объект, который используется как searchVO, так и postalAddress?   -  person Michael Lloyd Lee mlk    schedule 10.11.2015
comment
его сотрудник ВО на самом деле,   -  person Nayeem    schedule 10.11.2015
comment
Тунаки, ссылка, которую вы разместили, говорит if (something!= null) { this.something = something; } но все же это поле будет нулевым, если мы не установим его с помощью сеттера   -  person Nayeem    schedule 10.11.2015
comment
Можем ли мы использовать String country=employeeVO.getCountry(); postalAddress.setCountryCode((country!=null) ? Country: );   -  person Nayeem    schedule 12.11.2015


Ответы (2)


вызывающая сторона не обязана решать, устанавливать поле или нет, это должен быть сам метод.

В вашем случае это означает, что установщики должны решить, какое значение параметра устанавливать или нет.

Это перемещает сложность одного метода к отдельным методам и, следовательно, уменьшает сложность вызывающего объекта.

person Emerson Cod    schedule 10.11.2015
comment
Вы имеете в виду нулевую проверку в методах Setter? - person Nayeem; 10.11.2015
comment
да - ответственность за принятие решения о том, получает ли поле установленное значение или нет, должна быть внутри класса этого поля, а не снаружи, поэтому проверка нуля (и возможные другие проверки) должна быть в методе установки. Это также уменьшает проблему каждого вызывающего абонента, чтобы сделать все проверки - person Emerson Cod; 10.11.2015
comment
у вас в настоящее время if(CommonUtil.isNotEmpty(employeeVO.getCity())){ postalAddress.setState(employeeVO.getState()); } то, что я предлагаю, это просто postalAddress.setState(employeeVO.getState());, а в setState тогда if(CommonUtil.isNotEmpty(state)) { this.state = state; } - person Emerson Cod; 10.11.2015
comment
На самом деле это присутствует в файле Jar. Поэтому мы не можем изменить метод setState. - person Nayeem; 10.11.2015
comment
Можем ли мы использовать String country=employeeVO.getCountry(); postalAddress.setCountryCode((country!=null) ? Country: ); - person Nayeem; 10.11.2015

Этот код не уменьшает CC. У вас все еще есть ветка при использовании ternary.

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;
    }

}
person Jose Martinez    schedule 26.11.2015
comment
Позвольте мне попробовать это и просканировать с помощью сонара! - person Nayeem; 28.11.2015
comment
Хорошая идея в этой ситуации, потому что, по словам Найима, почтовый адрес нельзя изменить. Но если его можно изменить, это изменение должно быть вызвано внутри объекта postalAddress. Каждый класс должен нести ответственность за сохранение достоверности своих данных. На это указывает Эмерсон Код. - person user2367418; 30.10.2018