• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            羅朝輝(飄飄白云)

            關(guān)注嵌入式操作系統(tǒng),移動(dòng)平臺(tái),圖形開發(fā)。-->加微博 ^_^

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              85 隨筆 :: 0 文章 :: 169 評(píng)論 :: 0 Trackbacks

            [Cocoa][譯]蘋果 Cocoa 編碼規(guī)范中文版

            羅朝輝(http://m.shnenglu.com/kesalin/)

            CC許可,轉(zhuǎn)載請(qǐng)注明出處

            官方文檔:Coding Guidelines for Cocoa
            本文檔下載:點(diǎn)擊這里

             

            > Code Naming Basics 代碼命名基礎(chǔ)

            在面向?qū)ο筌浖斓脑O(shè)計(jì)過程中,開發(fā)人員經(jīng)常忽視對(duì)類,方法,函數(shù),常量以及其他編程接口元素的命名。本節(jié)討論大多數(shù)Cocoa接口的一些命名約定。

            >> General Principles 一般性原則

            >>> Clarity 清晰性

            ● 最好是既清晰又簡短,但不要為簡短而喪失清晰性

            代碼

            點(diǎn)評(píng)

            insertObject:atIndex:

            good

            insert:at:

            不清晰;要插入什么?“at”表示什么?

            removeObjectAtIndex:

            good

            removeObject:

            這樣也不錯(cuò),因?yàn)榉椒ㄊ且瞥鳛閰?shù)的對(duì)象

            remove

            不清晰;要移除什么?

            ● 名稱通常不縮寫,即使名稱很長,也要拼寫完全

            代碼

            點(diǎn)評(píng)

            destinationSelection

            good

            destSel

            不清晰

            setBackgroundColor:

            good

            setBkgdColor:

            不清晰

            你可能會(huì)認(rèn)為某個(gè)縮寫廣為人知,但有可能并非如此,尤其是當(dāng)你的代碼被來自不同文化和語言背景的開發(fā)人員所使用時(shí)。

            ● 然而,你可以使用少數(shù)非常常見,歷史悠久的縮寫。請(qǐng)參考:”可接受的縮略名“一節(jié)

            ● 避免使用有歧義的 API 名稱,如那些能被理解成多種意思的方法名稱

            代碼

            點(diǎn)評(píng)

            sendPort

            是發(fā)送端口還是返回一個(gè)發(fā)送端口?

            displayName

            是顯示一個(gè)名稱還是返回用戶界面中控件的標(biāo)題?

            >>> Consistency 一致性

            ● 盡可能使用與 Cocoa 編程接口命名保持一致的名稱。如果你不太確定某個(gè)命名的一致性,請(qǐng)瀏覽一下頭文件或參考文檔中的范例

            ● 在使用多態(tài)方法的類中,命名的一致性非常重要。在不同類中實(shí)現(xiàn)相同功能的方法應(yīng)該具有相同的名稱

            代碼

            點(diǎn)評(píng)

            - (int) tag

            在 NSView, NSCell, NSControl 中有定義

            - (void) setStringValue:(NSString *)

            在許多 Cocoa classes 中有定義

            請(qǐng)參考“方法參數(shù)”一節(jié)。

            >>> No Self Reference 不要自我指涉

            ● 不要名稱自我指涉

            代碼

            點(diǎn)評(píng)

            NSString

            okey

            NSStringObject

            自我指涉

            ● 掩碼(可使用位操作進(jìn)行組合)和用作通知名稱的常量不受該約定限制

            代碼

            點(diǎn)評(píng)

            NSUnderlineByWordMask

            okey

            NSTableViewColumnDidMoveNotification

            okey

            >> Prefixes 前綴

            前綴是名稱的重要組成部分。它們可以區(qū)分軟件的功能范疇。通常,軟件會(huì)被打包成一個(gè)框架或多個(gè)緊密相關(guān)的框架(如 Foundation 和 Application Kit 框架)。前綴可以防止第三方開發(fā)者與蘋果公司之間的命名沖突(同樣也可防止蘋果內(nèi)部不同框架之間的命名沖突)

            ● 前綴有規(guī)定的格式。它由兩到三個(gè)大寫字符組成,不能使用下劃線與子前綴

            前綴

            Cocoa 框架

            NS

            Foundation

            NS

            Application Kit

            AB

            Address Book

            IB

            Interface Builder

            ● 命名 class,protocol,structure,函數(shù),常量時(shí)使用前綴;命名成員方法時(shí)不使用前綴,因?yàn)榉椒ㄒ呀?jīng)在它所在類的命名空間種;同理,命名結(jié)構(gòu)體字段時(shí)也不使用前綴

            >> Typographic Conventions 書寫約定

            在為 API 元素命名時(shí),請(qǐng)遵循如下一些簡單的書寫約定

            ● 對(duì)于包含多個(gè)單詞的名稱,不要使用標(biāo)點(diǎn)符號(hào)作為名稱的一部分或作為分隔符(下劃線,破折號(hào)等);此外,大寫每個(gè)單詞的首字符并將這些單詞連續(xù)拼寫在一起。請(qǐng)注意以下限制:

            • 方法名小寫第一個(gè)單詞的首字符,大寫后續(xù)所有單詞的首字符。方法名不使用前綴。如: fileExistsAtPath:isDirectory: 如果方法名以一個(gè)廣為人知的大寫首字母縮略詞開頭,該規(guī)則不適用,如:NSImage 中的 TIFFRepresentation
            • 函數(shù)名和常量名使用與其關(guān)聯(lián)類相同的前綴,并且要大寫前綴后面所有單詞的首字符。如:NSRunAlertPanel,NSCellDisabled
            • 避免使用下劃線來表示名稱的私有屬性。蘋果公司保留該方式的使用。如果第三方這樣使用可能會(huì)導(dǎo)致命名沖突,他們可能會(huì)在無意中用自己的方法覆蓋掉已有的私有方法,這會(huì)導(dǎo)致嚴(yán)重的后果。請(qǐng)參考“私有方法”一節(jié)以了解私有 API 的命名約定的建議

            >> Class and Protocol Names 類與協(xié)議命名

            類名應(yīng)包含一個(gè)明確描述該類(或類的對(duì)象)是什么或做什么的名詞。類名要有合適的前綴(請(qǐng)參考“前綴”一節(jié))。Foundation 及 Application Kit 有很多這樣例子,如:NSString, NSData, NSScanner, NSApplication, NSButton 以及 NSEvent。

            協(xié)議應(yīng)該根據(jù)對(duì)方法的行為分組方式來命名。

            ● 大多數(shù)協(xié)議僅組合一組相關(guān)的方法,而不關(guān)聯(lián)任何類,這種協(xié)議的命名應(yīng)該使用動(dòng)名詞(ing),以不與類名混淆。

            代碼

            點(diǎn)評(píng)

            NSLocking

            good

            NSLock

            糟糕,它看起來像類名

            ● 有些協(xié)議組合一些彼此無關(guān)的方法(這樣做是避免創(chuàng)建多個(gè)獨(dú)立的小協(xié)議)。這樣的協(xié)議傾向于與某個(gè)類關(guān)聯(lián)在一起,該類是協(xié)議的主要體現(xiàn)者。在這種情形,我們約定協(xié)議的名稱與該類同名。NSObject 協(xié)議就是這樣一個(gè)例子。這個(gè)協(xié)議組合一組彼此無關(guān)的方法,有用于查詢對(duì)象在其類層次中位置的方法,有使之能調(diào)用特殊方法的方法以及用于增減引用計(jì)數(shù)的方法。由于 NSObject 是這些方法的主要體現(xiàn)者,所以我們用類的名稱命名這個(gè)協(xié)議。

            >> Header Files 頭文件

            頭文件的命名方式很重要,我們可以根據(jù)其命名知曉頭文件的內(nèi)容。

            ● 聲明孤立的類或協(xié)議:將孤立的類或協(xié)議聲明放置在單獨(dú)的頭文件中,該頭文件名稱與類或協(xié)議同名

            頭文件

            聲明

            NSApplication.h

            NSApplication 類

            ● 聲明相關(guān)聯(lián)的類或協(xié)議:將相關(guān)聯(lián)的聲明(類,類別及協(xié)議) 放置在一個(gè)頭文件中,該頭文件名稱與主要的類/類別/協(xié)議的名字相同。

            頭文件

            聲明

            NSString.h

            NSString 和 NSMutableString 類

            NSLock.h

            NSLocking 協(xié)議和 NSLock, NSConditionLock, NSRecursiveLock 類

            ● 包含框架頭文件:每個(gè)框架應(yīng)該包含一個(gè)與框架同名的頭文件,該頭文件包含該框架所有公開的頭文件。

            頭文件

            框架

            Foundation.h

            Foundation.framework

            ● 為已有框架中的某個(gè)類擴(kuò)展 API:如果要在一個(gè)框架中聲明屬于另一個(gè)框架某個(gè)類的范疇類的方法,該頭文件的命名形式為:原類名+“Additions”。如 Application Kit 中的 NSBundleAdditions.h 

            ● 相關(guān)聯(lián)的函數(shù)與數(shù)據(jù)類型:將相聯(lián)的函數(shù),常量,結(jié)構(gòu)體以及其他數(shù)據(jù)類型放置到一個(gè)頭文件中,并以合適的名字命名。如 Application Kit 中的 NSGraphics.h

            > Naming Methods 方法命名

            >> General Rules 一般性規(guī)則

            為方法命名時(shí),請(qǐng)考慮如下一些一般性規(guī)則:

            ● 小寫第一個(gè)單詞的首字符,大寫隨后單詞的首字符,不使用前綴。請(qǐng)參考“書寫約定”一節(jié)。有兩種例外情況:1,方法名以廣為人知的大寫字母縮略詞(如TIFF or PDF)開頭;2,私有方法可以使用統(tǒng)一的前綴來分組和辨識(shí),請(qǐng)參考“私有方法”一節(jié)

            ● 表示對(duì)象行為的方法,名稱以動(dòng)詞開頭:

            - (void) invokeWithTarget:(id)target:

            - (void) selectTabViewItem:(NSTableViewItem *)tableViewItem

            名稱中不要出現(xiàn) do 或 does,因?yàn)檫@些助動(dòng)詞沒什么實(shí)際意義。也不要在動(dòng)詞前使用副詞或形容詞修飾

            ● 如果方法返回方法接收者的某個(gè)屬性,直接用屬性名稱命名。不要使用 get,除非是間接返回一個(gè)或多個(gè)值。請(qǐng)參考“訪問方法”一節(jié)。

            - (NSSize) cellSize;

             對(duì)

            - (NSSize) calcCellSize;

             錯(cuò)

            - (NSSize) getCellSize;

             錯(cuò)

            ● 參數(shù)要用描述該參數(shù)的關(guān)鍵字命名

            - (void) sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;

             對(duì)

            - (void) sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;

             錯(cuò)

            ● 參數(shù)前面的單詞要能描述該參數(shù)。

            - (id) viewWithTag:(int)aTag;

             對(duì)

            - (id) taggedView:(int)aTag;

             錯(cuò)

            ● 細(xì)化基類中的已有方法:創(chuàng)建一個(gè)新方法,其名稱是在被細(xì)化方法名稱后面追加參數(shù)關(guān)鍵詞

            - (id) initWithFrame:(NSRect)frameRect;

            NSView

            - (id) initWithFrame:(NSRect)frameRect mode:(ind)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide;

            NSMatrix - NSView 的子類

            ● 不要使用 and 來連接用屬性作參數(shù)關(guān)鍵字

            - (int) runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;

             對(duì)

            - (int) runModalForDirectory:(NSString *)path addFile:(NSString *)name addTypes:(NSArray *)fileTypes;

             錯(cuò)

            雖然上面的例子中使用 add 看起來也不錯(cuò),但當(dāng)你方法有太多參數(shù)關(guān)鍵字時(shí)就有問題。

            ● 如果方法描述兩種獨(dú)立的行為,使用 and 來串接它們

             - (BOOL) openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;

             NSWorkspace 

            >> Accessor Methods 訪問方法

            訪問方法是對(duì)象屬性的讀取與設(shè)置方法。其命名有特定的格式依賴于屬性的描述內(nèi)容。

            ● 如果屬性是用名詞描述的,則命名格式為:

            - (void) setNoun:(type)aNoun;

            - (type) noun;

            例如:

            - (void) setgColor:(NSColor *)aColor;

            - (NSColor *) color;

            ● 如果屬性是用形容詞描述的,則命名格式為:

            - (void) setAdjective:(BOOL)flag;

            - (BOOL) isAdjective;

            例如:

            - (void) setEditable:(BOOL)flag;

            - (BOOL) isEditable;

            ● 如果屬性是用動(dòng)詞描述的,則命名格式為:(動(dòng)詞要用現(xiàn)在時(shí)時(shí)態(tài))

            - (void) setVerbObject:(BOOL)flag;

            - (BOOL) verbObject;

            例如:

            - (void) setShowAlpha:(BOOL)flag;

            - (BOOL) showsAlpha;

            ● 不要使用動(dòng)詞的過去分詞形式作形容詞使用

            - (void) setAcceptsGlyphInfo:(BOOL)flag;

             對(duì)

            - (BOOL) acceptsGlyphInfo;

             對(duì)

            - (void) setGlyphInfoAccepted:(BOOL)flag;

             錯(cuò)

            - (BOOL) glyphInfoAccepted;

             錯(cuò)

            ● 可以使用情態(tài)動(dòng)詞(can, should, will 等)來提高清晰性,但不要使用 do 或 does

            - (void) setCanHide:(BOOL)flag;

             對(duì)

            - (BOOL) canHide;

             對(duì)

            - (void) setShouldCloseDocument:(BOOL)flag;

             對(duì)

            - (void) shouldCloseDocument;

             對(duì)

            - (void) setDoseAcceptGlyphInfo:(BOOL)flag;

             錯(cuò)

            - (BOOL) doseAcceptGlyphInfo;

             錯(cuò)

            ● 只有在方法需要間接返回多個(gè)值的情況下,才使用 get

            - (void) getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;

             NSBezierPath

            像上面這樣的方法,在其實(shí)現(xiàn)里應(yīng)允許接受 NULL 作為其 in/out 參數(shù),以表示調(diào)用者對(duì)一個(gè)或多個(gè)返回值不感興趣。

            >> Delegate Methods 委托方法

            委托方法是那些在特定事件發(fā)生時(shí)可被對(duì)象調(diào)用,并聲明在對(duì)象的委托類中的方法。它們有獨(dú)特的命名約定,這些命名約定同樣也適用于對(duì)象的數(shù)據(jù)源方法。

            ● 名稱以標(biāo)示發(fā)送消息的對(duì)象的類名開頭,省略類名的前綴并小寫類第一個(gè)字符

            - (BOOL) tableView:(NSTableView *)tableView shouldSelectRow:(int)row;

            - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

            ● 冒號(hào)緊跟在類名之后(隨后的那個(gè)參數(shù)表示委派的對(duì)象)。該規(guī)則不適用于只有一個(gè) sender 參數(shù)的方法

            - (BOOL) applicationOpenUntitledFile:(NSApplication *)sender;

            ● 上面的那條規(guī)則也不適用于響應(yīng)通知的方法。在這種情況下,方法的唯一參數(shù)表示通知對(duì)象

            - (void) windowDidChangeScreen:(NSNotification *)notification;

            ● 用于通知委托對(duì)象操作即將發(fā)生或已經(jīng)發(fā)生的方法名中要使用 did 或 will

            - (void) browserDidScroll:(NSBrowser *)sender;

            - (NSUndoManager *) windowWillReturnUndoManager:(NSWindow *)window;

            ● 用于詢問委托對(duì)象可否執(zhí)行某操作的方法名中可使用 did 或 will,但最好使用 should 

            - (BOOL) windowShouldClose:(id)sender;

            >> Collection Methods 集合方法

            管理對(duì)象(集合中的對(duì)象被稱之為元素)的集合類,約定要具備如下形式的方法:

            - (void) addElement:(elementType)adObj;

            - (void) removeElement:(elementType)anObj;

            - (NSArray *)elements;

            例如:

            - (void) addLayoutManager:(NSLayoutManager *)adObj;

            - (void) removeLayoutManager:(NSLayoutManager *)anObj;

            - (NSArray *)layoutManagers;

            集合方法命名有如下一些限制和約定:

            ● 如果集合中的元素?zé)o序,返回 NSSet,而不是 NSArray 

            ● 如果將元素插入指定位置的功能很重要,則需具備如下方法:

            - (void) insertElement:(elementType)anObj atIndex:(int)index;

            - (void) removeElementAtIndex:(int)index;

            集合方法的實(shí)現(xiàn)要考慮如下細(xì)節(jié):

            ● 以上集合類方法通常負(fù)責(zé)管理元素的所有者關(guān)系,在 add 或 insert 的實(shí)現(xiàn)代碼里會(huì) retain 元素,在 remove 的實(shí)現(xiàn)代碼中會(huì) release 元素

            ● 當(dāng)被插入的對(duì)象需要持有指向集合對(duì)象的指針時(shí),通常使用 set... 來命名其設(shè)置該指針的方法,且不要 retain 集合對(duì)象。比如上面的 insertLayerManager:atIndex: 這種情形,NSLayoutManager 類使用如下方法:

            - (void) setTextStorage:(NSTextStorage *)textStorage;

            - (NSTextStorage *)textStorage;

            通常你不會(huì)直接調(diào)用 setTextStorage:,而是覆寫它。

            另一個(gè)關(guān)于集合約定的例子來自 NSWindow 類:

            - (void) addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place;

            - (void) removeChildWindow:(NSWindow *)childWin;

            - (NSArray *)childWindows;

            - (NSWindow *) parentWindow;

            - (void) setParentWindow:(NSWindow *)window;

            >> Method Arguments 方法參數(shù)

            命名方法參數(shù)時(shí)要考慮如下規(guī)則:

            ● 如同方法名,參數(shù)名小寫第一個(gè)單詞的首字符,大寫后繼單詞的首字符。如:removeObject:(id)anObject

            ● 不要在參數(shù)名中使用 pointer 或 ptr,讓參數(shù)的類型來說明它是指針

            ● 避免使用 one, two,...,作為參數(shù)名

            ● 避免為節(jié)省幾個(gè)字符而縮寫 

            按照 Cocoa 慣例,以下關(guān)鍵字與參數(shù)聯(lián)合使用:

            ...action:(SEL)aSelector

            ..alignment:(int)mode

            ...atIndex:(int)index

            ...content:(NSRect)aRect

            ...doubleValue:(double)aDouble

            ...floatValue:(float)aFloat

            ...font:(NSFont *)fontObj

            ...frame:(NSRect)frameRect

            ...intValue:(int)anInt

            ...keyEquivalent:(NSString *0charCode

            ...length:(int)numBytes

            ...point:(NSPoint)aPoint

            ...stringValue:(NSString *)aString

            ...tag:(int)anInt

            ...target:(id)anObject

            ...title:(NSString *)aString

            >> Private Methods 私有方法

            大多數(shù)情況下,私有方法命名相同與公共方法命名約定相同,但通常我們約定給私有方法添加前綴,以便與公共方法區(qū)分開來。即使這樣,私有方法的名稱很容易導(dǎo)致特別的問題。當(dāng)你設(shè)計(jì)一個(gè)繼承自 Cocoa framework 某個(gè)類的子類時(shí),你無法知道你的私有方法是否不小心覆蓋了框架中基類的同名方法。

            Cocoa framework 的私有方法名稱通常以下劃線作為前綴(如:_fooData),以標(biāo)示其私有屬性。基于這樣的事實(shí),遵循以下兩條建議:

            ● 不要使用下劃線作為你自己的私有方法名稱的前綴,Apple 保留這種用法。

            ● 若要繼承 Cocoa framework 中一個(gè)超大的類(如:NSView),并且想要使你的私有方法名稱與基類中的區(qū)別開來,你可以為你的私有方法名稱添加你自己的前綴。這個(gè)前綴應(yīng)該具有唯一性,如基于你公司的名稱,或工程的名稱,并以“XX_”形式給出。比如你的工程名為"Byte Flogger",那么就可以是“BF_addObject:”

            盡管為私有方法名稱添加前綴的建議與前面類中方法命名的約定沖突,這里的意圖有所不同:為了防止不小心地覆蓋基類中的私有方法。

            > Naming Functions 函數(shù)命名

            Objective-C 允許通過函數(shù)(C形式的函數(shù))描述行為,就如成員方法一樣。 你應(yīng)當(dāng)優(yōu)先使用函數(shù),而不是類方法,如果隱含的類為單例或在處理函數(shù)子系統(tǒng)時(shí)。

            函數(shù)命名應(yīng)該遵循如下幾條規(guī)則:

            ● 函數(shù)命名與方法命名相似,但有幾點(diǎn)不同:

            • 它們有前綴,其前綴與你使用的類和常量的前綴相同
            • 大寫前綴后緊跟的第一個(gè)單詞首字符

            ● 大多數(shù)函數(shù)名稱以動(dòng)詞開頭,這個(gè)動(dòng)詞描述該函數(shù)的行為

            NSHighlightRect

            NSDeallocateObject

            查詢屬性的函數(shù)有個(gè)更多的規(guī)則要遵循:

            ● 查詢第一個(gè)參數(shù)的屬性的函數(shù),省略動(dòng)詞

            unsigned int NSEventMaskFromType(NSEventType type)

            float NSHeight(NSRect rect)

            ● 返回值為引用的方法,使用 Get

            const char *NSGetSizeAndAlignment(const char *typePtr, unsigned int *sizep, unsigned int *alignp)

            ● 返回 boolean 值的函數(shù),名稱使用判斷動(dòng)詞 is/does 開頭 

            BOOL NSDecimalIsNotANumber(const NSDecimal *decimal)

            > Naming Instance Variables and Data Types 實(shí)例變量與數(shù)據(jù)類型命名

            這一節(jié)描述實(shí)例變量,常量,異常以及通知的命名約定。

            >> Instance Variables 實(shí)例變量

            在為類添加實(shí)例變量是要注意:

            ● 避免創(chuàng)建 public 實(shí)例變量

            ● 使用 @private,@protected 顯式限定實(shí)例變量的訪問權(quán)限

            ● 確保實(shí)例變量名簡明扼要地描述了它所代表的屬性

            如果實(shí)例變量別設(shè)計(jì)為可被訪問的,確保編寫了訪問方法

            >> Constants 常量

            常量命名規(guī)則根據(jù)常量創(chuàng)建的方式不同而大不同。

            >>> 枚舉常量

            ● 使用枚舉來定義一組相關(guān)的整數(shù)常量

            ● 枚舉常量與其 typedef 命名遵守函數(shù)命名規(guī)則。如:來自 NSMatrix.h 中的例子:(本例中的 typedef tag(_NSMatrixMode)不是必須的)

            typedef enum _NSMatrixMode {

                NSRadioModeMatrix       = 0,

                NSHighlightModeMatrix = 1;

                NSListModeMatrix           = 2,

                NSTrackModeMatrix        = 3

            } NSMatrixMode;

            ● 位掩碼常量可以使用不具名枚舉。如:

            enum {

                NSBorderlessWindowMask         = 0,

                NSTitledWindowMask                 = 1 << 0,

                NSClosableWindowMask            = 1 << 1,

                NSMiniaturizableWindowMask  = 1 << 2,

                NSResizableWindowMask          = 1 << 3

            };

            >>> const 常量

            ● 使用 const 來修飾浮點(diǎn)常量或彼此沒有關(guān)聯(lián)的整數(shù)常量 

            ● 枚舉常量命名規(guī)則與函數(shù)命名規(guī)則相同。const 常量命名范例:

            const float NSLightGray;

            >>> 其他常量

            ● 通常不使用 #define 來創(chuàng)建常量。如上面所述,整數(shù)常量請(qǐng)使用枚舉,浮點(diǎn)數(shù)常量請(qǐng)使用 const

            ● 使用大寫字母來定義預(yù)處理編譯宏。如:#ifdef DEBUG

            ● 編譯器定義的宏名首尾都有雙下劃線。如:__MACH__

            ● 為 notification 名及 dictionary key 定義字符串常量,從而能夠利用編譯器的拼寫檢查,減少書寫錯(cuò)誤。Cocoa  框架提供了很多這樣的范例:

            APPKIT_EXTERN NSString *NSPrintCopies;

            實(shí)際的字符串值在實(shí)現(xiàn)文件中賦予。(注意:APPKIT_EXTERN 宏等價(jià)于Objective-C 中 extern)

            >> Exceptions and Notifications 異常與通知

            異常與通知的命名遵循相似的規(guī)則,但是它們有各自推薦的使用模式。

            >>> 異常

            雖然你可以處于任何目的而使用異常(由 NSException 類及相關(guān)類實(shí)現(xiàn)),Cocoa 通常不使用異常來處理常規(guī)的,可預(yù)料的錯(cuò)誤。在這些情形下,使用諸如 nil, NULL, NO或錯(cuò)誤代碼之類的返回值。異常的典型應(yīng)用類似數(shù)組越界之類的編程錯(cuò)誤。

            異常由具有如下形式的全局 NSString 對(duì)象標(biāo)識(shí):

            [Prefix] + UniquePartOfName + Exception

            UniquePartOfName 部分是有連續(xù)的首字符大寫的單詞組成。例如:

            NSColorListIOException

            NSColorListNotEditableException

            NSDraggingException

            NSFontUnavailableException

            NSIllegalSelectorException

            >>> 通知

            如果一個(gè)類有委托,那它的大部分通知可能由其委托的委托方法來處理。這些通知的名稱應(yīng)該能夠反應(yīng)其響應(yīng)的委托方法。比如,當(dāng)應(yīng)用程序提交 NSApplicationDidBecomeActiveNotification 通知時(shí),全局 NSApplication 對(duì)象的委托會(huì)注冊(cè)從而能夠接收 applicaitonDidBecomeActive: 消息。

            通知由具有如下形式的全局 NSString 對(duì)象標(biāo)識(shí):

            [相關(guān)聯(lián)類的名稱] + [Did 或 Will] + [UniquePartOfName] + Notification

            例如:

            NSApplicationDidBecomeActiveNotification

            NSWindowDidMiniaturizeNotification

            NSTextViewDidChangeSelectionNotification

            NSColorPanelColorDidChangeNotification

            > 可接受的縮略語

            在設(shè)計(jì)編程接口時(shí),通常名稱不要縮寫。然而,下面列出的縮寫要么是固定下來的要么是過去被廣泛使用的,所以你可以繼續(xù)使用。關(guān)于縮寫有一些額外的注意事項(xiàng):

            ● 標(biāo)準(zhǔn) C 庫中長期使用的縮寫形式是可以接受的。如:"alloc","getc"

            ● 你可以在參數(shù)名中更自由地使用縮寫。如:imageRep,col(column),obj,otherWin

            常見的縮寫

            縮寫

            含義

            縮寫

            含義

            alloc

            Allocate

            msg

            Message

            alt

            Alternate

            nib

            Interface Builder archive

            app

            Application

            pboard

            Pasteboard

            calc

            Calculate

            rect

            Rectangle

            dealloc

            Deallocate

            Rep

            Representation

            func

            Function

            temp

            Temporary

            horiz

            Horizontal

            vert

            Vertical

            info

            Information

            init

            Initialize

            max

            Maximum



            常見的縮寫:

            ASCII,PDF,XML,HTML,URL,RTF,HTTP,TIFF

            JPG,GIF,LZW,ROM,RGB,CMYK,MIDI,F(xiàn)TP

            > 框架開發(fā)者小貼士與技巧

            >> Initialize 初始化 

            >>> 類初始化

            在 initialize 類方法中,能夠編寫實(shí)現(xiàn)一些延遲執(zhí)行且只被一次的代碼,initialize 類方法是由運(yùn)行時(shí)系統(tǒng)在該類響應(yīng)任何其他消息之前調(diào)用的。典型的應(yīng)用是在其中設(shè)置類的版本信息。運(yùn)行時(shí)系統(tǒng)向每個(gè)類發(fā)送 initialize 消息,即使該類沒有實(shí)現(xiàn) initialize,也會(huì)調(diào)用其基類的某個(gè) initialize 方法。因此一個(gè)類的 initialize 方法可能會(huì)因?yàn)榇嬖诶^承類的緣故被執(zhí)行多次。因此有必要使用一定的技巧來防止只執(zhí)行一次的代碼被多次執(zhí)行。如:NSFoo 類的 initialize 方法實(shí)現(xiàn)可能如下:

            + (id) initialize

            {

                if (self == [NSFoo class])

                {

                    // 初始化代碼

                }

                return self;

            }
            不應(yīng)當(dāng)顯式調(diào)用 initialize 方法。如果你需要激活 initialize 方法,使用 [NSFoo self] 形式的調(diào)用。

            Ref:
            Coding Guidelines for Cocoa

            posted on 2011-11-03 16:02 羅朝輝 閱讀(5514) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Cocoa 開發(fā)

            評(píng)論

            # re: [Cocoa][譯]蘋果 Cocoa 編碼規(guī)范中文版 2011-11-04 21:40 飯中淹
            很好。收藏。
              回復(fù)  更多評(píng)論
              

            内射无码专区久久亚洲| 久久久久亚洲精品无码网址| 欧美精品国产综合久久| 2019久久久高清456| 熟妇人妻久久中文字幕| 99久久人妻无码精品系列蜜桃| 久久亚洲精品中文字幕| 青青草原综合久久大伊人精品| 久久久久人妻一区精品| 亚洲精品无码专区久久久| 国产一级持黄大片99久久| 久久久噜噜噜久久中文字幕色伊伊 | 国内精品久久久久久久涩爱 | 久久精品卫校国产小美女| 久久免费美女视频| 亚洲中文字幕无码久久2017| 久久综合九色综合精品| 亚洲伊人久久大香线蕉综合图片| 一本久久久久久久| 久久久一本精品99久久精品66| 精品视频久久久久| 99久久99这里只有免费费精品| 亚洲人成无码www久久久| 国产一区二区精品久久| 无码国内精品久久人妻蜜桃| 久久强奷乱码老熟女网站| 精品久久一区二区三区| 奇米综合四色77777久久| 亚洲国产精品狼友中文久久久| 亚洲狠狠久久综合一区77777| 亚洲精品乱码久久久久久久久久久久| AAA级久久久精品无码区| 69久久夜色精品国产69| 久久亚洲精品成人AV| 7777久久久国产精品消防器材| 欧美伊人久久大香线蕉综合69| 狠狠久久综合伊人不卡| 久久精品草草草| 99久久综合狠狠综合久久| 2020最新久久久视精品爱 | 亚洲国产精品嫩草影院久久|