青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

羅朝輝(飄飄白云)

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

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

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

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

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

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

 

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

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

>> General Principles 一般性原則

>>> Clarity 清晰性

● 最好是既清晰又簡(jiǎn)短,但不要為簡(jiǎn)短而喪失清晰性

代碼

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

insertObject:atIndex:

good

insert:at:

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

removeObjectAtIndex:

good

removeObject:

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

remove

不清晰;要移除什么?

● 名稱通常不縮寫(xiě),即使名稱很長(zhǎng),也要拼寫(xiě)完全

代碼

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

destinationSelection

good

destSel

不清晰

setBackgroundColor:

good

setBkgdColor:

不清晰

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

● 然而,你可以使用少數(shù)非常常見(jiàn),歷史悠久的縮寫(xiě)。請(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 框架)。前綴可以防止第三方開(kāi)發(fā)者與蘋(píng)果公司之間的命名沖突(同樣也可防止蘋(píng)果內(nèi)部不同框架之間的命名沖突)

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

前綴

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 書(shū)寫(xiě)約定

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

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

  • 方法名小寫(xiě)第一個(gè)單詞的首字符,大寫(xiě)后續(xù)所有單詞的首字符。方法名不使用前綴。如: fileExistsAtPath:isDirectory: 如果方法名以一個(gè)廣為人知的大寫(xiě)首字母縮略詞開(kāi)頭,該規(guī)則不適用,如:NSImage 中的 TIFFRepresentation
  • 函數(shù)名和常量名使用與其關(guān)聯(lián)類相同的前綴,并且要大寫(xiě)前綴后面所有單詞的首字符。如:NSRunAlertPanel,NSCellDisabled
  • 避免使用下劃線來(lái)表示名稱的私有屬性。蘋(píng)果公司保留該方式的使用。如果第三方這樣使用可能會(huì)導(dǎo)致命名沖突,他們可能會(huì)在無(wú)意中用自己的方法覆蓋掉已有的私有方法,這會(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ì)方法的行為分組方式來(lái)命名。

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

代碼

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

NSLocking

good

NSLock

糟糕,它看起來(lái)像類名

● 有些協(xié)議組合一些彼此無(wú)關(guān)的方法(這樣做是避免創(chuàng)建多個(gè)獨(dú)立的小協(xié)議)。這樣的協(xié)議傾向于與某個(gè)類關(guān)聯(lián)在一起,該類是協(xié)議的主要體現(xiàn)者。在這種情形,我們約定協(xié)議的名稱與該類同名。NSObject 協(xié)議就是這樣一個(gè)例子。這個(gè)協(xié)議組合一組彼此無(wú)關(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è)與框架同名的頭文件,該頭文件包含該框架所有公開(kāi)的頭文件。

頭文件

框架

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ī)則:

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

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

- (void) invokeWithTarget:(id)target:

- (void) selectTabViewItem:(NSTableViewItem *)tableViewItem

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

● 如果方法返回方法接收者的某個(gè)屬性,直接用屬性名稱命名。不要使用 get,除非是間接返回一個(gè)或多個(gè)值。請(qǐng)參考“訪問(wèn)方法”一節(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 來(lái)連接用屬性作參數(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 看起來(lái)也不錯(cuò),但當(dāng)你方法有太多參數(shù)關(guān)鍵字時(shí)就有問(wèn)題。

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

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

 NSWorkspace 

>> Accessor Methods 訪問(wèn)方法

訪問(wèn)方法是對(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)詞的過(guò)去分詞形式作形容詞使用

- (void) setAcceptsGlyphInfo:(BOOL)flag;

 對(duì)

- (BOOL) acceptsGlyphInfo;

 對(duì)

- (void) setGlyphInfoAccepted:(BOOL)flag;

 錯(cuò)

- (BOOL) glyphInfoAccepted;

 錯(cuò)

● 可以使用情態(tài)動(dòng)詞(can, should, will 等)來(lái)提高清晰性,但不要使用 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ì)象的類名開(kāi)頭,省略類名的前綴并小寫(xiě)類第一個(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;

● 用于詢問(wèn)委托對(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... 來(lái)命名其設(shè)置該指針的方法,且不要 retain 集合對(duì)象。比如上面的 insertLayerManager:atIndex: 這種情形,NSLayoutManager 類使用如下方法:

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

- (NSTextStorage *)textStorage;

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

另一個(gè)關(guān)于集合約定的例子來(lái)自 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ù)名小寫(xiě)第一個(gè)單詞的首字符,大寫(xiě)后繼單詞的首字符。如:removeObject:(id)anObject

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

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

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

按照 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ū)分開(kāi)來(lái)。即使這樣,私有方法的名稱很容易導(dǎo)致特別的問(wèn)題。當(dāng)你設(shè)計(jì)一個(gè)繼承自 Cocoa framework 某個(gè)類的子類時(shí),你無(wú)法知道你的私有方法是否不小心覆蓋了框架中基類的同名方法。

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

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

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

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

> Naming Functions 函數(shù)命名

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

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

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

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

● 大多數(shù)函數(shù)名稱以動(dòng)詞開(kāi)頭,這個(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 開(kāi)頭 

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í)例變量的訪問(wèn)權(quán)限

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

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

>> Constants 常量

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

>>> 枚舉常量

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

● 枚舉常量與其 typedef 命名遵守函數(shù)命名規(guī)則。如:來(lái)自 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 來(lái)修飾浮點(diǎn)常量或彼此沒(méi)有關(guān)聯(lián)的整數(shù)常量 

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

const float NSLightGray;

>>> 其他常量

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

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

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

● 為 notification 名及 dictionary key 定義字符串常量,從而能夠利用編譯器的拼寫(xiě)檢查,減少書(shū)寫(xiě)錯(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 通常不使用異常來(lái)處理常規(guī)的,可預(yù)料的錯(cuò)誤。在這些情形下,使用諸如 nil, NULL, NO或錯(cuò)誤代碼之類的返回值。異常的典型應(yīng)用類似數(shù)組越界之類的編程錯(cuò)誤。

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

[Prefix] + UniquePartOfName + Exception

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

NSColorListIOException

NSColorListNotEditableException

NSDraggingException

NSFontUnavailableException

NSIllegalSelectorException

>>> 通知

如果一個(gè)類有委托,那它的大部分通知可能由其委托的委托方法來(lái)處理。這些通知的名稱應(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

> 可接受的縮略語(yǔ)

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

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

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

常見(jiàn)的縮寫(xiě)

縮寫(xiě)

含義

縮寫(xiě)

含義

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



常見(jiàn)的縮寫(xiě):

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

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

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

>> Initialize 初始化 

>>> 類初始化

在 initialize 類方法中,能夠編寫(xiě)實(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 消息,即使該類沒(méi)有實(shí)現(xiàn) initialize,也會(huì)調(diào)用其基類的某個(gè) initialize 方法。因此一個(gè)類的 initialize 方法可能會(huì)因?yàn)榇嬖诶^承類的緣故被執(zhí)行多次。因此有必要使用一定的技巧來(lái)防止只執(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 羅朝輝 閱讀(5536) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Cocoa 開(kāi)發(fā)

評(píng)論

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久经典综合| 欧美在线一级va免费观看| 99精品欧美一区二区三区综合在线 | 欧美在线地址| 久久久久国产精品一区| 久久国产成人| 女同一区二区| 亚洲国产片色| 亚洲毛片一区| 午夜亚洲精品| 欧美成人久久| 国产精品乱子久久久久| 国产无一区二区| 亚洲国产精品久久精品怡红院| 一区久久精品| 99这里只有久久精品视频| 一区二区三区四区精品| 9人人澡人人爽人人精品| 欧美一区二区三区免费大片| 亚洲欧美综合另类中字| 免费亚洲电影| 最新国产の精品合集bt伙计| 亚洲一二区在线| 欧美中文日韩| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美深夜福利| 欧美视频一区二| …久久精品99久久香蕉国产| 亚洲欧美视频一区二区三区| 亚洲色图自拍| 欧美激情网站在线观看| 99视频超级精品| 久久天堂成人| 欧美性猛交99久久久久99按摩| 狠狠狠色丁香婷婷综合久久五月 | 欧美视频网站| 亚洲精品久久久久久久久久久久| 一本不卡影院| 男女精品网站| 99成人在线| 欧美国产综合视频| 国产色产综合色产在线视频| 亚洲视频免费看| 久久综合中文| 欧美一区二区在线免费播放| 免费欧美日韩| 激情综合久久| 亚洲欧美成人网| 99视频日韩| 最新精品在线| 久久久国际精品| 国模精品娜娜一二三区| 中日韩美女免费视频网站在线观看| 欧美成人精品在线观看| 亚洲天堂网站在线观看视频| 欧美日韩在线一区| 亚洲高清色综合| 亚洲一级特黄| 一区二区三区产品免费精品久久75| 久久久免费观看视频| 国产一区av在线| 午夜久久久久久| 一区二区三区日韩精品视频| 六月丁香综合| 亚洲伦理在线免费看| 免费久久久一本精品久久区| 欧美成人资源| 欧美国产日韩精品免费观看| 狠狠久久亚洲欧美专区| 久久在线91| 欧美一区二区在线免费观看| 国产一区视频在线观看免费| 欧美一区二区三区四区在线| 午夜亚洲伦理| 国产日本欧美一区二区三区| 久久亚洲电影| 久久国产精品一区二区三区| 影音先锋久久久| 久久视频国产精品免费视频在线| 亚洲国产专区校园欧美| 国产精品扒开腿做爽爽爽视频| 亚洲视频网站在线观看| 亚洲一区二区在线播放| 欧美性视频网站| 久久久蜜桃一区二区人| 欧美亚洲三区| 欧美日韩在线免费观看| 国产精品久久久久婷婷| 一区二区精品国产| 9i看片成人免费高清| 欧美视频日韩视频| 久久久蜜桃一区二区人| 久久精品国产v日韩v亚洲| 欧美日韩a区| 久久久久综合网| 久久青草久久| 亚洲欧美高清| 久久精品国产成人| 亚洲视频日本| 欧美一级片一区| 一本色道久久综合亚洲精品小说 | 日韩亚洲国产欧美| 国产精品久久77777| 久久99在线观看| 欧美在线观看一二区| 一本色道久久综合狠狠躁篇的优点 | 久久野战av| 99视频在线精品国自产拍免费观看| 亚洲专区一区| 怡红院精品视频| 一区二区电影免费观看| 国产亚洲a∨片在线观看| 久久九九精品99国产精品| 久久久99精品免费观看不卡| 亚洲色无码播放| 久久激情久久| 欧美一级理论片| 另类国产ts人妖高潮视频| 久久精品视频99| 欧美人与性动交cc0o| 久久综合狠狠| 欧美午夜宅男影院在线观看| 欧美高清影院| 国产日韩一区在线| 亚洲欧美www| 一区二区av| 欧美黄在线观看| 久久漫画官网| 国语自产偷拍精品视频偷| 99亚洲一区二区| 国产一区二区三区电影在线观看| 亚洲夜晚福利在线观看| 日韩视频免费看| 欧美精品九九| 免播放器亚洲一区| 亚洲福利视频免费观看| 亚洲综合精品四区| 欧美在线视频在线播放完整版免费观看| 免费日韩av电影| 欧美激情一区二区三区在线视频 | 久久久久久亚洲综合影院红桃| 国产欧美日韩91| 亚洲天堂第二页| 亚洲男人的天堂在线观看| 久久久亚洲精品一区二区三区 | 免费成人黄色片| 欧美精品日韩www.p站| 91久久精品美女高潮| 亚洲成人在线网站| 久久亚洲影音av资源网| 久久综合给合久久狠狠狠97色69| 精品999在线观看| 欧美诱惑福利视频| 免费欧美日韩国产三级电影| 国产性天天综合网| 久久一区欧美| 欧美18av| 亚洲精品综合| 欧美精品日韩| 亚洲女女女同性video| 亚洲欧美另类中文字幕| 国产在线观看精品一区二区三区| 亚洲一级在线| 巨乳诱惑日韩免费av| 在线观看成人av电影| 欧美激情综合五月色丁香| 欧美国产视频在线| 午夜精品成人在线| 国产日韩一区二区三区在线| 免费黄网站欧美| 亚洲精选中文字幕| 99精品国产在热久久婷婷| 欧美日韩精品高清| aⅴ色国产欧美| 久久精品欧美| 一区二区三区回区在观看免费视频| 欧美日韩亚洲一区| 亚洲性夜色噜噜噜7777| 国产日韩一区二区三区在线播放| 中日韩视频在线观看| 国产精品亚洲综合色区韩国| 91久久国产综合久久| 欧美在线网址| 国产日本欧美一区二区三区在线| 奶水喷射视频一区| 亚洲第一天堂无码专区| 欧美在线亚洲| 亚洲国产精品久久久久| 国产日本欧美一区二区| 免费成人在线观看视频| 午夜精品一区二区三区四区| 老司机67194精品线观看| 亚洲欧美日韩一区二区| 黄色一区三区| 国产精品最新自拍| 蜜桃伊人久久| 久久香蕉国产线看观看网| 9色精品在线| 亚洲精品在线免费| 在线一区视频|