2009-08-30 49 views
1

我知道爲什麼你會在另一個內部組成某個對象的原因很多。一些思想流派已經明確了以某種方式構建程序的原因,例如, '數據驅動設計'或'域驅動設計'。我仍然是面向對象的初學者,而且我很難理解爲什麼一個對象應該被另一個對象包含。有時候,我發現自己的對象看起來很棒,然後我意識到,「好吧,現在我必須放在這個地方嗎?」這背後的推理類似於我決定將文件放在我的硬盤上的原因嗎?組成特定對象的動機因素?

我有一對夫婦的指導原則是:

  • 如果模型在物理世界的關係。
  • 如果作曲家有數據需要構造對象。
  • 如果組成對象將會聽作曲家。

當你作出這個決定時,你看什麼?

+0

這是* object * containment(即集合?)還是* class definition * containment(即定義另一個類中的類)?您在問題中間切換條款。 – 2009-08-30 02:42:29

回答

3

好吧,一個非常簡單的概念幫助我,這只是「有一個」與「是一個」的概念。問問你自己,包含對象是包含對象的東西,還是包含對象的東西?如果它是包含對象的東西,那麼包容是適當的。否則,也許你應該看繼承。

狗是動物,並有鼻子,所以它是:

class Animal 
{ 
} 

class Dog : Animal 
{ 
    Nose n; 
} 

現在能正常工作。採用這種方法的一個「問題」是你緊緊地結合了鼻子和狗,所以有時你會看到包含界面指針而不是對象的東西,或者你可能會使用Google的「依賴注入」。但俗話說,「有一個」和「一個」往往足夠接近政府工作。

早些時候,只是嘗試大量的例子,隨着時間的推移它會變得自然。如果你最後吃意大利麪條,扔一些肉丸,然後再試一次! :)

0

你在考慮什麼替代方案?你是在談論遏制還是繼承,John Lockwood對hasA和isA的評論有助於解決這個問題。

或者您是在談論遏制與協會? hasA有各種口味。例如,一個人可能有配偶,但顯然不包含配偶。改變配偶和改變鼻子是有區別的。

您認爲該種關係:

  • 壽命:是否有意義,而不鼻子創建一個人?沒有人可以存在鼻子嗎?一個人沒有配偶可以存在嗎?這些問題的答案會推動您選擇在Person上進行的操作。可能不需要setNose()方法,雖然也許我們需要一個wipeNose()方法,並且我們可能需要一個結婚(Person)方法。

  • 基數:一個人有多少鼻子?車輛有多少個車輪和座位?這樣的答案決定了數據結構的種類?只是參考?一個列表?一個哈希表?

我發現它有助於閱讀有關UML建模,尤其是類圖。這反映瞭如何有用地捕捉各種關係的很多經驗。

0

有時候,我覺得自己有 對象,似乎真棒,然後我 得到的地步,我才意識到, 「好了,現在我已經把這個 地方?」

從上面的句子來看,這聽起來像是在嘗試從下往上進行設計。多年來我學到的東西之一就是自上而下的設計是一條路。 只有在知道需要使用的地方後,才能編寫該課程。否則,你最終會寫出「看起來很棒」的類,幷包含可能根本沒用的代碼。

+0

是啊!這聽起來很準確;謝謝。但是,我知道設計是自上而下和自下而上的相互作用,然後再次重複廣告的惡作劇。似乎從未有過明確的「路要走」:/ – Pup 2009-09-06 03:18:04