2012-02-01 82 views
1

我想真正得到一個好主意如何在OOP術語中思考,所以我有一個半假想的場景在我的腦海中,我正在尋找有些想法。模擬大量與其他對象相關的對象(「有」)

如果我想爲不同類型的人進行互動模擬,他們每個人都可以在不同的「技能」中獲得不同的熟練水平,那麼最佳的方法是什麼?

這真的是「技能」的東西,我有點着迷。我的要求如下:
- 每個人無論是「擁有」一個技能或不
- 如果人有一技之長,他們也有與技能
-I需要一種方法來查找和相關的「熟練程度」挑選出每個具有一定技能或者某種水平的人 - 設計需要可擴展(即,我需要能夠在後面添加更多「技能」)

我考慮了以下選項:

  1. 對於我所包含的每一項技能都有一個巨大的枚舉, e人類包含一個 「int技能[TOTAL_NUM_SKILLS]」成員。該陣列將具有「未獲得技能」的零,以及1到(最大)熟練水平的「獲得技能」。

  2. 具有相同的巨人枚舉,並有專人類包含地圖與技能相關的技能(從ENUM)和數字,這樣你可以只添加所獲得的技能,地圖等一批關聯這辦法。

  3. 創建的每一個技能的具體類,並讓每個從一個抽象基類繼承(ISkill,說的),並有專人類有地圖ISkill的

真的,選項1看起來像是直截了當的沒有廢話的做法。請批評;有沒有理由不接受?有更多的面向對象的方式來做到這一點嗎?

我知道選項3現在沒有什麼意義,但是如果我決定稍後再延長這一點,讓技能不僅僅是與他們相關的熟練程度的東西(即,實際上將新動作與技能相關聯( ISkill :: DoAction等),這是否有意義作爲一個選項?

對於廣泛的問題,我只想看看這種思路是否有意義,或者如果我吠叫完全錯誤的樹

+0

請停止標記標題和簽名帖 – 2012-02-24 16:46:45

回答

1

選項1的問題在於未來的兼容性,假設您將此框架發佈給客戶,那麼客戶已經構建了這個數組,其值爲TOTAL_NUM_SKILLS,每個人。但是,只要您嘗試添加其他技能,特別是在嘗試重新排序技能時,就會失敗。

如果客戶使用RPC框架,客戶端和服務器通過線路傳遞Person對象會怎麼樣?現在,除非客戶在同一時間升級客戶端和服務器,否則RPC調用會中斷,因爲現在客戶端和服務器期望不同長度的數組。這可能特別棘手,因爲客戶可能只擁有客戶端,或者只擁有服務器,並且無法一次升級。

但它變得更糟。假設客戶端在某個文件中寫出了一個Person對象到磁盤。如果他們決定將一個人序列化爲一個簡單的數字列表,那麼新技能將導致反序列化代碼失敗。更糟糕的是,如果你在你的枚舉中重新排列技能,反序列化代碼可能工作得很好,但給出了錯誤的答案。

我想正是針對你的原因選項3:以後你可以添加更多的功能,並安全地這樣做(當然,除了那些every public change is a breaking change如果你的客戶一定的行使邊界情況在語言的事實)。

+0

有趣。你有沒有遇到這樣的情況? – 8bitcartridge 2012-02-01 21:40:16

0

如果你想在不改變整體程序結構的情況下增加技能,我會考慮某種外部數據文件,你可以在不重新編譯代碼的情況下更改。想想你想在一個非常大的項目中做到這一點。選擇技能的人可能是一個沒有編程能力的設計師。他可以在XML文件中編輯技能,但不能在C++代碼中編輯。

如果您定義了XML中的技能,它自然會延伸到存儲更多數據與每種技能。您的玩家也可以被序列化爲XML文件。

當您在運行時設置玩家的技能時,您可以從XML文件構建一個鍵入技能名稱的哈希表。如果列舉玩家的技能比查詢玩家是否具備某種技能更爲常見,則可以使用字符串向量。

當然,這個解決方案會使用更多的內存,運行速度比您的枚舉解決方案慢。但它可能會足夠好,除非你與你的計劃中的數百萬玩家打交道。