【问题标题】:Why private access for methods is more preferable than package-private?为什么方法的私有访问比包私有更可取?
【发布时间】:2018-05-16 12:09:02
【问题描述】:

Java 开发人员总是对在该类之外不使用的方法使用私有访问级别。已知benefits 这样做,但从另一方面来看,我们增加了单元测试的复杂性。在大多数情况下,我们的代码不被任何其他服务/API 使用,我们实际上并不关心“私人”利益。但我相信我们关心的是创建可读的简单单元测试。考虑到这一点,为什么不将类中的所有方法默认创建为“包私有”,并仅在我们真正需要时才将它们设为“私有”?

【问题讨论】:

  • “我们增加了单元测试的复杂性”是什么意思?
  • 如果你正在编写私有方法的测试,你只会增加单元测试的复杂性,这通常是没有用的。相反,编写使用它们的非私有方法的测试。无需仅仅因为您更改了类的内部实现而更改测试。
  • 当您编写涵盖私有方法的测试时,您需要使用开放/可访问的方法。这就是我所说的“增加单元测试的复杂性”。

标签: java oop private access-levels package-private


【解决方案1】:

为什么方法的私有访问比私有访问更可取 包私有?

我不会说它更可取。
这两种做法都是可以接受的,不要让我感到震惊。
现在应该尽可能地支持private,因为它可以防止不希望的耦合,而产生更多耦合的package-private应该与相关性一起使用。

在大多数情况下,我们的代码不会被任何其他服务/API 使用,并且 我们实际上并不关心“私人”福利。

即使您开发了一个供某些客户端使用的库,使用包修饰符也不错,因为 package-private 中的类不直接成为 API 的一部分。

但我相信我们关心的是创建可读的简单单元测试。 考虑到这一点,为什么不在类中创建所有方法 'package-private' 默认情况下,只有在 我们真的需要这个吗?

相反,单元测试和private 修饰符根本不兼容。
我同意使用 package-private 修饰符而不是 private 可以轻松测试/模拟/切换类的成员。
在某些情况下,这种做法是可以接受的。
现在将其概括为所有设计选择。
就我个人而言,我仅将package-private 修饰符用作真正相关的(测试的真正问题或在同一包的其他类之间共享的内部处理),因为除了使单元测试更容易(这是一个好点)之外,我认为这这种做法可能有利于将类耦合得比要求更强烈的设计。
例如,假设在 B 类中,您可以访问 A 类实例的字段/方法,因为它们在同一个包中。
假设从概念上讲,该字段是 A 实现的非常内部部分的一部分,并且它被其他类知道以允许以后更改它。
但是由于这个字段/方法是包私有的,现在没有什么能阻止你尽可能地做到这一点。
我不喜欢那样。

最后,我想说你不应该担心private 方法的单元测试。
内部不构成 API 的一部分。您无需对其进行测试。
现在,如果多次调用私有方法或者您确实需要测试此处理,则没有什么可以阻止您将其提取到另一个类中以使其可测试并在需要时有一种方法来模拟处理(以避免多次测试) .

【讨论】:

  • 良好的包分离可以关闭对方法的访问。我相信现在几乎所有的团队都有代码审查实践。所以在大多数情况下,我相信耦合对于包私有来说不是问题。如果有人可以在同一个包类/方法中创建,这意味着他也可以将私有访问更改为公共访问。这只能通过代码审查找到。今天连 IDE 都会建议您将方法修饰符更改为私有,如果它不在类外使用。这意味着您必须使用可访问的方法测试您的方法,恕我直言,这会增加测试复杂性并降低可读性。
  • davidxxx,对不起,忘了说谢谢您的意见。我想说的是,现在很大一部分开发人员根本不考虑方法访问。 IDE 说它可能是“私有的”,他们盲目地将其标记为“私有”。这种“私有”方法可能非常大,可能具有非常大的渐近复杂性,并且仅仅因为访问级别,它不会被 100% 覆盖。这就是我做出假设的原因,也许默认情况下,如果此方法未在类外部使用,它应该具有“包私有”访问级别。我们仍然会有适当的安全性和创建良好测试的可能性。
  • “我想说的是,现在大部分开发人员根本不考虑方法访问。”根据我自己的经验,不幸的是,很大一部分开发人员并不关心代码质量。也许您的想法来自您必须应对不够严格的开发人员的事实。这是一种我可以理解的解决方法,但我绝对不同意。
猜你喜欢
  • 2023-03-14
  • 2021-05-18
  • 1970-01-01
  • 2013-03-31
  • 2011-06-10
  • 1970-01-01
  • 2014-03-20
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多