2015-04-03 3 views
1

Я пытаюсь реорганизовать этот код, чтобы иметь только один оператор возврата, но я не могу понять, как это сделать. Я ищу конкретный узел в дереве. Каждый узел в дереве может иметь детей. Любое направление было бы оценен благодаряКод рефакторинга имеет только оператор возврата

private TreeNode getDefaultNode(List list, String supervisingGroupName){ 

    for (int i = 0; i < list.size(); i++){ 
     TreeNode tempNode = (TreeNode) list.get(i); 
     OSGroup temp = (OSGroup) tempNode.getNodeBusinessObject(); 

     if (supervisingGroupName.equals(temp.getName())){ 
      return tempNode; 
     } 
     else { 
      TreeNode node = getDefaultNode(tempNode.getChildren(), supervisingGroupName); 
      if (node != null){ 
       return node; 
      } 
     } 

    } 

    return null; 
} 
+1

Вы можете объявить «узел TreeNode» в начале метода и установить его в «null», изменить его в блоках 'if' и' else' и вернуть его в конце метода. – Titus

+1

Могу ли я спросить вас, почему? Я думаю, что они делают вас более читабельными, чтобы сказать, что метод может вернуть значение null. – StackFlowed

+0

Вы можете реорганизовать, чтобы иметь один возврат, но он сделает код менее читаемым –

ответ

3

Вы можете выйти из вашего для петли с break ключевым словом:

private TreeNode getDefaultNode(List list, String supervisingGroupName){ 
    TreeNode node = null; 
    for (int i = 0; i < list.size(); i++){ 
     node = (TreeNode) list.get(i); 
     OSGroup temp = (OSGroup) node.getNodeBusinessObject(); 

     if (supervisingGroupName.equals(temp.getName())){ 
      break; 
     } else { 
      node = getDefaultNode(tempNode.getChildren(), supervisingGroupName); 
      if (node != null){ 
       break; 
      } 
     } 

    } 

    return node; 
} 

Таким образом, вы может реорганизовать в единое заявление о возвращении, хотя это кажется мне уже неясным. Перед рефакторингом не было ничего плохого в вашем коде.

+0

Спасибо, что ответ сработал! – Hugs

0

Вы можете сделать что-то вроде этого:

private TreeNode getDefaultNode(List list, String supervisingGroupName){ 
TreeNode node = null; 
    for (int i = 0; i < list.size(); i++){ 
     TreeNode tempNode = (TreeNode) list.get(i); 
     OSGroup temp = (OSGroup) tempNode.getNodeBusinessObject(); 
     if (supervisingGroupName.equals(temp.getName())){ 
      node = tempNode; 
      break; 
     }else { 
      node = getDefaultNode(tempNode.getChildren(), supervisingGroupName); 
      if (node != null){ 
       break; 
      } 
     } 
    } 
    return node; 
} 
0

Я бы не посоветовал ни одного возвращения; начальная проверка, чтобы убедиться, что совпадение имен имеет смысл и понятно, и окончательный возврат нулевой цифры сам по себе. Я бы изменил одну вещь о вашем коде, чтобы уменьшить свою кажущуюся сложность, исключив else - после возвращения нет необходимости вносить то, что следует в предложении else, потому что, конечно, это происходит, если и только если возврат не произошел. Я также рекомендовал бы использовать список типизированных, так что вы можете перемещаться с «для каждого» цикла вместо цикла счета:

private TreeNode getNodeByName(List<TreeNode> nodes, String name) { 
    for (TreeNode node: nodes) { 
     OSGroup group = (OSGroup) node.getNodeBusinessObject(); 
     if (name.equals(group.getName())){ 
      return node; 
     } 

     TreeNode child = getNodeByName(node.getChildren(), name); 
     if (child != null) { 
      return child; 
     } 
    } 
    return null; 
} 

Вы видите, я также сделал совсем немного переименовании; Я думаю, что эти имена делают код более понятным.

Смежные вопросы