前言
代碼規(guī)范可以說(shuō)是老生常談的話(huà)題了, 也是程序員自我修養(yǎng)的一種體現(xiàn), 雖然一套好的代碼規(guī)范不能使程序運(yùn)行的更加流暢, 不能使程序直接的影響到程序的功能執(zhí)行,但是如果能再發(fā)開(kāi)之前就能明確定義一套代碼規(guī)范,并且嚴(yán)格的去執(zhí)行,肯定能非常有效的提高代碼閱讀性,高的閱讀性也使得后期開(kāi)發(fā),維護(hù)等事半功倍,上手難度降低,在新人加入進(jìn)行也能更快的融入團(tuán)隊(duì)回还。
我們團(tuán)隊(duì)的一套代碼規(guī)范,提供大家參考裆泳。
命名規(guī)范
我們盡可能遵守 Apple 的命名約定, 其推薦使用長(zhǎng)的,描述性強(qiáng)的方法和變量名,使其閱讀起來(lái)更加清晰易懂。不能隨意使用縮寫(xiě),導(dǎo)致其他人員閱讀代碼困難柠硕。 The coding guide for cocoa
駝峰命名
針對(duì)屬性,變量,方法等均采用小寫(xiě)字母
開(kāi)頭的駝峰命名準(zhǔn)則工禾。
前綴
項(xiàng)目名稱(chēng),類(lèi)名,文件名都應(yīng)該保持一致的前綴名,根據(jù) Apple Guide 建議類(lèi)名前綴應(yīng)該使用 2 個(gè)英文以上最好,因?yàn)?Apple 寫(xiě)的框架都是直接使用 2 個(gè)英文字母開(kāi)頭, 使用 3 個(gè)字母 能有效防止類(lèi)名重復(fù)影響工程。
我們使用CC (caicai)
前綴
方法命名
根據(jù) Cocoa 命名方法規(guī)則,我們應(yīng)該準(zhǔn)守這幾個(gè)點(diǎn)蝗柔。
使用小寫(xiě)字母開(kāi)頭,后面嵌套連接的字母使用大寫(xiě)開(kāi)頭闻葵。不過(guò)在寫(xiě)Category Method的時(shí)候, 也盡量加入CC前綴,但不強(qiáng)求癣丧;
對(duì)于采取動(dòng)作行為的方法,使用動(dòng)詞開(kāi)頭,但是不要直接使用 do或者does
每個(gè)方法參數(shù)前必須帶有相同或者能清晰表達(dá)其原意的關(guān)鍵字槽畔。
子類(lèi)化創(chuàng)建相對(duì)父類(lèi)更加詳細(xì)功能的方法時(shí)應(yīng)該把新增參數(shù)添加在原有方法的后面。
假如方法名過(guò)長(zhǎng)的時(shí)候可以采用每個(gè)參數(shù)獨(dú)占一行的規(guī)則,并保持每個(gè)參數(shù)分號(hào) : 對(duì)齊的方式排列坎缭。
實(shí)例方法和類(lèi)方法 (-/+) 符號(hào)后面應(yīng)該保持一個(gè)空格, 如:
- (void)starMonitoring;
命名屬性和實(shí)例變量
一般屬性一致采用 @property 進(jìn)行聲明, 特殊的數(shù)據(jù)類(lèi)型可以使用實(shí)例變量聲明竟痰。
@property (nonatomic, copy) NSString *name;
屬性關(guān)鍵字首個(gè)應(yīng)該是 原子性,到內(nèi)存管理關(guān)鍵詞签钩。如果需要寫(xiě)讀寫(xiě)關(guān)鍵字的話(huà), 其排在第二位.如:@property (nonatomic, readwrite, copy) NSString *name;
聲明實(shí)例變量時(shí)必須采用
_
下劃線(xiàn)作為變量名前綴掏呼。添加
@property
相應(yīng)代碼段, 提高編碼速度。
命名頭文件
- 頭文件名必須采用一致的前綴開(kāi)頭, 加上其代表相關(guān)類(lèi)名代表的形容詞即可铅檩。盡量不要使用縮寫(xiě),寧愿名字稍微長(zhǎng)點(diǎn)兒,也要讓其有一目了然的效果憎夷。
- 聲明相關(guān)的類(lèi)擴(kuò)展和協(xié)議時(shí),必須將其聲明放在主類(lèi)文件夾里面,這樣閱讀起來(lái)相對(duì)方便。
- 如果有多個(gè)功能相似的類(lèi),可以考慮將其劃分為一個(gè)框架,使用 .h 文件進(jìn)行聲明管理昧旨。
命名 Category 方法
在寫(xiě)添加類(lèi)別方法時(shí), 必須采用前綴名_ 后連接對(duì)應(yīng)方法名的方式來(lái)進(jìn)行添加拾给。這樣就有效的避免,覆蓋掉系統(tǒng)原有或新增方法, 導(dǎo)致意想不到的問(wèn)題發(fā)生。
如: - (void)CC_methodName
統(tǒng)一的ViewController 模板
針對(duì)大多數(shù)沒(méi)有特別復(fù)雜邏輯的控制器實(shí)現(xiàn)文件, 我們制定了一套 @implementation 實(shí)現(xiàn)模板.
如下:
#import "CCHomeViewController.h"
@interface CCHomeViewController ()
@end
@implementation CCHomeViewController
#pragma mark - 1.Life Cycle
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// 1.設(shè)置導(dǎo)航欄
[self setupNavBar];
// 2.設(shè)置view
[self setupView];
// 3.請(qǐng)求數(shù)據(jù)
[self setupData];
// 4.設(shè)置通知
[self setupNotification];
}
#pragma mark - 2.Setting View and Style
- (void)setupNavBar {
}
- (void)setupView {
}
- (void)setupData {
}
#pragma mark - Action 相關(guān)事件方法
#pragma mark - lazy load
#pragma mark - UITableView 相關(guān) delegate datasource
#pragma mark - UICollectionView
#pragma mark - 其他一些自定義view代理
#pragma mark - Networking 網(wǎng)絡(luò)請(qǐng)求
可以到 Xcode 修改 ViewController 文件模板, 創(chuàng)建的時(shí)候即自動(dòng)生成模板樣式兔沃。
點(diǎn)語(yǔ)法
在訪問(wèn)屬性或者修改的過(guò)程中,應(yīng)該全程使用 . 語(yǔ)法來(lái)進(jìn)行蒋得。 能提高閱讀性同時(shí), 還能減少代碼長(zhǎng)度。但是又不能濫用乒疏。
推薦:
view.backgroundColor = [UIColor orangeColor];
[UIApplication sharedApplication].delegate;
反對(duì):
[view setBackgroundColor:[UIColor orangeColor]];
UIApplication.sharedApplication.delegate;
私有屬性
要求私有屬性必須在類(lèi) extension 下使用 @peoperty 聲明.
例如:
@interface CCHomeController ()
@property (nonatomic, strong) NSDate *lastRefreshTokenTime;
@property (nonatomic, assign) CCRefreshTokenStatus lastRefreshTokenStatus;
//編碼后的App版本號(hào)额衙,6位數(shù)字,如3.0.1為030001
@property (nonatomic, copy) NSString *encodeVersion;
@end
常量
枚舉常量
要求使用 NS_ENUM() 函數(shù)而非 enum() 函數(shù)進(jìn)行聲明怕吴。 其具有更強(qiáng)的類(lèi)型檢查和代碼補(bǔ)全功能窍侧。
例如代表網(wǎng)絡(luò)狀態(tài)的常量, 網(wǎng)絡(luò)連接成功, 失敗,正在連接等。 我們通常采用枚舉的方式表示转绷。
例如:
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA = 0,
MyEnumValueB,
MyEnumValueC,
};
其他類(lèi)型常量
多用類(lèi)型常量, 少用 #define 預(yù)處理指令.
- 不要使用#define預(yù)處理指令來(lái)定義常量,因?yàn)檫@樣的常量不包括類(lèi)型信息,編譯器只會(huì)在編譯前執(zhí)行查找和替換操作,即使有人重新定義了常量值,編譯器也不會(huì)發(fā)出警告,這樣會(huì)導(dǎo)致應(yīng)用程序中的常量值不一致.
- 在實(shí)現(xiàn)文件.m中使用static const來(lái)定義"只在編譯單元張可見(jiàn)的常量",由于此類(lèi)常量不在全局符號(hào)表中,所以無(wú)須為其名稱(chēng)加前綴.
- 在頭文件中使用extern來(lái)聲明全局常量,并在相關(guān)文件中定義其值,這種常量要出現(xiàn)在全局符號(hào)表中,所以其名稱(chēng)應(yīng)該加以區(qū)分,通常用與之相關(guān)的類(lèi)名做前綴.
只在一個(gè)文件中使用,.m文件
static const NSTimeInterval kAnimalTime =0.3;
多個(gè)類(lèi)中使用伟件,全局
extern NSTimeInterval constkAnimalTime; //In the header file
const NSTimeInterval kAnimalTime =0.3; //In the implementation file
@implementation
static const NSTimeInterval KAnimationDuration = 0.3;
NSString *const CCLoginManagerDidLoginNotification = @"CCLoginManagerDidLoginNotification";
@interface
extern NSString *const CCLoginManagerDidLoginNotification;
反對(duì)
#define ANIMATION_DURATION 0.3;
#define CCLoginManagerDidLoginNotification @"CCLoginManagerDidLoginNotification";
使用類(lèi)型常量定義在效果一目了然, 在使用過(guò)程就能確定其常量類(lèi)型。
需要注意的是如果使用類(lèi)型常量定義,若常量局限于某編譯單元,也就是實(shí)現(xiàn)文件里面,則使用 ==K==作為前綴, 若常量在類(lèi)之外公開(kāi)出來(lái),則需要使用規(guī)定的類(lèi)名作為前綴议经。
文件引入方式
在 .h 文件中盡量使用 @class 聲明文件, 直到 .m 文件中真正需要的時(shí)候在使用 @improt 進(jìn)行引用, 能有效的防止其它類(lèi)引入此類(lèi)時(shí), 一并也引入了
@improt 文件順序: 可以先寫(xiě)引入系統(tǒng)文件, 依次到 Public.h 最后才到我們自己編寫(xiě)的文件斧账。
檢查文件,避免引入到?jīng)]有使用到的文件,發(fā)現(xiàn)應(yīng)及時(shí)清除谴返。
多用字面量語(yǔ)法,少用與之等價(jià)的語(yǔ)法
我們?cè)趧?chuàng)建 NS 開(kāi)頭的數(shù)據(jù)類(lèi)型的時(shí)候, 一律采用字面量語(yǔ)法的形式進(jìn)行創(chuàng)建。
推薦:
NSArray *array = @[@"123", @"456"];
NSDictionary *dictionary = @[@"name": @"jersey", @"age": @"61"];
NSNumber *number = @18;
NSString *string = array[0];
反對(duì):
NSArray *array = [NSArray arrayWithObjects:@"123", @"456", nil];
[NSDictionary dictionaryWithObjectsAndKeys:@"jersey", @"name", @"61", @"age", nil];
NSNumber* number = [NSNumber numberWithInt: 18];
NSString *string = [array objectAtIndex: 1];
功能一致,但是使用字面量能令代碼更為整潔咧织。并且對(duì)于創(chuàng)建數(shù)組,字典使用字面量語(yǔ)法創(chuàng)建,當(dāng)誤傳 nil 時(shí)能更早的發(fā)現(xiàn)錯(cuò)誤亏镰。
間距
不要使用 tab 鍵來(lái)進(jìn)行縮進(jìn), 應(yīng)該使用 4 個(gè)空格來(lái)代替。
方法的大括號(hào)和其他的大括號(hào)(if/else/switch/while 等等)始終和聲明在同一行開(kāi)始拯爽,在新的一行結(jié)束索抓。
方法之間應(yīng)該正好空一行,這有助于視覺(jué)清晰度和代碼組織性毯炮。在方法中的功能塊之間應(yīng)該使用空白分開(kāi)逼肯,但往往可能應(yīng)該創(chuàng)建一個(gè)新的方法。
推薦:
if (user.isHappy) {
// Do something
}
else {
// Do something else
}
條件語(yǔ)句
- 條件判斷語(yǔ)句執(zhí)行主體不管是 if 里面還是 else 里面都必須要使用大括號(hào)包住, 即使代碼是一行的情況(Apple SSL/TLS gotofail)桃煎。 以及 for 循環(huán)篮幢。
- if-else中,else不另起一行为迈,與if的反括號(hào)在同一行三椿,如上段代碼所示,注意else前后均有空格葫辐。
- switch-case中搜锰,case后的代碼多余一行,則需要{}包裹耿战,建議所有case和default后的代碼塊均用{}包裹蛋叼。
涉及位置:@interface、方法實(shí)現(xiàn)剂陡、if-else狈涮、switch-case等。
優(yōu)點(diǎn): 減少代碼冗余行數(shù)鸭栖,代碼更加緊湊歌馍,結(jié)構(gòu)清晰。
推薦:
if(hasSillyName){
LaughOutLoud()
} else {
BlowTheHorn();
}
for(int i = 0 ; i < 10 ; i ++){
BlowTheHorn();
}
反對(duì):
if(hasSillyName)
LaughOutLoud(); //避免晕鹊。
for(int i = 0 ; i < 10 ; i ++)
BlowTheHorn(); //避免松却。
避免尤達(dá)表達(dá)式
不要使用尤達(dá)表達(dá)式。尤達(dá)表達(dá)式是指捏题,拿一個(gè)常量去和變量比較而不是拿變量去和常量比較玻褪。它就像是在表達(dá) “藍(lán)色是不是天空的顏色” 或者 “高個(gè)是不是這個(gè)男人的屬性” 而不是 “天空是不是藍(lán)的” 或者 “這個(gè)男人是不是高個(gè)子的”
表達(dá)式條件應(yīng)該是先寫(xiě)變量在到常量的判斷過(guò)程
推薦:
if ([myValue isEqual:@42]) {
}
不推薦:
if ([@42 isEqual:myValue]) {
}
黃金大道
在使用條件語(yǔ)句編程時(shí),盡管遇到邏輯復(fù)雜的代碼,我們也應(yīng)該盡量避免其嵌套導(dǎo)致閱讀困難。
盡量使用 return 將不符合邏輯的直接忽略掉. 然后將要執(zhí)行的代碼放到判斷語(yǔ)句外面,減少嵌套公荧。
推薦:
- (void)someMethod {
if (![someOther boolValue]) {
return;
}
// Do something important
}
不推薦:
- (void)someMethod {
if ([someOther boolValue]) {
// Do something important
}
}
復(fù)雜的表達(dá)式
當(dāng)出現(xiàn)復(fù)雜的 if 條件的時(shí)候, 可以把它們分別提取出來(lái)賦值到 BOOL 變量上, 讓邏輯更加清晰明了, 約定 2 個(gè)條件以上則需要將其單獨(dú)提取出來(lái)带射。
例如:
BOOL nameContainsSwift = [sessionName containsString:@"Swift"];
BOOL isCurrentYear = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession = nameContainsSwift && isCurrentYear;
if (isSwiftSession) {
// Do something very cool
}
三元運(yùn)算符
推薦使用三元運(yùn)算符進(jìn)行運(yùn)算. 它能使代碼更加簡(jiǎn)潔清晰。
推薦:
result = a > b ? x : y;
不推薦:
result = a > b ? x = c > d ? c : d : y;
當(dāng)三元運(yùn)算符的第二個(gè)參數(shù)(if 分支)返回和條件語(yǔ)句中已經(jīng)檢查的對(duì)象一樣的對(duì)象的時(shí)候循狰,下面的表達(dá)方式更靈巧:
推薦:
result = object ? : [self createObject];
不推薦:
result = object ? object : [self createObject];
錯(cuò)誤處理
很多系統(tǒng)方法通過(guò) error 返回指針的形式來(lái)表示錯(cuò)誤, 我們應(yīng)該針對(duì)其返回值判斷, 而非錯(cuò)誤變量窟社。
推薦:
NSError *error;
if (![self trySomethingWithError:&error]) {
// 處理錯(cuò)誤
}
反對(duì):
NSError *error;
[self trySomethingWithError:&error];
if (error) {
// 處理錯(cuò)誤
}
一些蘋(píng)果的 API 在成功的情況下會(huì)寫(xiě)一些垃圾值給錯(cuò)誤參數(shù)(如果非空)券勺,所以針對(duì)錯(cuò)誤變量可能會(huì)造成虛假結(jié)果(以及接下來(lái)的崩潰)。
NSNotification
約定在我們自己定義 NSNotification 的時(shí)候應(yīng)該把通知的名字定義為一個(gè)字符串常量, 就像把我們暴露給其他類(lèi)的字符串常量一樣灿里。使用 extern 關(guān)鍵字將其在 .h 文件聲明, 并且在 .m 文件對(duì)其定義关炼。
** 使用約定的 CC 作為前綴, 后跟具體通知名稱(chēng), 同時(shí)推薦使用 Did/Will 這樣的動(dòng)詞連接表示最好 **
推薦:
CCBadgeManager.h
extern NSString *const CCBadgeInfoDidUpdateNotification;
CCBadgeManager.m
NSString *const CCBadgeInfoDidUpdateNotification = @"CCBadgeInfoDidUpdateNotification";
Self 循環(huán)引用
我們?cè)趯?xiě) block 回調(diào)的時(shí)候, 特別是對(duì)于實(shí)例方法中調(diào)用, 很容易導(dǎo)致其循環(huán)引用。
我們?cè)陧?xiàng)目中已經(jīng)引入一組強(qiáng)弱引用的宏定義. @weakify(self) 匣吊、@strongify(self)
我們?cè)谟龅叫枰揎?Self 的時(shí)候直接使用這組宏來(lái)進(jìn)行修飾即可儒拂。。
例如
[JSDStartInfo getStartInfoSuccess:^{
@weakify(self)
[JSDCheckVersion checkWithPass:^{
@strongify(self);
[self reloadView];
}];
}];
MVC模式
項(xiàng)目文件結(jié)構(gòu)主要以項(xiàng)目每個(gè)大模塊相應(yīng)下來(lái)進(jìn)行劃分色鸳。如 Main,Home,Invest,Discover,Wealth,More,Account社痛。 這幾個(gè)主要功能模塊進(jìn)行一一劃分、
我們想新建添加模塊的時(shí)候, 必須遵守這個(gè)原則去創(chuàng)建文件夾命雀。
code 一致采用 MVC 設(shè)計(jì)框架, 每個(gè)模塊功能點(diǎn)一般劃分成 Model,ViewController,View,DataEngine 去進(jìn)行實(shí)現(xiàn). 每個(gè)模塊各執(zhí)其職蒜哀。
- Model: 保存相應(yīng)的數(shù)據(jù)結(jié)構(gòu), 邏輯復(fù)雜的情況下, 可以將數(shù)據(jù)操作邏輯從 ViewController 移動(dòng)到 Model 去進(jìn)行實(shí)現(xiàn), 防止 ViewController 代碼過(guò)于冗余. 不方便閱讀。
- ViewController: 主要負(fù)責(zé)獲取 Model 層數(shù)據(jù), 進(jìn)而管理 View 層. 以及 User 一系列交互邏輯, 都由其負(fù)責(zé)響應(yīng)管理吏砂。 由于此層任務(wù)繁重, 邏輯復(fù)雜的時(shí)候容易造成代碼冗余的狀態(tài), 必要的時(shí)候我們也可以更換成 MVVC 模式去有效的避免 MVC 這個(gè)缺點(diǎn)撵儿。
- View: 主要負(fù)責(zé)接收 Model 層數(shù)據(jù), 進(jìn)行頁(yè)面渲染 數(shù)據(jù)展示, 一般無(wú)特殊情況, 建議使用 Xib 去完成界面構(gòu)建, 除非是特殊頁(yè)面, 否則盡量統(tǒng)一使用 Xib 的形式 去完成每個(gè)界面。
- DataEngine:
圖片管理
項(xiàng)目中的圖片一致存放到 Assets.xcassets 進(jìn)行管理. 從 V3.0 版本開(kāi)始是按模塊劃分進(jìn)行管理的, 但是到后面版本的更新迭代中, 出現(xiàn)了按版本順序進(jìn)行分組, 建議后面將圖片一致保存到原有的模塊分組中去,然后每次不需要使用的圖片,及時(shí)清除, 減少 App 體積狐血。
** 圖片名稱(chēng): 圖片名稱(chēng)可以以模塊作為首接 _ 連接其相應(yīng)功能點(diǎn)淀歇。這樣在以后查找起來(lái)也相對(duì)方便 **
如: icon_trade_result_fail 投資,結(jié)果頁(yè),狀態(tài)。 icon_discover_activity 發(fā)現(xiàn),活動(dòng)
Xcode 版本.
Xcode 版本更新迭代很快, 建議定時(shí)到 App Store 進(jìn)行更新到最新版氛雪。
三方庫(kù)管理工具
使用 Cocoapods 統(tǒng)一對(duì)第三庫(kù)進(jìn)行管理, 建議定時(shí)更新到最新版本, 保持版本一致房匆。
關(guān)于引用三方庫(kù)原則: github 上的項(xiàng)目必須要求 200 Star 以上
TODO
當(dāng)在開(kāi)發(fā)某個(gè)功能中遇到一些疑難雜癥的問(wèn)題, 但是又由于時(shí)間緊急, 來(lái)不及把細(xì)節(jié)做到完美, 如果在不影響當(dāng)前功能使用的情況下, 為了防止在后面的開(kāi)發(fā)中遺忘掉, 我們必須要在相應(yīng)的地方添加注釋 然后以 ==TODO:== 的格式, 接相關(guān)問(wèn)題描述添加進(jìn)來(lái), 待后面有空閑時(shí)間之后回來(lái)進(jìn)行修復(fù)完善。
CGRect 使用(忽略)
當(dāng)需要訪問(wèn) CGRect 中某個(gè)成員時(shí), 應(yīng)該使用 CGGeometry 函數(shù)來(lái)直接訪問(wèn)报亩。 而不是使用 .語(yǔ)法來(lái)獲取。
推薦:
CGRect frame = self.view.frame;
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
反對(duì)
CGRect frame = self.view.frame;
CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;
使用 Route 管理控制器切換
為了方便業(yè)務(wù)擴(kuò)展,以及更好的管理 ViewController,對(duì) JLRoutes 三方庫(kù)進(jìn)行一層封裝來(lái)實(shí)現(xiàn),對(duì) 控制器的管理井氢。 所以項(xiàng)目中涉及到的 Push Presen Dismiss 等, 一致使用封裝的 JSDRouter 來(lái)完成弦追。
一行代碼即可完成控制器的跳轉(zhuǎn)
例如:
[JSDRouter openURL:JSDRouteAccountCenter];
[JSDRouter openURL:JSDRouteTradeExtract info:@{@"withdrawInfo":withdrawInfo}];
[JSDRouter openURL:JSDROUTE_BACK];
防止重復(fù)造輪子
在著手開(kāi)發(fā)新需求之前,應(yīng)先觀察一下項(xiàng)目中,是否有已經(jīng)封裝好的相關(guān)功能類(lèi),如果已經(jīng)有了,最好在當(dāng)前類(lèi)上添加 Catogory 進(jìn)行擴(kuò)展。
項(xiàng)目中的基礎(chǔ)功能類(lèi), 以及對(duì)應(yīng)封裝的工具一致保存在 Class ---> Public花竞。
單例
要求必須使用線(xiàn)程安全的 GCD 函數(shù)進(jìn)行創(chuàng)建劲件。
例如:
+ (instancetype)shareInstance {
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
關(guān)于縮寫(xiě)
Objective-C 本身就是讓閱讀者讀起來(lái)就像在閱讀句子一樣的一門(mén)語(yǔ)言, 變量, 常量 特別是方法名相對(duì)其他語(yǔ)言來(lái)說(shuō)會(huì)相對(duì)長(zhǎng)一點(diǎn),主要用意就是為了表達(dá)更加清晰明了, 盡量不讓閱讀的人產(chǎn)生歧義,并且基本能達(dá)到光看代碼名字就知道其用意。
所以我們也應(yīng)該嚴(yán)格遵守語(yǔ)言的設(shè)計(jì)風(fēng)格, 和大家保持一致, 能有效的提高我們協(xié)同開(kāi)發(fā)的效率同時(shí),也能使我們能編寫(xiě)出更容易讓大家接受的代碼约急。
主要參考文檔: Cocoa guide 可接受的縮略語(yǔ)和首字母縮略詞
不推薦大家使用縮寫(xiě),寧愿命名長(zhǎng)一點(diǎn),也一定要保證語(yǔ)義表達(dá)清晰的原則零远。
主要參考資料:
Coding Guidelines for Cocoa
Google Objective-C Style Guide
紐約時(shí)報(bào) 移動(dòng)團(tuán)隊(duì) Objective-C 規(guī)范指南
禪與 Objective-C 編程藝術(shù)