【问题标题】:Private Methods Over Public Methods私有方法优于公共方法
【发布时间】:2011-12-06 15:16:13
【问题描述】:

我正在检查StringTokenizer.java 课程,我想到了一些问题。

我注意到其他类将使用的公共方法调用了一些完成所有工作的私有方法。现在,我知道 OOD 的原则之一是尽可能多地私有化并隐藏所有实现细节。我不确定我是否完全理解这背后的逻辑。

我了解将字段设为私有以防止在其中存储无效值非常重要(这只是众多原因之一)。但是,当涉及到私有方法时,我不确定它们为什么如此重要。

例如,在StringTokenizer 类的情况下,我们不能把所有的实现代码都放在公共方法中吗?由于这些方法的 API(即调用这些公共方法的规则)将保持不变,它对使用这些方法的类有何影响?我能想到为什么私有方法有用的唯一原因是因为它可以帮助您编写重复的代码。例如,如果所有公共方法都做同样的事情,那么您可以声明一个私有方法来执行此任务并且可以被公共方法使用。

其他问题,与公共方法相比,在私有方法中编写实现有什么好处?

这是一个小例子:

public class Sum{

    private int sum(int a, int b){
        return a+b;
    }

    public int getSum(int a, int b){
        return sum(a,b);
    }
}

对比...

public class Sum{

    public int getSum(int a, int b){
        return a+b;
    }
}

第一个样本如何更有益?

【问题讨论】:

    标签: java encapsulation stringtokenizer private-methods public-method


    【解决方案1】:

    为了添加一些东西,私有方法总是可以安全地改变,因为你肯定知道它只能从自己的类中调用,没有外部类能够调用私有方法(他们甚至看不到它)。

    所以拥有私有方法总是好的,因为您知道更改它没有问题,即使您可以安全地为方法添加更多参数。

    现在考虑一个公共方法,任何人都可以调用该方法,因此如果您添加/删除一个参数,您还需要更改对该方法的所有调用。

    【讨论】:

    • 我不明白你的意思。如果我遗漏了什么,请原谅我。你说:“所以有一个私有方法总是好的,因为你知道改变它没有问题,即使你可以安全地为方法添加更多参数”。但是你面向客户端的公共 API 仍然是一样的。因此,您可以在公共方法中编写所有逻辑或在其中调用函数,或者执行任何查看公共 API 的客户端不会观察到任何差异的事情。实现中的代码仍然可以随时更改,这与更改私有函数的合同/实现一样好
    • @saury 在这种特殊情况下,是的,它是相同的 API,但您仍然不能保证它在未来会保持不变。根据我自己的经验,我可以从“哦,让我们直接将其公开,如果将来我们需要它私有,我们将更改它”的想法为您提供建议,最终发生的是这种方法从未成为私有的,所以它最好在一开始就进行一些过度架构,而不是在以后进行大规模的重构。
    • 如果公共方法调用您更改的私有方法“没有问题”,那么公共方法不会中断吗?如果是这样,那么“安全地改变”任何东西都没有任何区别;无论您更改什么,都必须经过测试 - 将其设为公开/私有不会在这件事上给您任何额外的安全性。
    【解决方案2】:

    我能想到为什么私有方法有用的唯一原因是因为它可以帮助您编写重复的代码。

    除了合并重复代码(通常表示为“不要重复自己”或“干”)之外,使用私有方法还可以帮助您构建和记录代码。如果您发现自己编写的方法可以做几件事,您可能希望考虑将其拆分为几个私有方法。这样做可以更清楚地了解每个逻辑的输入和输出是什么(以更精细的粒度)。此外,描述性的方法名称可以帮助补充代码文档。

    【讨论】:

    • 是的,我同意你的看法。我试图问的问题是,与公共方法相比,为什么在私有方法中编写实现代码是有益的?如果我们将所有代码都放在公共方法中,会有什么不同呢?本质上,我们仍然以相同的方式调用公共方法,并且我们仍然期望它返回与以前相同的结果。
    • @user600194 保持代码私有会隐藏实现细节,并允许在不中断 API 使用者的情况下更改实现。隐藏/封装的级别通常是任意的(有时是反复无常的)。
    【解决方案3】:

    当用 Java 或任何其他面向对象的语言编写干净的代码时,通常最干净、最易读的代码由简短的方法组成。经常出现的情况是,方法中的逻辑可以更好地表达在单独的方法调用中,以使代码更清晰、更易于维护。

    考虑到这一点,我们可以设想您有多种方法执行任务以实现一个目标的情况。想想一个只有一个复杂目的的类。该单一目标的入口点可能只需要一个起点(一个公共方法),但需要许多其他方法,它们是复杂操作的一部分(许多私人帮助方法)。

    使用私有方法,我们可以隐藏不能也不应该从类本身之外的任何地方访问的逻辑。

    【讨论】:

      【解决方案4】:

      公共方法通常是实现该类的其他类想要使用的代码。私有方法通常在类之外没有那么有用,或者(单独)不能满足类的目的。

      假设您在选择的 IDE 中,并且您实现了某个 A 类。A 类仅设计用于做一件事,例如文档生成。自然地,您将在 A 类中使用一些数学和字节操作方法来生成文档,但是尝试使用 A 类的人将不需要这些其他方法,因为他们只想要一个文档。因此,我们将这些方法设为私有,以便为我们类的任何未来用户保持简单。

      【讨论】:

        【解决方案5】:

        将方法声明为私有的目的是为了

        • 隐藏实现细节
        • 将该方法排除在公共 API 之外
        • 确保代码背后的逻辑没有被外部使用/误用
        • 大多数情况下,您的方法的执行取决于在它之前运行的其他方法;那么你也可以确保你控制了使用方法的正确顺序

        对你的方法使用私有,除非你打算在你的类上下文之外安全地使用你的方法。

        【讨论】:

          【解决方案6】:

          将函数设为私有可以在以下情况下为您带来优势:

          1. 将函数设为私有为 JVM 编译器提供了内联函数的选项,从而提高了应用程序性能
          2. 如果该类是可继承的并且您从子类扩展它,那么如果您想对子类隐藏函数,那么您可以这样做(您可以扩展 StringTokenizer)。
          3. 如果一段代码必须在多个函数中使用,您可以在私有实用程序方法中移动该代码

          【讨论】:

          • 你的#3不是私人的优势;共享代码可以是公开的也可以是私有的。
          • 好的,为了进一步解释我的观点,你有一组算法实现函数(全部公开)。现在,如果您的不同 API 需要计算两个数字的平方和的平方根,那么最好将此逻辑移动到一个以两个数字作为输入的私有函数中。公开这样的功能可能没有多大意义,因为您的课程正在为不同的算法问题联盟提供解决方案。使这样的函数公开可能会破坏该类的定义。
          【解决方案7】:

          在公共类中使用私有方法的一个优点也是一个很好的理由是为了安全和防止错误。声明为私有的方法只能由它们所属的类访问。这意味着您的私有方法不会被意外地从程序中的其他地方调用,从而减少错误和其他并发症。如果您将您的方法声明为公开的,则整个问题都可以访问它并可能导致复杂化。

          您可能有许多方法可以处理您不希望程序的任何其他部分能够干扰的某条数据。通过私有方法和/或变量使用数据封装有助于防止这种情况发生,并使您的代码更易于遵循和记录。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-19
            • 2011-04-18
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            • 2017-01-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多