Posted on 2008-12-28 02:44
Fox 閱讀(2019)
評論(4) 編輯 收藏 引用 所屬分類:
T技術碎語
本文最早發布于我的個人主頁
一般的RPG游戲中,玩家角色、NPC、物品、場景等一般都具有為數眾多的各種屬性,使用C++編碼時,很容易考慮設計成為大量的成員變量和相應的存取函數:
class CObject
{
public:
long GetAttrA(void) const { return m_lAttrA; }
void SetAttrA(long lVal) { m_lAttrA = lVal; }
long GetAttrB(void) const { return m_lAttrB; }
void SetAttrB(long lVal) { m_lAttrB = lVal; }
...
long GetAttrN(void) const { return m_lAttrN; }
void SetAttrN(long lVal) { m_lAttrN = lVal; }
private:
long m_lAttrA;
long m_lAttrB;
...
long m_lAttrN;
};
乍一看,非常清晰明了。在一個稍顯復雜的項目中,想記住、甚至找到每一個屬性是非常難的,況且除了屬性,還有大量的邏輯處理,甚至是不同項目間的數據交互,比如將屬性的數據庫存取。這么做的缺點大致有這么幾點:
1. 屬性沒有明確分門別類,尤其在多人協作、多模塊編寫時,往往上面一批、下面一批,甚至有重復屬性、廢棄屬性,難于管理和把握;
2. 對于數據庫存取,需要寫單獨的存取接口,而且一旦屬性有增減、修改,存取接口要隨之修改;
3. 通過接口函數進行簡單的屬性存取面臨大量的堆棧保存,即使使用內聯或宏定義,也是治標不治本。
針對上述問題,我的思路也比較簡單:對基本類型數據進行二次封裝。
struct tagDBAttrs
{
long lA;
long lB;
...
long lN;
};
class CObject
{
public:
const tagDBAttrs& GetDBAttrs(void) const { return m_DBAttrs; }
void SetDBAttrs(const tagDBAttrs& rDBAttrs)
{
memcpy(&m_DBAttrs, rDBAttrs, sizeof(m_DBAttrs));
}
private:
tagDBAttrs m_DBAttrs;
string m_strA;
CObject* m_pObjB;
CShape* m_pShapeC;
...
};
之所以提到基本類型數據,主要緣于基本類型構成的結構可以通過sizeof
運算符直接確定,而像類對象等組合類型,其深拷貝、賦值、操作及賦值等邏輯則較為復雜,一般無法統一處理。
以上面的tagDBAttrs
為例,對于基本類型數據處理具有非常大的優勢,尤其在數據整體存取時,此外,增減基本類型屬性也比較簡單,而且不需要重寫Get/Set
接口,同時方便了對屬性的分門別類處理。
此處順便談談關于開發中的一些雜的體會。
對于工作不久的同學而言,拿到一個任務有可能出現以下兩種情況:
1. 以快速開發為重,前期進展較快,在小型模塊開發中順風順水,但在面對復雜任務時,因為對前期設計重視不足,后期會不斷調整代碼,甚至在基本功能開發結束后,因為邏輯架構問題,導致bug隱患較多較深,容易陷入泥沼,痛苦掙扎;
2. 隨時隨處追求代碼結構的優美和執行效率的優化,精益求精,往往在前期設計上花費過多的心思,以達到較合理的邏輯結構,甚至拖延整個項目的開發進度,這種同學一般說來,代碼質量較高,后期bug較少。
其實,上面說的就是我自己,我剛開始工作的時候,上面給我一個編寫獨立工具的任務,當時急于表現,缺乏項目實戰經驗,為編碼而編碼,邏輯結構不注重擴展性,設計不合理,在進行到后期時,面對出現的新需求無法應對,導致最后推到重來。
后來,慢慢接受了注重前期設計的觀念,更因為自己的完美情結和代碼潔癖,不僅經常調整自己編碼中不優美的片段,甚至越俎代庖去修改其他同事的代碼,追求處處的高效,耗費大量時間精力,難以自拔。
在任何一個項目中,都有輕重主次之分,也就是所謂的『8020原則』,關于『8020原則』怎么理解都行,我的理解就是,每個項目中的效率瓶頸是20%的核心代碼,80%的時間和工作重心應該放到這20%的核心代碼上。放到一個小的模塊中也是這樣,應該確定工作重心,在開發進度的限制下,對核心代碼精益求精,對非效率瓶頸可以適當減少側重。
對于新人,最難的就是從整體的高度確定20%的工作重心,這主要依賴于自身素質的提高和開發經驗的積累。而對需求深入細致的分析和對邏輯精益求精的設計本身可以訓練一個人分析問題、解決問題的能力。
總結一下的話,也正是我們項目組歷來所倡導和堅持的:
1. 精益求精;
2. 細節決定成敗,態度制約能力。