重构代码只有return语句

时间:2015-04-03 15:16:26

标签: java algorithm refactoring

我试图重构此代码只有一个return语句,但我似乎无法弄清楚如何。我正在搜索树中的特定节点。树中的每个节点都可以有子节点。任何方向都将不胜感激

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

3 个答案:

答案 0 :(得分:3)

您可以使用break关键字突破for循环:

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

通过这种方式,您可以重构为单个return语句,尽管这对我来说似乎已经不再清楚了。在重构之前,您的代码没有任何问题。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我不建议一次回归;初步检查以查看名称是否匹配是否有意义并且清楚,并且最终的null返回自身很好。我会改变你的代码,通过消除else来减少其明显的复杂性 - 返回之后,不需要在else子句中放入后面的内容,因为当然只有当返回时它才会发生没有发生。我还建议使用一个类型列表,以便您可以使用“for each”循环而不是计数循环进行迭代:

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

你会看到我也做了很多重命名;我认为这些名称使代码更加清晰。