公共方法调用同名的私有方法 - 这是什么模式?

6

考虑来自Apache Commons StringUtils的这段代码:

public static String[] splitByCharacterType(final String str) {
    return splitByCharacterType(str, false);
}

private static String[] splitByCharacterType(final String str, final boolean camelCase) {
    // Some code...
}

这是一种常见的方法 - 公共方法将调用委托给具有相同名称但具有附加参数的私有方法。这种模式有没有名称?

我会说这是DRY(不要重复自己)和SRP(单一职责原则)。 - Jehof
@Jehof SRP 不是指单一职责原则吗? - Kao
当然,是的,你是正确的。 - Jehof
2个回答

3

这更可能是Facade设计模式。它通常用于为子系统中的一组接口提供统一接口。但在这种情况下,我认为它被用来定义一个更高级别的实现,使子系统更易于使用。正如您所见,SplitByCharacterType(final String str, final boolean camelCase) 的参数有两个,但只有一个通过splitByCharacterType(final String str)暴露给外部世界。

隐藏实现细节也是封装的概念。因此,为其他用户提供他们需要知道/使用的内容,而实际处理则留给负责人员。


1
这是可选参数的实现。它用于提供一个API,如果您没有使用可选参数调用它,它将使用合理的(最好是默认的)值继续进行:
String.splitByCharacterType(text);            // splits the normal way
String.splitByCharacterType(text,CAMEL_CASE); // splits the alternative way

注意:我从未使用过Apache StringUtils,因此上面的示例可能有误,仅用于说明用例。
在某些语言(如C++)中,语言直接提供了语法来支持这种用例:
char*[] splitByCharacterType(char* text, bool camelCase = 0) {
    // ...
}

在其他没有函数重载或可选参数的语言中,可以使用可变参数来实现相同的用例。例如,在javascript中,您可以这样做:
function splitByCharacterType (text) {
    var camelCase = false;
    if (arguments.length > 1 && arguments[1] == true) camelCase = true;

    // ...
}

在一些语言中,你可以使用少于预期数量的参数来调用函数,并且未指定的参数将简单地赋值为null或undefined。例如,在JavaScript中,您也可以这样做:
function splitByCharacterType (text, camelCase) {
    if (camelCase != undefined) {
        // ..
    }
    else {
        // ..
    }
}

可选参数的概念与控制台应用程序的命令行参数基本相似。例如:
ls

上述调用生成的输出通常是您想要的,但您也可以执行以下操作:

ls -l

针对需要更多信息的情况。

你不能像你展示的那样使用 splitByCharacterType(),因为这个方法的第二个实现是 private - Kao
啊,没注意到那个细节。也许是为了让派生类可以访问底层方法,以便调用替代行为? - slebetman
我不这么认为。您无法从派生类访问私有方法。 - Kao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接