Сокращение вложенных циклов и улучшение читабельности в Java - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над Java-приложением. Сонар жалуется на вложенные циклы за наличие более 3 вложенных циклов.

Код:

if(someCondition){
  List<Integer> list = getIds();

  if(list != null){
     for(int id : list){
         String str1 = someObject.getStr();
         String str2 = someObject.getString();
         if (StringUtils.isBlank(str1)) {
             str1 = NA;
          }
          if (StringUtils.isBlank(str2)) {
              str2 = NA;
           }
        // something else
     }
  }

}

Ошибка сонара:

Refactor this code to not nest more than 3 if/for/while/switch/try statements. 

Как я могу решить эту проблему? Я не могу думать ни о какой другой идее, кроме как хранить ее в отдельном методе, который добавляет ненужные дополнительные шаги и также увеличивает количество строк кода. Есть ли другая альтернатива для этого вопроса?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Просто немного упрощения:

    List<Integer> list;
    // Declare the list outside if-condition

    if (someCondition && (list = getIds()) != null) {
    //                   ================   assign it to getId() right inside the condition check

        for (int id : list) {

            // declare same type variables via a comma
            String 
                str1 = obj.getStr(),  
                str2 = obj.getString();

            // get rid of unobligatory {} brackets
            if (StringUtils.isBlank(str1)) str1 = NA;
            if (StringUtils.isBlank(str2)) str2 = NA;

            //something else
        }
    }
0 голосов
/ 03 июля 2018

Я думаю, ваш код не является вложенным loop больше 3, более 3 вложенных , если . Возможно, вы можете улучшить свой метод getIds (), который никогда не возвращает ноль, поэтому по какой-то причине метод не должен возвращать ноль. Если значение должно быть нулевым, тогда вы можете использовать return или break для завершения программы, например:

if(list == null)
  return;

Наконец, вы можете попробовать троичный оператор, чтобы убедиться, что значения str1 и str2.

  String str1 = StringUtils.isBlank(someObject.getStr()) ? NA : someObject.getStr();
  String str2 = StringUtils.isBlank(someObject.getString()) ? NA : someObject.getString();
0 голосов
/ 03 июля 2018

Вы можете сделать следующее:

boolean someConditionIsTrue;
List<Integer> list;

if(someCondition){
    someConditionIsTrue = true;
    list = getIds();
}

if(list != null && someConditionIsTrue){
    for(int id : list){
        String str1 = someObject.getStr();
        String str2 = someObject.getString();
        if (StringUtils.isBlank(str1)) {
            str1 = NA;
        }
        if (StringUtils.isBlank(str2)) {
            str2 = NA;
        }
        //something else
    }
}

Однако, это не так уж и элегантно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...