公共方法调用具有相同名称的私有方法 - 这种模式是啥?

Posted

技术标签:

【中文标题】公共方法调用具有相同名称的私有方法 - 这种模式是啥?【英文标题】:Public method calls private method with the same name - what is this pattern?公共方法调用具有相同名称的私有方法 - 这种模式是什么? 【发布时间】:2014-11-25 01:37:02 【问题描述】:

考虑一下来自 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 SRP 不代表单一职责原则 是的,你是对的 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

这是可选参数的实现。它用于提供一个 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 啊。没注意那个细节。也许是为了让派生类能够访问底层方法,以便调用替代行为? 我不这么认为。您不能从派生类访问私有方法。

以上是关于公共方法调用具有相同名称的私有方法 - 这种模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c 中的私有方法不是私有的

第20条:为私有方法名加前缀

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性和私有成员与代理模式的介绍

方法调用公共/私有成员或方法最佳实践 - C#.NET

单元测试私有方法:外观模式