通過建立代碼編寫規(guī)范,形成iOS開發(fā)團(tuán)隊編碼約定,提高程序的可靠性、可讀性、一致性、可維護(hù)、可擴(kuò)展,保證程序代碼的質(zhì)量。提高程序的重用性,使開發(fā)人員之間的工作成果可以共享。
一、命名規(guī)則
官方規(guī)則:Cocoa代碼指南
1、總則
- 簡潔
簡單明了,盡量使用全拼
應(yīng)該: setBackgroundColor
不應(yīng)該:setBkgdColor
當(dāng)然,我們也會有一些常用的縮略詞,比如 info 代表 Information等(待補(bǔ)充)
一致性
作用相同,或者在表達(dá)同一件事時,統(tǒng)一命名。
比如位置存儲信息 location,不要再出來place表示位置的情況。無自引用
應(yīng)該:nameString
不應(yīng)該:nameStringObject
2、一般類、屬性、方法命名
遵守駝峰命名法,類名首字母大寫,方法名和屬性首字母小寫(首字母為縮略詞,如WWDC時除外)
- 類名需要加前綴,前綴一般為:“項目關(guān)鍵詞”+“模塊關(guān)鍵詞”
如短信需求,前綴應(yīng)該為“MGSMS”(現(xiàn)在是FB,因為之前項目名為5Ber)
以類型為結(jié)尾,如:
MWBaseViewController、MWOrderListCell、MWSuggestTextView...
- 方法命名:參數(shù)前要加描述詞
應(yīng)該:- (void)updateListData:(NSDictionary *)data;
不應(yīng)該:- (void)update:(NSDictionary *)data;
- 私有變量應(yīng)該盡可能代替實(shí)例變量的使用。盡管使用實(shí)例變量是一種有效的方式,但更偏向于使用屬性來保持代碼一致性。
屬性get忽略 is前綴,建議如下寫法:
@property (assign, getter=isEditable) BOOL editable;
3、枚舉命名規(guī)則
枚舉名同類名規(guī)則,加前綴,大駝峰命名
枚舉值去掉前綴,大駝峰命名
typedef NS_ENUM(NSInteger, FBSMSControllerSelectType) {
ControllerSelectTypeOne,
ControllerSelectType..,
};
多用枚舉控制多態(tài),減少bool值等去判斷的情況,增加可讀性
4、常量命名規(guī)則
- 以const修飾一個常量,一般是寫在.h文件中,然后將.h的頭文件加入預(yù)編譯pch文件中,以小寫字母k開頭,后面單詞遵循"駝峰原則"命名。例如:
const float kMaxHeigh = 100.f;
const int kNumberCount = 100;
- 如果是特殊含義的常量,聲明形式為"各APP前綴+名稱",形式如下:
const NSString *FB*** = @"xx"
宏定義
宏定義在很多方面都會使用,例如定義高度、工具類,還有諸如文件路徑。宏定義的命名,需要傳參數(shù)的時候使用前綴,比如"FB":
#define FB***
二、代碼格式化
- 文件夾規(guī)范
Mogo
- Main:主流程頁面代碼
- Home:
- subModule
Controller
server
- Model
- View
- iVoice:
- ...
- Common:通用代碼(自己封裝的一些UI庫之類的)
- Customer
- Tool
- FBAnalytics
...
- Vender:拉進(jìn)來的代碼庫
- Resource:資源文件
- Other:全局文件
Products:應(yīng)用程序
Pods:pod管理
Frameworks:手動拉入的代碼庫
- 常用規(guī)范
- 運(yùn)算符前后前后各一個空格
- *號緊貼屬性名,和類名之間隔一個空格
NSString *text = @"hello world";
- 括號前后各一個空格
- 屬性修飾符和前面的,隔一個空格
@property (nonatomic, strong) UITableView *tableView;
- 當(dāng)參數(shù)過長的時候,沒個參數(shù)占用一行,且按照冒號對齊。
- 在聲明類方法或者實(shí)例方法的時候,“+”或者“-”和返回值之間保留一個空格,
且返回值和方法名的第一個字母之間不要留空格。
-(void)doSomethingWithName:(NSString *)name
rect:(CGRect)rect;
- 注釋一般放在.h,.m文件盡量減少注釋
單行的用//+空格開頭,多行的采用/* */注釋
//TODO: 用來注釋沒有完成的功能
#warning 用來標(biāo)記自己的debug修改,以免遺漏
哪里需要注釋:
1. 在某個變量、屬性、或者方法不能夠直接從名字得知其用途時。
2. 區(qū)分代碼區(qū)時(在常量文件和控制器類的.h文件和.m文件里)。
3. 在不相關(guān)的業(yè)務(wù)處理交叉點(diǎn)。
4. 文件的基本信息
5. 有疑惑的地方(FIXME)
6. 未完成或者待優(yōu)化的地方。(#waring //TODO:)
7. 聲明枚舉時應(yīng)該對每個值說明。
8. 修改別人代碼的時候。
9. 編寫API時,一般需要對所有的接口和屬性帶上注釋
注釋需要注意:
1. 不要為了注釋而注釋,請只在關(guān)鍵點(diǎn)注釋
2. 劃分代碼塊最好的方式不一定是注釋,有時候使用空行也可以達(dá)到很好的效果。
- 初始化
在初始化方法中,不要將變量初始化為“0”或“nil”,那是多余的,
內(nèi)存中所有的新創(chuàng)建的對象(isa除外)都是0,所以不需要重復(fù)初始化 為 “0”或“nil”;
對nil的檢查
僅在有業(yè)務(wù)邏輯需求時檢查nil,而非為了防止崩潰。
- 組件的創(chuàng)建,應(yīng)該使用代碼塊或者懶加載的方式(我習(xí)慣用代碼塊)
- 建議項目統(tǒng)一使用Masonry的方式布局。不允許出現(xiàn)直接設(shè)置frame的情況。
xib的使用,盡量減少拉約束的情況
- controller代碼結(jié)構(gòu)
#pragma mark lifeCycle
- (instancetype)init {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)dealloc {}
- (void)didReceiveMemoryWarning {}
#pragma mark public-method
#pragma mark private-method
#pragma mark event-response
#pragma mark - Protocol conformance
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark set/get
- (NSMutableArray<CyTableViewCellModel *> *)dataSectionArr{}
- 排版格式
- 盡量使用.語法
應(yīng)該:array.count
不應(yīng)該:[array count]
多使用黃金路徑
- (void)someMethod {
if(error) {
return;
}
doSomething
}
而不是:
- (void)someMethod {
if(!error) {
doSomething
}
}
多使用三目運(yùn)算符:
result = a > b ? x : y;
三、git版本控制
1、分支管理
- 只允許從dev分支拉出新的分支
- 其他分支只和dev分支做合并
- 提交代碼時,確保本地build success
- 項目測試結(jié)束之后,即定檔之后,才合并到master分支
- 項目提測需要打tag
2、項目內(nèi)環(huán)境配置(APPInfo管理)
三種項目渠道,主要是為了在統(tǒng)計和crash收集時作區(qū)分,以便更好地定位
- fir:即平時我們打包到fir的環(huán)境,測試證書,release環(huán)境
- beta:testflight版本,正式證書,release環(huán)境
- appstore:testflight版本,正式證書,release環(huán)境
APPIsDev():
其他
1、盡量減少IO的操作,優(yōu)先使用內(nèi)存保存
不要出現(xiàn)存儲傳值的情況
2、數(shù)據(jù)量較大的操作,放到子線程處理
3、數(shù)據(jù)處理從代碼中抽離出來,我一般的習(xí)慣是一個控制器一個server,數(shù)據(jù)處理放到server中
4、如何封裝代碼??