鍍金池/ 教程/ iOS/ 命名
Case語句
美化代碼
參考資料
對象間的通訊
命名
條件語句
Protocols
NSNotification
面向切面編程
Categories
代碼組織

命名

通用的約定

盡可能遵守 Apple 的命名約定,尤其是和 內(nèi)存管理規(guī)則 (NARC) 相關(guān)的地方。

推薦使用長的、描述性的方法和變量名

推薦:

UIButton *settingsButton;

不推薦:

UIButton *setBut;

Constants 常量

常量應(yīng)該使用駝峰命名法,并且為了清楚,應(yīng)該用相關(guān)的類名作為前綴。

推薦:

static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;

不推薦:

static const NSTimeInterval fadeOutTime = 0.4;

常量應(yīng)該盡量使用 in-line 的字符串字面值或者數(shù)字,這樣便于經(jīng)常用到的時候復(fù)用,并且可以快速修改而不用查找和替換。 常量應(yīng)該用 static 聲明,并且不要使用 #define,除非它就是明確作為一個宏來用的。

推薦:

static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";
static const CGFloat ZOCImageThumbnailHeight = 50.0f;

不推薦:

#define CompanyName @"Apple Inc."
#define magicNumber 42

常量應(yīng)該在 interface 文件中這樣被聲明:

extern NSString *const ZOCCacheControllerDidClearCacheNotification;

并且應(yīng)該在實(shí)現(xiàn)文件中實(shí)現(xiàn)它的定義。

你只需要為公開的常量添加命名空間前綴。即使私有常量在實(shí)現(xiàn)文件中可能以不同的模式使用,你也不需要堅(jiān)持這個規(guī)則了。

方法

對于方法簽名,在方法類型 (-/+ 符號)后應(yīng)該要有一個空格。方法段之間也應(yīng)該有一個空格(來符合 Apple 的規(guī)范)。在參數(shù)名稱之前總是應(yīng)該有一個描述性的關(guān)鍵詞。

使用“and”命名的時候應(yīng)當(dāng)更加謹(jǐn)慎。它不應(yīng)該用作闡明有多個參數(shù),比如下面的initWithWidth:height: 例子:

推薦:

- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;

不推薦:

- (void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height;  // Never do this.

字面值

NSString, NSDictionary, NSArray, 和 NSNumber 字面值應(yīng)該用在任何創(chuàng)建不可變的實(shí)例對象。特別小心 nil 不能放進(jìn) NSArrayNSDictionary 里,這會導(dǎo)致 Crash。

例子:

NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018;

不要這樣做:

NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];

對于那些可變的副本,我們推薦使用明確的如 NSMutableArray, NSMutableString 這些類。

下面的例子 應(yīng)該被避免:

NSMutableArray *aMutableArray = [@[] mutableCopy];

上面的書寫方式存在效率以及可讀性的問題。效率方面,一個不必要的不可變變量被創(chuàng)建,并且馬上被廢棄了;這并不會讓你的 App 變得更慢(除非這個方法會被很頻繁地調(diào)用),但是確實(shí)沒必要為了少打幾個字而這樣做。對于可讀性來說,存在兩個問題:第一個是當(dāng)瀏覽代碼并且看見 @[] 的時候你的腦海里馬上會聯(lián)系到 NSArray 的實(shí)例,但是在這種情形下你需要停下來思考下。另一個方面,一些新手看到后可能會對可變和不可變對象的分歧感到不舒服。他/她可能對創(chuàng)造一個可變對象的副本不是很熟悉(當(dāng)然這并不是說這個知識不重要)。當(dāng)然,這并不是說存在絕對的錯誤,只是可用性(包括可讀性)有一些問題。

上一篇:參考資料下一篇:Categories