其實大多數(shù)的時間较木,我們寫出來的代碼并不僅僅是給自己看的红符,在協(xié)同開發(fā)中還有很多人會來Review你的代碼,因此伐债,為了不讓別人吐槽自己的代碼预侯,必須要養(yǎng)成良好的習慣,讓自己去學習一些非常好的編碼風格峰锁,因此這里來羅列一下Objectiv-C常用的編碼規(guī)范萎馅。
【1】命名規(guī)則
- 仿照Cocoa的風格來,使用長命名風格
- 變量命名推薦的命名語素順序是:最開頭的是命名空間的簡寫虹蒋,然后越重要糜芳、區(qū)別度越大的語素越要往前放飒货。經(jīng)典的結(jié)構(gòu)是:作用范圍 + 限定修飾 + 類型。
【2】 在每個方法的定義前留白一行峭竣,也就是在方法與方法之間留空一行塘辅。
【3】 功能相近的方法要放在一起,比如一些協(xié)議的方法皆撩,這里推薦用 #pragma mark - *** 的格式來導航代碼扣墩,切分代碼塊。這樣可以方便方法的查找扛吞,并且可以用快捷鍵control + 6來快速查找方法的位置沮榜。
【4】 在用property定義變量時,建議寫全所有參數(shù)喻粹,尤其是如果想定義成只讀的(那么一定要加上readonly),這也是代碼安全性的一個習慣草巡。在定義變量名時守呜,使*號靠著變量名,不要留空格山憨。例如:
@property (nonatomic, copy) NSString *myString;
【5】 定義長的變量值應該拆分成多行查乒。尤其體現(xiàn)在使用數(shù)組或字典。以下也分別是快速聲明數(shù)組@[] 和 字典@{}的方法郁竟。
NSArray *array = @[@"Lin",
@"Hong",
@"is",
@"my",
@"sweet"
];
NSDictionary *dic = @{
@"name":@"LinH",
@"height":@"168cm",
@"weight":@"secret",
@"lover":@"Lix"
};
【6】 二元運算符和參數(shù)之間要留一個空格玛迄,如賦值號=左右兩邊各留一個空格。
self.myString = @"Lin,i love u";
【7】 一元運算符和參數(shù)之間不放置空格棚亩,比如 蓖议!非運算符,&按位運與讥蟆,|按位或勒虾。
BOOL isOpen = true;
BOOL isClose = !isOpen;
【8】 強制類型轉(zhuǎn)換和參數(shù)之間不放置空格。
NSString *str3 = (NSString*)self.myString;
【9】 盡量使用有意義的名字命名瘸彤,拒絕使用i修然,j等無意義字符命名。命名時采用駝峰命名法质况,類的首字母大寫愕宋,使用大駝峰命名,變量的首字母小寫结榄,使用小駝峰命名中贝。
NSManagedObjectContext //類 (大駝峰)
managedObjectContext //變量(小駝峰)
【10】 盡量減少在代碼中直接使用數(shù)字常亮,而使用宏定義等方式潭陪。如MAX_NUMBER_PHONE代替8等等雄妥。這樣我們搜索和后期的修改維護代碼也比較方便最蕾。
【11】 盡量減少代碼中的重復使用,比如代碼中多處要使用屏幕寬度老厌,然后計算[UIScreen mainScreen].bounds.size.width很多次瘟则,很繁瑣,代碼也很長枝秤,不如直接宏定義醋拧。
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width
【12】 合理使用約定俗成的縮略詞:
- alloc:分配;
- alt:輪流淀弹,交替丹壕;
- app:應用程序;
- calc:計算;
- dealloc:銷毀;
- func:函數(shù)薇溃、方法;
- horiz:水平的;
- info:信息;
- init:初始化;
- max:最大的;
- min:最小的;
- msg:消息;
- nib:Interface Builder;
- rect:矩形;
- temp:暫時的;
- vert:垂直的;
【13】 函數(shù)長度不要超過50行菌赖,小函數(shù)比大函數(shù)的可讀性更強。函數(shù)的參數(shù)不宜過多沐序,零元函數(shù)最好琉用,一元函數(shù)也不錯,高于三元的函數(shù)需重構(gòu)策幼。
【14】 合理范圍內(nèi)使用鏈式編程
UIView *myView = [[UIView alloc] init];
但是嵌套不宜超過3層邑时,超過3層需進行重構(gòu)。
【15】 函數(shù)調(diào)用時所有參數(shù)在同一行特姐。如果參數(shù)過多晶丘,則可以每行一個參數(shù),每個參數(shù)以冒號對齊唐含。
【16】 對傳入?yún)?shù)的保護或者說是否為空的判斷浅浮,盡量不要使用if(!obj),而使用NSAssert斷言來處理。NSAssert是系統(tǒng)定義的宏捷枯。
NSAssert(myView != nil, @"myView參數(shù)為空");
- 如果條件判斷為真脑题,則程序繼續(xù)執(zhí)行
- 如果判斷條件為假,則拋出異常铜靶,異常內(nèi)容為后面定義的字符串
【17】 if-else超過四層的時候叔遂,就要考慮重構(gòu),多層的if-else結(jié)構(gòu)很難維護争剿。
【18】 當需要一定條件才執(zhí)行某項操作時已艰,最左邊的應該是最重要的代碼,不要將最重要的代碼內(nèi)嵌到if中蚕苇。如良好的風格是:
- (void) someMethod {
if(![someOther boolValue]) {
return;
}
//最重要的代碼寫在這里哩掺;
}
反面教材:
- (void) someMethod {
if([someOther boolValue]) {
//重要代碼;
}
}
【19】 所有的邏輯塊都使用{}花括號包圍涩笤,就算只是一行代碼嚼吞。在寫方法或者函數(shù)時盒件,把花括號的開頭放在跟方法名的同一行。
【20】 明確指定構(gòu)造函數(shù)舱禽,并有適當?shù)淖⑨尅?/p>
【21】 不要在init方法中把變量或者說屬性初始化為0或者nil炒刁,因為沒有必要。
【22】 UIView的子類化初始化的時候誊稚,不要進行任何的布局操作翔始。布局操作應該在layoutSubviews里面做;需要重新布局的時候調(diào)用setNeedsLayout里伯,而不要直接調(diào)用layoutSubviews城瞎。
【23】 保持公共API簡單,也就是保持.h文件簡單疾瓮。放在.h中聲明的函數(shù)都是會被公開的脖镀,如果根本就沒必要對其他類公開,再不要在.h中聲明狼电。OC中的方法都是共有方法认然,沒有私有方法一說。
【24】 一個文件只實現(xiàn)一個類漫萄,同一個文件中不要有多個類。
【25】 布局時盡量使用相對布局盈匾,比如使用子View在父View中的相對位置腾务。
【26】 protocol單獨用一個文件來創(chuàng)建,盡量不要與相關類混在一個文件中削饵。
【27】 在類定義中使用到自己定義類的時候岩瘦,盡量不要在頭文件中引入自己定義類的頭文件,使用@class替代窿撬。而在實現(xiàn)文件中引入頭文件启昧。
【28】 推薦方法的第一個花括號直接跟在方法體后,而不是另起一行劈伴,這樣可以減少代碼行密末。
【29】 block中第一行也要留空,同方法體中的第一行留空跛璧。使代碼清晰严里。
【30】 代表類方法和實例方法的"+"加號,"-"減號后需要一個空格追城。這是一個非常小的細節(jié)刹碾,系統(tǒng)默認的方法都是這樣的,我們自己聲明或者實現(xiàn)一個方法的時候也需要這樣座柱。
【31】 不要用點語法來調(diào)用方法迷帜,只用來訪問屬性物舒。這樣是為了防止代碼可讀性問題。
【32】 一個類的Delegate對象通常還引用著類本身戏锹,這樣很容易造成引用循環(huán)的問題冠胯,所以類的Delegate屬性要設置為弱引用。
【33】 好的代碼應該是"自解釋的"景用,但仍然需要詳細的注釋來說明參數(shù)的意義涵叮、返回值、功能以及可能的副作用伞插。