2011-04-14 70 views
0

我在這裏有兩個困境:我有幾個類,讓我們說A,B,C和D. A有一個公共接口,和B有一個關係(就像A有一個類型爲B的成員變量),並且A的方法之一是返回這個B對象,B只是一個暴露某些方法的類,C是另一個暴露其他方法的類,而D是一個單例對象。 D的公共接口具有對C類對象的引用(指針,如果你更喜歡的話)。C++的一些設計問題

所以,當我想在這一步繪製關係圖時,我會在A和B和C之間有一個關係會放在圖上,與其他兩個沒有明顯的關係。所以,這是基於頭文件(.h),其中包含類A,B,C的聲明。我現在對D有點困惑。

在另一端:

  1. A和B兩者的實現(在cpp文件)嚴重依賴於從C類創建的對象(無,C是不是標準,如表,字符串,隊列,但在我的應用程序中另一個有意義的類)。
  2. A和B的實現都使用D單例與本地C對象。

這裏是我的問題:

  1. 我應該把A,B,C和d之間的類圖上什麼關係,還不算我已經確定了一個(A HAS-A B) ?我對單身D與C類的關係特別感興趣。
  2. 什麼是這種情況下普遍接受的方法(當接口沒有對象之間的關係時,因爲沒有關係,但是在實現中它們是大量使用)?
  3. 如果我按照Java而不是C++有相同的問題會有區別(因爲在java中與類有關的所有東西都在一個文件中,所以很容易看出類方法實際使用的是什麼,而在C++中你通常只看到頭文件)。

非常感謝您的指導。

+1

爲什麼單身? – 2011-04-14 13:03:27

+0

如果你還沒有在頭兩段中描述你所描述的內容。然後當你有這個問題時,將它添加到你的問題中,這將有助於我們理解這些關係,即使該圖不完整。重要的是要先畫出你所知道的。 – nathan 2011-04-14 13:05:15

+2

由於嘗試將單例裝入其他易於管理的設計而引起混淆。無所事事,萬事俱備,他們在一張關係圖上跺腳,把它縮小成意大利麪條。大約99%的時間應該避免使用全局對象;當你確實需要一個,幾乎肯定不應該是一個單身人士,除非你有一些非常離奇的要求。 – 2011-04-14 13:10:41

回答

1

您提供的大部分信息應在下列 圖(plantuml輸入)中可識別。我希望能回答第一個問題。

@startuml 
class A 
A o--> B 
A : + method() 
A : + B& getB() 
A : - B m_B 
A --> "getC" D 

class B 
B : + method() 
B --> "getC" D 

class C 
C : + method() 

class D <<Singleton>> 
D --> "0..n" C 
D : + C* getC(int index) 
D : - list<C> m_containerOfC 

@enduml 

關於第二個問題:我想畫UML圖(我想爲設計)主要是關於抽象的,因此忽略了細節的地步。在編寫完程序後,試圖在UML中表達一個完整的C++程序是毫無意義的。你可以購買(嘗試)爲你做的程序,但是我不認爲這些圖表是有用的。

第三個問題的答案是,在設計階段,Java和C++實現的UML應該是相等的,或者至少是相當大的比例。設計是關於選擇和連接設計模式等,這些都是獨立於語言的。當你開始詳細描述你的圖表來表示更多的實現細節時(例如使用的容器類型等),那麼所選擇的實現語言就會發揮作用。然而,在那個階段,你應該問自己,你的圖表是否能夠讓你對設計有足夠的信心,然後開始對它進行編碼。

1

您應該確切閱讀本書Large-Scale C++ Software Design

它特別是接口和實現之間的依賴關係的模型交易,推出了兩款新型關係使用,在最接口使用,在最實施,而不只是傳統的「人─一個」。

隨後,它進入上與施加到這種建模(如隔離絕緣封裝等)的設計原則。不過,它確實是一本技術性很強的書。所以要做好準備!