2012-07-11 48 views
3

我在閱讀The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt, David Thomas。當我讀到關於正交性的術語時,我在想我正確地做到了。我對此非常瞭解。然而,在本章最後,有人問了幾個問題來衡量對這個問題的理解程度。當我試圖回答這些問題時,我意識到我還沒有完全理解它。爲了澄清我的理解,我在這裏提出這些問題。使用這些設施對正交性有什麼影響?

C++支持多重繼承,而Java允許一個類實現多個接口。 使用這些設施 對正交性有什麼影響?使用多個 繼承和多個接口之間有什麼不同?

回答

6

實際上這裏有三個問題捆綁在一起:(1)支持多重繼承對正交性的影響是什麼? (2)實現多個接口對正交性的影響是什麼? (3)這兩種影響有什麼區別?

首先,讓我們來看看正交性。在Unix編程的藝術中,Eric Raymond解釋說:「在純正交設計中,操作沒有副作用;每個操作(無論是API調用,宏調用還是語言操作)都會改變一件事而不會影響其他操作。只有一種方法可以改變你所控制的任何系統的每個屬性。「

所以,現在看問題(1)。 C++支持多重繼承,因此C++中的類可以繼承兩個具有相同操作但具有兩種不同效果的類。這有可能是非正交的,但C++要求您明確指出哪個父類具有要調用的功能。這會將操作限制爲只有一種效果,因此維持正交性。見Multiple inheritance.

問題(2)。 Java不允許多重繼承。一個類只能從一個基類派生。接口用於編碼各種類型共享的相似性,但不一定構成類關係。 Java類可以實現多個接口,但只有一個類正在執行,因此調用方法時應該只有一個效果。即使一個類實現了兩個接口,它們都有一個具有相同名稱和簽名的方法,它將同時實現兩個方法,所以應該只有一個作用。見Java interface.

最後問題(3)。不同之處在於C++和Java通過不同的機制保持正交性:C++通過要求明確指定父級,所以在效果中不會有歧義;和Java通過同時實現類似的方法,所以只有一個效果。

0

無論您擴展的接口/類是多少,該類中只有一個實現。假設你的班級是X. 現在正交性說 - 一個變化只應該影響一個模塊。 如果您在類X中更改了一個接口的實現 - 是否會影響使用您的類X的其他模塊/類?答案是否定的 - 因爲其他模塊/類是由接口編碼而不是實現。 因此保持正交性。

相關問題