【问题标题】:What impact does using these facilities have on orthogonality?使用这些设施对正交性有什么影响?
【发布时间】:2016-05-27 03:12:07
【问题描述】:
【问题讨论】:
标签:
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 的其他模块/类吗?答案是否定的——因为其他模块/类是通过接口而不是实现来编码的。
因此保持正交性。