cocos2d x設計模式發掘之五 防禦式程式設計模式

2022-03-13 10:12:02 字數 2116 閱讀 8970

分類: cocos2d-x

2013-04-10 02:58

342人閱讀

收藏 舉報

宣告:防禦式程式設計是提高程式**質量的一種手段,它不能算是真正意義上的模式。但是,這裡,我還是要給它冠之以「模式」二字。

原因有2:

1.cocos2d-x的框架源**大量採用了防禦式程式設計技術,用來確保框架的**質量和穩定性。

2.標題黨,引起大家對於防禦式程式設計的重視。特別是當大家給cocos2d-x貢獻源**的時候,更應該要注意保證**質量。因為,王哲大大在review很多人給cocos2d-x貢獻**時發現,這種防禦式程式設計**並不多,需要引起我們的注意。

1.應用場景

首先,第乙個大量使用的是cclayer的init函式:

bool

cclayer

::init

()while(0

);return

bret;}

這裡使用了do…while(0);慣用法,同時配合cc_break_if巨集來做錯誤處理。關於為什麼要使用do…while(0)慣用法,可以參考這篇文章:

另乙個地方就是一些記憶體管理的巨集,這些巨集可以幫助我們編寫更健壯的記憶體管理**:

#define

cc_safe_delete(p

)do}while(0

)#define

cc_safe_delete_array(p

)do}while(0

)#define

cc_safe_free(p

)do}while(0

)#define

cc_safe_release(p

)do}while(0

)#define

cc_safe_release_null(p

)do}while(0

)#define

cc_safe_retain(p

)do}while(0

)最後乙個地方,就是在函式的入口處,或者需要保證某些「不變數」的時候,使用assert斷言來確保引數和返回結果的有效性。這個在cocos2d-x的源**中也到處是可以看到的。

2.使用此模式的優缺點

優點:提高**質量,使得**的健壯性和穩定性都有保障。可以防止子程式由於接收到了非法資料而遭受破壞。

缺點:過度的防禦式程式設計也會引來問題,如果你在每乙個能想到的地方用每一種能想到的方法檢查從引數傳入的資料,那麼你的程式將會變得臃腫而緩慢。更糟糕的是,防禦式程式設計引入的額外**增加了軟體的複雜度。所以運用是需謹慎。

3.此模式的定義及一般實現

子程式應該不因傳入錯誤資料而被破壞,哪怕是由其他子程式產生的錯誤資料。

我們一般可以採用以下手段來進行防禦式程式設計:

1)檢查每個子程式的入口引數,記住「垃圾進、垃圾出」這個隱喻。必要的時候可以使用斷言來確保函式的先驗條件是符合假定的。因為很多時候,我們編寫**都是隱藏了一系列的假定的,只是你自己沒有感覺到,有時候,這些假定沒有關係,出了bug也容易找出來。但是,有時候,就不是那麼幸運了。

2)不要直接使用文字常量,比如3、「hero.png」這種常量。盡可能地定義const定義常量或者使用巨集定義。

3)盡可能讓函式返回一些東西,這樣如果當函式執行出現問題時,可以根據返回值做一些處理。如果全部設計成void型別的函式,那麼出現異常要麼就是try—catch,要麼就是直接讓程式崩潰了。由於c++的異常機制並不是那麼完善,所以,也一直為人們所詬病,cocos2d-x裡面幾乎沒有使用c++的異常處理機制。最後,必要的時候要檢查函式裡面呼叫其它子程式時的返回值。

4.實際開發中如何採用此模式

在實際開發中,我個人覺得必要的防禦式程式設計的態度和做法還是要有的。特別是函式的輸入輸出,因為函式的邏輯部分是我們關注地最多的,雖然它是最複雜的,但是,往往這部分出錯的概率不高。

相反,是函式的一些邊界條件和異常情況導致程式bug的滋生。有些時候除了驗證函式引數的資料值範圍有效性以外,更加要注意的是驗證資料的業務條件是否滿足。這一點恰恰最容易被忽視。

在做記憶體管理的時候,盡可能地使用cocos2d-x裡面定義的一些巨集來清理資源,比如cc_safe_delete等。當實現自定義的cclayer物件的時候,也盡可能地採用do…while(0)的寫法,如果裡面出現問題,可以用cc_break_if來判斷並退出。

5.此模式與其它模式的關係

暫不討論

Cocos2d x的設計模式

單例模式 單例模式的定義是產生乙個類的唯一例項,但js本身就是一種 無類 語言,很多講就是設計模式的文章把 當成乙個單例來使用也勉強說的通,因為js生成物件的方式有很多種。簡單工廠模式 簡單工廠模式是由乙個方法來決定到底要建立哪個類的例項,而這些例項經常都擁有相同的介面,這種模式主要用於在所例項化的...

Cocos2D X設計模式 組合模式

在開始挖掘cocos2d x裡面的組合模式之前,我先武斷地下個結論 幾乎所有與gui相關的框架設計都應用了組合設計模式 ps 大家注意我的用詞,是 幾乎所有 給自己留條後路,哈哈 說到樹,我們馬上就會想到樹根,樹幹和樹葉。一棵樹一般只包含乙個根,若干樹幹和大量的葉子。同時,樹幹長在樹根上,樹葉長在樹...

cocos2d x設計模式發掘之三 管理者模式

想必讀者一看這個題目又要納悶了,神馬又是 管理者模式 啊?管理者 manager 就是專門負責管理其它類的例項的類,比如 cocoa 裡面的nsfontmanager nsinputmanager nsfilemanager 和nslayoutmanager 類。此模式和 二段構建模式 一樣,也沒有...