| Symbian OS上的應用程式使用一組標準的約定來命名類(class)、結構(struct)、變數(variable)、函數(function)、宏(macros)、枚舉(enumeration)和常量(constant)。本主題解釋這些約定的意思。 類(class)的命名 大多數類的命名是通過加前置詞字元C,T,R,M構成的。下面簡單說一下它們表示的意思: C:C首碼表示類從CB ase派生並應該基於堆構造。 T:T首碼表示一個簡單類,這種類不擁有任何額外的資源。 R:R首碼表示一個資源類,它包含其它位置擁有資源的控制代碼。 M:M首碼表示一個介面類,它定義了介面但需要衍生類別實現。 有關首碼更詳細的論述請參考 類類型(Class types--Developer Library » Symbian OS Guide » Essential idioms » Class types)。 那些由靜態函數構成的類沒有前置詞字元。除了前置詞字元,類名常常通過一個名詞表示類的用途。 結構(struct)的命名 結構(struct)類型作為T類對待,因為它也不擁有任何額外的資源,它的首碼通常是T(但也有一些以S開頭)。 變數的命名 成員變數的名字以i開頭,例如:iMember,這樣可以很容易檢查某些清除相關的規則。參數名以a開頭,例如:aControl或aIndex。局部變數命名不需要前置詞字元。全域變數應避免使用,使用時則第一個字母大寫。 Symbian不使用匈牙利(Hungarian)或是其它在名字中包含類型資訊的名字方法:那樣的話看起來很複雜並且當系統有幾百個類時不容易管理,因為它們總是不夠準確:函數通常很短,這樣可以方便的看到其中定義的變數的類型並且類瀏覽器(class browser)提供了快速找到類成員類型的方法。 函數的命名 函數的名字應當指出它要做什麼,通常用動詞表示,“獲得”類的函數是例外的情況:一個返回成員變數的函數,它的名字通常是除去首碼“i”的變數名: inline RWindow& Window() const { return iWindow; }; 一個對應的“設定”函數包含單詞“Set”,例如:SetWindow()。 出現錯誤而終止函數時Symbian平台並不使用標準C++的異常處理,它有自己名叫leave的異常處理系統(參考» Developer Library » Symbian OS Guide » C++ API guide » Base » Memory Management » Cleanup Support Overview)。可能產生leave的函數名字以L結尾,它使得檢查錯誤的過程更簡單些。函數new (ELeave)也可能產生leave。最基本的產生leave的函數是User::Leave()。任何函數中包含有上面的函數並且沒有捕獲異常,那麼它就可能產生異常,在寫代碼時它的名字就應該以L結尾。如果一個函數調用另一個可能產生leave的函數,它的名字也應該以L結尾。 與leave機制關聯的是清除棧(cleanup stack),它可以在leave產生時恢複在堆上分配的記憶體。把資源放到清除棧(cleanup stack)上的分配或建構函式以LC結尾,例如,經常把new,PushL(),ConstructL()按順序封裝到NewLC()函數裡: CS* s=CS::NewLC(p1, p2); 上面的操作是指派至,初始化並把它放到清除棧(cleanup stack)上,這個過程可能會產生leave(它總是包含PushL()的調用),所以這類的函數名總是包含有L,因此形成了以LC(C指清除棧(cleanup stack))結尾。 獲得對象的所有權並銷毀它的函數的名字以D結尾。UI架構中對話方塊的例子: CEikDialog* dialog=new (ELeave) CBossSettingsDialog; if (dialog->ExecuteLD(R_BOSS_SETTINGS_DIALOG)) { // handle successful settings } ExecuteLD()函數包含第二階段構造(second-phase construction),顯示對話方塊然後銷毀它的操作。 宏的命名 宏的名字全部用大寫表示並用底線分隔單詞。 枚舉的命名 枚舉按下面的方法命名: 枚舉當做簡單類型,擁有T首碼; 枚舉成員擁有E首碼; 類型和成員應該是有意義的,沒有二義性的名字。 枚舉應當被封裝到相關的類裡,那樣就不會與全域名字產生衝突。 下面是一個定義和使用枚舉的例子: class TDemo { public: enum TShape {EShapeRound, EShapeSquare}; }; TDemo::TShape shape=TDemo::EShapeSquare; 常量的命名 常量名包含一個K首碼,例如: const TInt KMaxNameLength=0x20; -------------------------------------- 對比自己的編程習慣,上面提到的規範中有幾點是自己還沒有引起足夠注意的 "一個返回成員變數的函數,它的名字通常是除去首碼“i”的變數名" 我的習慣是用Get+變數名,現在還是覺得遵循symbian的規範比較好,省去在每個獲得變數的函數名前加Get,簡潔又美觀。 “枚舉當做簡單類型,擁有T首碼;枚舉成員擁有E首碼;” 這樣的話,從枚舉變數名就可以知道它究竟是用於類的成員變數還是一個公用的枚舉類型。 “枚舉應當被封裝到相關的類裡,那樣就不會與全域名字產生衝突” 只要該枚舉變數與其他類沒有關係,封裝在類裡面還是很好的做法。 “常量名包含一個K首碼,例如:const TInt KMaxNameLength=0x20;” 不明白為什麼那麼人喜歡用十六進位表示整型,幹嘛不直接用十進位表示呢?一看就知道數值大小多好啊。 |