2012-12-14 479 views
1

這個問題已經困擾了我好一陣子:OOP設計模式

我有一個Room類,並讓說,我想添加一個Ball實體。

Ball應該有xy座標代表這個房間中的一個位置。

所以這裏是問題:

什麼類應該保持座標?

1)每個Ball爲它自己。

2)Room將保存每個Ball的座標。

我知道這可能並不重要,但是首選或更受歡迎的是什麼?

編輯

什麼我其實擔心的是,對象可以改變它的內容但是它像,所以有它的一些第三方的限制會解決這個問題。但我想這隻適用於有多個用戶的應用程序,而不是我的情況。

+0

感謝您的答案,我會選擇第一個選項。 由於球也可能有顏色,所以讓他們在一個地方都會很聰明。 – Vladp

回答

7

說到對象設計,我的一個起始咒語是「對象知道關於它本身的所有內容」。想象一下球不得不問房間 - 我在哪裏?我會從拿着座標的球開始。這樣房間只需要知道自己和Ball對象的集合。相反,Ball知道關於它自己的一切。可以通過迭代該集合來收集房間可能需要的關於球座標的任何細節。當你開始爲你的房間添加其他物體時,你的設計也會受到很大影響。

0

我認爲這很大程度上取決於您如何看待問題。球是一個對象,每個對象在現實世界中都有一個座標。另一方面,房間是對象的容器,可以包含它包含的對象的位置。

我平時所做的,就是看我的程序開發起來會更簡單,因爲我太懶惰了:D。也就是說,我更喜歡從PositionableObject繼承Ball並將該座標存儲在該類中。所以,在這個父類的任何繼承之後,我的所有對象都將有座標或位置...

+1

* Room *是一個容器,這並不意味着它包含(直接)* Ball *的座標,只是它包含對包含對象的引用(並且它會自己銷燬這些對象)。 – user1284631

+0

這仍然取決於你如何看待問題。例如,對於robocup模擬服務器,服務器存儲每個玩家的位置並通知其位置的對象。你作爲一個人,不能說你在房間裏的確切位置,所以一個物體可能對它的位置有一個想法,但不是確切的位置...... –

+0

這是一個命令設計模式:http:// en。 wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Command – user1284631

0

如果房間類有一個球對象,並且球對象是房間內球的位置,我不得不說Ball對象應該有XY座標。

說一個房間沒有球;現在即使沒有球(壞設計),您仍然在Room對象內存儲球的X Y座標。

附加的,如果房間有多個球。每個球可能有不同的座標。

+0

「現在,即使沒有球,您仍然在球室對象內存儲球的X Y座標。」 - 您在那裏想念我。 – Vladp

+0

我的意思是,如果您要在房間中存儲xy座標,並且房間中沒有球,那麼您在房間對象中有一個球的X Y座標的屬性。想想,一個房間可能沒有球而存在嗎?也不能在一個不在一個房間裏的X Y座標? – james31rock

1

座標應該與Ball類一起使用。例如:您可以在Room中擁有一個,兩個,三個或更多(或動態數量)的Ball個實例,並且每個實例都有其自己的座標。

例外情況是,如果您需要對球的座標進行一些重處理,並且您希望將這些處理作爲矢量存儲。在這種情況下,選擇將這些向量作爲Room的成員。

0

在你所描述,想必具有座標球的特性是容易的,給予...點;-)

但更籠統的問題可能會令人吃驚THA情況:想象許多球和許多房間,每個都有更多的座標系統。只有在選擇了一個座標系之後,球的座標纔有意義,所以座標實際上是一個球和一個座標系之間的一個鏈接

如果你有興趣描述球在所有系統中的位置,這不能用線性組合來完成,但需要一組球,一組房間和一組座標,其中每個房間包含一組記錄,每個記錄都包含一個球參考和該球在該範圍內的座標參考。 球本身可以有一個集合或記錄,每個都是房間參考和座標參考。

你需要一個空間管理員,他是房間和球的朋友,並且負責更新所有的座標,如果一個房間或一個球被移動並保持收集的相互一致性。

但這遠遠超出了你最初的目的。我只是指出這一點,讓你考慮更廣泛的抽象。