将代码重构为只有 return 语句

Refactor code to only have only return statement

我正在尝试将此代码重构为只有一个 return 语句,但我似乎不知道如何重构。我正在搜索树中的特定节点。树中的每个节点都可以有 children。任何方向将不胜感激谢谢

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

你可以这样做:

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

您可以使用 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 语句,尽管这对我来说似乎不再清楚。重构前你的代码没有任何问题。

我不会建议一个人 return;初始检查以查看名称是否匹配合理且清晰,最后的 null return 本身就很好。我会改变你的代码的一件事,通过消除 else 来降低其明显的复杂性 - 在 return 之后,没有必要将后面的内容放在 else 子句中,因为当然它会发生,如果和只有 return 没有发生。我还建议使用类型化列表,以便您可以使用 "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;
}

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