1.通用原則git
1.1 清晰編程
Codeapp |
Commentary框架 |
insertObject:atIndex:less |
√ide |
insert:at:函數 |
不清晰,insert什麼?at表示什麼?ui |
removeObjectAtIndex:編碼 |
√spa |
removeObject: |
√ ,由於參數指明瞭移除對象 |
remove: |
不清晰,要移除什麼? |
◦ 你可能認爲某個縮寫衆所周知,但其實未必,特別是你周圍的開發者語言文化背景不一樣時
◦ 有一些歷史悠久的縮寫仍是可使用的,詳見第五章
Code |
Commentary |
destinationSelection |
√ |
destSel |
不清晰 |
setBackgroundColor: |
√ |
setBkgdColor: |
不清晰 |
Code |
Commentary |
sendPort |
發送仍是返回一個port ? |
displayName |
顯示一個名字仍是返回UI界面上的標題? |
1.2 一致
◦ 若是有疑惑,請瀏覽當前頭文件或者參考文檔
◦ 不一樣類裏,功能相同的方法命名也應相同
Code |
Commentary |
- (NSInteger)tag |
定義在 NSView, NSCell, NSControl. |
- (void)setStringValue:(NSString *) |
定義在許多Cocoa類裏 |
1.3 避免自引用(self Reference)
◦ 這裏的自引用指的是在詞尾引用自身
Code |
Commentary |
NSString |
√ |
NSStringObject |
自引用,全部NSString都是對象,不用額外聲明 |
Code |
Commentary |
NSUnderlineByWordMask |
√ |
NSTableViewColumnDidMoveNotification |
√ |
2.前綴
前綴是編程接口命名的重要部分,它們區分了軟件的不一樣功能區域:
◦ 一樣能夠防止Apple內部的命名衝突
◦ 它由二到三個大寫字母組成,不使用下劃線和子前綴
◦ 方法名不使用前綴(由於它存在於特定類的命名空間中)
◦ 結構體字段不使用前綴
Prefix |
Cocoa Framework |
NS |
Foundation |
NS |
Application Kit |
AB |
Address Book |
IB |
Interface Builder |
3.書寫約定
在命名API元素時, 使用駝峯命名法(如runTheWordsTogether),並注意如下書寫約定:
◦ 小寫第一個字母,大寫以後全部單詞的首字母,不使用前綴
◦ 若是方法名以一個衆所周知的大寫縮略詞開始,該規則不適用
▪ 如TIFFRepresentation (NSImage)
fileExistsAtPath:isDirectory:
◦ 使用與其關聯類相同的前綴,並大寫首字母
NSRunAlertPanel
NSCellDisabled
◦ 由多個單詞組成的名稱,別使用標點符號做爲名稱的一部分
▪ 分隔符(下劃線、破折號等)也不能使用
◦ 強行使用可能會致使命名衝突,即Apple已有的方法被覆蓋,這會致使災難性後果
◦ 實例變量使用下劃線做爲前綴仍是容許的
4.class與protocol命名
◦ class的名稱應該包含一個名詞,用以代表這個類是什麼(或者作了什麼),並擁有合適的前綴
▪ 如NSString、NSDate、NSScanner、UIApplication、UIButton
◦ 大多數protocol彙集了一堆相關方法,並不關聯class
◦ 這種protocol使用ing形式以和class區分開來
Code |
Commentary |
NSLocking |
√ |
NSLock |
很差,看起來像是一個class |
◦ 一些protoco彙集了一堆無關方法,並試圖與某個class關聯在一塊兒,由這個class來主導
◦ 這種protocol與class同名
▪ 如NSObject protocol
5.頭文件
頭文件的命名極其重要,由於它能夠指出頭文件包含的內容:
◦ 將聲明放入單獨的文件
◦ 使頭文件名與聲明的class/protocol相同
Header file |
Declares |
NSLocale.h |
包含NSLocale class. |
◦ 將關聯的聲明(class/category/protocol)放入同一個頭文件
◦ 頭文件名與主要的class/category/protocol相同
Header file |
Declares |
NSString.h |
包含NSString和NSMutableString classes. |
NSLock.h |
包含NSLocking protocol 和 NSLock, NSConditionLock, NSRecursiveLock classes. |
◦ 每一個framework都應該有一個同名頭文件
◦ Include了框架內其餘全部頭文件
Header file |
Framework |
Foundation.h |
Foundation.framework. |
◦ 若是要在一個framework中爲另外一個framework的class catetgory添加方法,加上單詞「Additions」
▪ 如Application Kit的NSBundleAdditions.h 文件
◦ 若是你有一組關聯的函數、常量、結構體或其餘數據類型,將它們放到一個名字合適的頭文件中
▪ 如Application Kit的NSGraphics.h
2、方法
1.通用原則
◦ 以衆所周知的縮寫開始能夠大寫,如TIFF、PDF
◦ 私有方法能夠加前綴
◦ 不要使用 do 或 does 做爲名字的一部分,由於助動詞在這裏不多有實際意義
◦ 一樣的,也別在動詞以前使用副詞和形容詞
- (void)invokeWithTarget:(id)target; - (void)selectTabViewItem:(NSTabViewItem *)tabViewItem
◦ 除非間接返回多個值,不然不要使用 get 單詞(爲了與accessor methods區分)
- (NSSize)cellSize; |
√ |
- (NSSize)calcCellSize; |
✗ |
- (NSSize)getCellSize; |
✗ |
- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag; |
√ |
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag; |
✗ |
- (id)viewWithTag:(NSInteger)aTag; |
√ |
- (id)taggedView:(int)aTag; |
✗ |
- (id)initWithFrame:(CGRect)frameRect; |
√ |
- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide; |
√ |
◦ 雖然下面的例子使用 and 看似不錯,可是一旦參數很是多時就容易出現問題
- (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes; |
√ |
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes; |
✗ |
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag; |
√ |
2.getter和setter方法(Accessor Methods)
◦ - (type)noun;
◦ - (void)setNoun:(type)aNoun;
◦ - (BOOL)isAdjective;
- (NSString *)title; - (void)setTitle:(NSString *)aTitle;
◦ - (BOOL)isAdjective;
◦ - (void)setAdjective:(BOOL)flag;
- (BOOL)isEditable; - (void)setEditable:(BOOL)flag;
◦ - (BOOL)verbObject;
◦ - (void)setVerbObject:(BOOL)flag;
- (BOOL)showsAlpha; - (void)setShowsAlpha:(BOOL)flag;
- (void)setAcceptsGlyphInfo:(BOOL)flag; |
√ |
- (BOOL)acceptsGlyphInfo; |
√ |
- (void)setGlyphInfoAccepted:(BOOL)flag; |
✗ |
- (BOOL)glyphInfoAccepted; |
✗ |
- (void)setCanHide:(BOOL)flag; |
√ |
- (BOOL)canHide; |
√ |
- (void)setShouldCloseDocument:(BOOL)flag; |
√ |
- (BOOL)shouldCloseDocument; |
√ |
- (void)setDoesAcceptGlyphInfo:(BOOL)flag; |
✗ |
- (BOOL)doesAcceptGlyphInfo; |
✗ |
◦ 像這種接收多個參數的方法應該可以傳入nil,由於調用者未必對每一個參數都感興趣
- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase; |
NSBezierPath. |
3.Delegate方法
◦ 省略了前綴的類名和首字母小寫
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
◦ 只有一個sender參數的方法
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
◦ 響應notification的方法(方法的惟一參數就是notification)
- (void)windowDidChangeScreen:(NSNotification *)notification;
◦ did 表示某些事已發生
◦ will 表示某些事將要發生
- (void)browserDidScroll:(NSBrowser *)sender; - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
- (BOOL)windowShouldClose:(id)sender;
4.集合方法
◦ - (void)addElement:(elementType)anObj;
◦ - (void)removeElement:(elementType)anObj;
◦ - (NSArray *)elements;
- (void)addLayoutManager:(NSLayoutManager *)obj; - (void)removeLayoutManager:(NSLayoutManager *)obj; - (NSArray *)layoutManagers;
- (void)insertLayoutManager:(NSLayoutManager *)obj atIndex:(int)index; - (void)removeLayoutManagerAtIndex:(int)index;
- (void)addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place; - (void)removeChildWindow:(NSWindow *)childWin; - (NSArray *)childWindows; - (NSWindow *)parentWindow; - (void)setParentWindow:(NSWindow *)window;
5.方法參數
如:removeObject:(id)anObject
◦ 參數類型裏就已代表它是不是一個指針
...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 *)charCode ...length:(int)numBytes ...point:(NSPoint)aPoint ...stringValue:(NSString *)aString ...tag:(int)anInt ...target:(id)anObject ...title:(NSString *)aString
6.私有方法
◦ 由於如果你的私有方法名已被Apple使用,覆蓋它將會產生極難追蹤的BUG
◦ 能夠爲私有方法加一個前綴,如公司名或項目名:XX_
▪ 例如你的項目叫作Byte Flogger,那麼前綴多是:BF_addObject
◦ 總之,爲子類的私有方法添加前綴是爲了避免覆蓋其父類的私有方法
3、函數
◦ 你使用的類和常量擁有相同的前綴
◦ 前綴後的首字母大寫
NSHighlightRect
NSDeallocateObject
◦ 若是函數返回首個參數的屬性,省略動詞
unsigned int NSEventMaskFromType(NSEventType type) float NSHeight(NSRect aRect)
◦ 若是經過reference返回了值,使用 「Get」
const char *NSGetSizeAndAlignment(const char *typePtr, unsigned int *sizep, unsigned int *alignp)
◦ 若是返回的是boolean值,應該靈活使用動詞
BOOL NSDecimalIsNotANumber(const NSDecimal *decimal)
4、Property及其餘
1.Property與實例變量
1.1 Property
◦ @property (…) 類型 名詞/動詞 ;
@property (strong) NSString *title;
@property (assign) BOOL showsAlpha;
◦ 可省略 」is」 前綴
◦ 但要指定getter方法的慣用名稱
@property (assign, getter=isEditable) BOOL editable;
1.2 實例變量
◦ init、dealloc、accessor methods等方法內部例外
◦ 確保實例變量描述了所存儲的屬性
@implementation MyClass { BOOL _showsTitle; }
@implementation MyClass @synthesize showsTitle=_showsTitle;
爲一個class添加實例變量時,有幾點須要注意:
◦ 開發者關注的應該是對象接口,而不是其數據細節
◦ 你能夠經過使用property來避免聲明實例變量
◦ 若是你但願子類能夠直接訪問某個實例變量,使用 @protected 關鍵字
◦ 若是有可能,仍是使用property
2.常量
2.1 枚舉常量
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 };
2.2 使用const關鍵字的常量
◦ 你可使用const關鍵字來建立一個與其餘常量不相關的integer常量,不然,使用枚舉
◦ 使用const關鍵字的常量也遵循函數的命名規則
const float NSLightGray;
2.3 其餘常量類型
◦ integer常量,使用枚舉
◦ float常量,使用 const 修飾符
◦ 好比 DEBUG 判斷
#ifdef DEBUG
__MACH__
◦ 這樣作能夠有效防止拼寫錯誤
APPKIT_EXTERN NSString *NSPrintCopies;
3.Notifications與Exceptions
3.1 Notifications
[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification
NSApplicationDidBecomeActiveNotification
NSWindowDidMiniaturizeNotification
NSTextViewDidChangeSelectionNotification
NSColorPanelColorDidChangeNotification
3.2 Exceptions
[Prefix] + [UniquePartOfName] + Exception
NSColorListIOException
NSColorListNotEditableException
NSDraggingException
NSFontUnavailableException
NSIllegalSelectorException
5、縮寫
◦ 標準C庫中的縮寫名,如:alloc、init
◦ 參數名可自由使用縮寫,如:imageRep、col、obj、otherWin
縮寫 |
全稱 |
alloc |
Allocate. |
alt |
Alternate. |
app |
Application. |
calc |
Calculate. |
dealloc |
Deallocate. |
func |
Function. |
horiz |
Horizontal. |
info |
Information. |
init |
Initialize. |
int |
Integer |
max |
Maximum. |
min |
Minimum. |
msg |
Message. |
nib |
Interface Builder archive. |
pboard |
Pasteboard. |
rect |
Rectangle. |
Rep |
Representation. |
temp |
Temporary. |
vert |
Vertical. |
縮寫 |
全稱 |
ASCII |
American Standard Code for Information Interchange |
|
Portable Document Format |
XML |
Extensible Markup Language |
HTML |
HyperText Markup Language |
URL |
Uniform Resource Locator |
RTF |
Rich Text Format |
HTTP |
HyperText Transfer Protocol |
TIFF |
Tagged Image File Format |
JPG/JPEG |
Joint Photographic Experts GROUP |
PNG |
Portable Network Graphic Format |
GIF |
Graphics Interchange Format |
LZW |
Lempel Ziv Welch |
ROM |
Read-Only Memory |
RGB |
R(red)、G(green)、B(blue) |
CMYK |
C:Cyan、M:Magenta、Y:Yellow、K:Key Plate(blacK) |
MIDI |
Musical Instrument Digital Interface |
FTP |
File Transfer Protocol |