【问题标题】:What impact does using these facilities have on orthogonality?使用这些设施对正交性有什么影响?
【发布时间】:2016-05-27 03:12:07
【问题描述】:

我正在阅读The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt, David Thomas。当我阅读一个名为正交性的术语时,我认为我说得对。我非常了解它。然而,在本章的最后,提出了几个问题来衡量对该主题的理解程度。当我试图对自己回答这些问题时,我意识到我并没有完全理解它。因此,为了澄清我的理解,我在这里提出这些问题。

C++ 支持多重继承,而 Java 允许一个类 实现多个接口。 使用这些设施有什么影响 有正交性吗?使用多个之间的影响是否有差异 继承和多接口?

【问题讨论】:

    标签: multiple-inheritance conceptual orthogonal


    【解决方案1】:

    这里实际上捆绑了三个问题:(1)支持多重继承对正交性有什么影响? (2) 实现多个接口对正交性有什么影响? (3) 这两种影响有什么区别?

    首先,让我们了解正交性。在 The Art of Unix Programming 中,Eric Raymond 解释说:“在纯粹的正交设计中,操作没有副作用;每个操作(无论是 API 调用、宏调用还是语言操作)只改变一件事而不会影响其他操作. 改变你控制的任何系统的每个属性只有一种方法。”

    那么,现在来看问题(1)。 C++ 支持多重继承,因此 C++ 中的一个类可以从两个具有相同操作但具有两种不同效果的类继承。这有可能是非正交的,但 C++ 要求您明确声明哪个父类具有要调用的功能。这会将操作限制为仅一种效果,因此保持正交性。见Multiple inheritance.

    还有问题(2)。 Java 不允许多重继承。一个类只能派生自一个基类。接口用于编码各种类型的类共享的相似性,但不一定构成类关系。 Java 类可以实现多个接口,但只有一个类在执行,因此调用方法时应该只有一种效果。即使一个类实现了两个具有相同名称和签名的方法的接口,它也会同时实现这两个方法,因此应该只有一个效果。见Java interface.

    最后是问题(3)。区别在于C++和Java通过不同的机制来保持正交性:C++通过要求显式指定父级,所以效果上不会有歧义;和 Java 通过同时实现类似的方法,所以只有一种效果。

    【讨论】:

      【解决方案2】:

      无论您扩展了多少个接口/类,该类中都只有一个实现。假设你的班级是 X。 现在正交性说——一个变化应该只影响一个模块。 如果您更改类 X 中一个接口的实现 - 它会影响使用您的类 X 的其他模块/类吗?答案是否定的——因为其他模块/类是通过接口而不是实现来编码的。 因此保持正交性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        相关资源
        最近更新 更多