公共方法调用具有相同名称的私有方法——这种模式是什么



考虑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...
}

这是一种非常常见的方法——公共方法委托对具有相同名称但具有附加参数的私有方法的调用。这个图案有名字吗?

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

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

这是可选参数的实现。它用于提供一个API,如果你在没有可选参数的情况下调用它,它将使用正常(最好)默认值:

String.splitByCharacterType(text);            // splits the normal way
String.splitByCharacterType(text,CAMEL_CASE); // splits the alternative way

注意:我从来没有使用过ApacheStringUtils,所以上面的例子可能是错误的,但这只是为了说明用例。

在一些语言(如C++)中,该语言直接提供语法来支持这种用例:

char*[] splitByCharacterType(char* text, bool camelCase = 0) {
    // ...
}

在其他既没有函数重载也没有可选参数的语言中,可以使用varargs实现相同的用例。例如,在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

当你需要更多信息的时候。

相关内容

  • 没有找到相关文章

最新更新