Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 静态语言中的隐私_Oop_Unit Testing_Language Agnostic_Private_Language Design - Fatal编程技术网

Oop 静态语言中的隐私

Oop 静态语言中的隐私,oop,unit-testing,language-agnostic,private,language-design,Oop,Unit Testing,Language Agnostic,Private,Language Design,虽然我理解实现/接口区别的价值,但我不明白为什么大多数OO系统在访问私有成员时会出现错误 我确实不想在我的主程序中访问私人成员 但我希望有权进行测试和调试 有什么好的理由发出错误而不是警告吗?在我看来,我被迫要么编写我可以测试的代码,但不使用语言支持接口,要么使用语言支持,但测试有困难 编辑 对于那些建议使用公共接口的人。可以,但不太方便。 在概念层面上,我发现隐私并不关心谁或什么时候很粗鲁。 朋友班似乎是一个合理的解决方案。另一个可能是“所有公共”编译器开关。显而易见的原因是太多人似乎忽视了许

虽然我理解实现/接口区别的价值,但我不明白为什么大多数OO系统在访问私有成员时会出现错误

我确实不想在我的主程序中访问私人成员
但我希望有权进行测试和调试

有什么好的理由发出错误而不是警告吗?在我看来,我被迫要么编写我可以测试的代码,但不使用语言支持接口,要么使用语言支持,但测试有困难

编辑

对于那些建议使用公共接口的人。可以,但不太方便。
在概念层面上,我发现隐私并不关心谁或什么时候很粗鲁。

朋友班似乎是一个合理的解决方案。另一个可能是“所有公共”编译器开关。

显而易见的原因是太多人似乎忽视了许多(所有?)警告。在某些语言(例如Python)中,这与您所说的差不多——某些“私有”的东西基本上是针对直接使用它的外部代码的建议,但编译器并不强制执行

至于我的感觉有多大,我怀疑它在语言之间是不同的——在C++之类的东西中,对它们的态度(“保护墨菲,而不是马基雅维利”)可以被看作是警告而不是错误。 我认为在艾达中,可以说,这将收到更为冷淡的接待,至少可以说(这并不是说我认为它也会受到C++程序员的热烈欢迎,只是他们可能不象大多数艾达程序员那样讨厌这个想法)。
另一方面,我不得不考虑一个不能通过外部接口进行测试(至少相当好)的类的设计。在难得的(应该是罕见的,无论如何)的场合,你不能,我认为让测试类成为朋友(C++语言,尽管很多其他人有相似的概念)将是相当容易证明的。

< P>有完整的封装的几个优点:

  • 安全性。具有强封装的强类型OOP语言可以对程序中数据的安全性有一定的保证。Java语言的设计考虑了安全性和安全性,因此某些库类(例如,
    String
    SecurityManager
    )无法访问其字段。这可以防止恶意代码对这些对象做坏事,并允许代码假定这些对象是安全的

  • 可维护性。保持
    private
    字段和方法
    private
    的主要原因之一是允许实现无缝更改;只要不对公共接口进行更新,使用更新的类的代码就可以在不做任何更改的情况下工作。如果允许访问
    private
    字段,然后更改实现,则可能会破坏大量代码

  • 稳定性/可验证性/可测试性。类通常在其字段上施加不变量-例如,动态数组的实现可能需要字段跟踪实际使用的空间量与元素总数相对应。允许人们任意访问
    private
    字段,即使有警告,也可以打破这些不变量。如果没有依赖不变量的能力,就很难或不可能对代码的正确性进行推理。此外,如果您确实在代码中的某个地方破坏了一个不变量,那么您可能必须查看程序中可以访问该对象的每一段代码,因为它们中的任何一段都可能正在访问
    private
    字段。使用强封装时,这些不变量不会被破坏,使用通过
    friend
    s或包私有机制的半封装时,要查看的代码量是有限的

至于你关于测试的问题——许多语言允许在某些情况下破坏封装;C++有<代码>朋友< />代码,java有包私有等,这样类就可以说“通常你不能触摸这些,但是可以做例外”。然后你可以把你的测试代码变成“代码>朋友< /C>”或者在与主类相同的包中,以便更彻底地测试它。
希望这有帮助

我的看法是,您需要忘记访问对象中的任何内容,除非您在该对象的接口中有这样做的方法。我认为,如果您试图直接访问特定于实现的私有成员,正确的OO系统应该发出错误(而不是警告)。我最近参加了Kevlin Henney关于这个主题的一次很好的演讲,我发现它非常有用,这里可以看到一个副本:(注意,它主要是关于java的,但也包括与其他OO系统的比较)

对于大多数测试,我发现测试中的大多数代码都包含在公共接口调用中。只有在极少数情况下,我才需要使用运行时反射之类的方法来获得绝对100%的覆盖率。

我正要发布“强大的封装强制执行可以防止您的老板踩到您的私人成员。”直到我意识到这听起来可能有误,但经过仔细考虑后,这是一个错误 大概是对的

在我看来,我被迫要么编写我可以测试的代码,但不使用语言支持接口,要么使用语言支持,但测试有困难

为什么需要访问
private
变量和函数?要么它们在某个时刻被
public
函数调用(无论多么间接),要么它们只是不可访问的代码片段,根本不应该存在,因为无法调用它们。想想看,如果
私有
方法是完全不可能的