前言
本文是本寶寶參考自己的部分代碼規(guī)范和網(wǎng)上眾多其它小伙伴的代碼規(guī)范柬唯,整理和寫出的揭北。規(guī)范涵蓋了很多內(nèi)容,閱讀的小伙伴多點(diǎn)耐心哈之碗。
目的
為了利于項(xiàng)目維護(hù)以及規(guī)范開發(fā)蝙眶,促進(jìn)成員之間Code Review
的效率,故提出以下開發(fā)規(guī)范,如有更好的建議幽纷,歡迎提出式塌。
本文檔的預(yù)期讀者包括:iOS開發(fā)人員。
命名規(guī)范
代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式友浸。正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義峰尝。
*注意:即使純拼音命名方式也要避免采用。但alibab收恢、taobao武学、youku、hangzhou等國際通用的名稱伦意,可視同英文.
大駝峰規(guī)則:每個(gè)單詞的首字母大寫火窒。例:NameTextField。
小駝峰原則:第一個(gè)單詞首字母小寫驮肉,其余都大寫熏矿。例:nameTextField。
項(xiàng)目命名
項(xiàng)目名都遵循大駝峰命名离钝。例如:AoRiseProject
票编。
Bundle Identifier 命名
Bundle Identifier
:采用反域名命名規(guī)范,全部采用小寫字母卵渴,以域名后綴+公司頂級域名+應(yīng)用名形式命名栏妖,例如:com.rogrand.dianbangbang
類名
類的命名都遵循大駝峰命名。一般是:前綴 + 功能 + 類型奖恰。例如:MW + Login + ViewController
。
在實(shí)際開發(fā)中宛裕,一般都會(huì)給工程中所有的類加上屬于本工程的前綴瑟啃。
常用控件類命名類型對照表(下表中前綴為:MW
,如果用到下表中沒有列舉出來揩尸,請去掉UI首字母
蛹屿,遵循實(shí)際規(guī)則即可。)
控件名 | 類型 | 示例 |
---|---|---|
UIViewController | ViewController | MWBaseViewController |
UView | View | MWBaseView |
UITableView | TableView | MWOrderTableView |
UITableViewCell |
Cell |
MWOrderListCell |
UIButton | Button | MWSuccessButton |
UILabel | Label | MWSuccessLabel |
UIImageView |
ImgView |
MWGoodsImgView |
UITextField | TextField | MWNameTextField |
UITextView | TextView | MWSuggestTextView |
其它類相關(guān)對照表
功能 | 類型 | 示例 |
---|---|---|
工具類 | Tool | MWOrderTool |
代理類 | Delegate | MWOrderListDelegate |
管理類 | Manager | MWOrderListModel |
模型類 | Model | MWOrderListModel |
Service類 | Service | MWOrderService |
布局類 | Layout | MWHomeLayout |
數(shù)據(jù)庫類 |
DataBase岩榆、表名+DBHelper |
MWFriendDataBase错负、MWUserTableDBHelper |
類目 |
XXX+(范圍,例如Extension勇边, Additions 或者功能犹撒,例如Frame,Nib粒褒,Block) |
MWUIButton+Additions识颊、MWUIButton+Block |
UIViewController請按照如下分類
#pragma mark - life cycle
#pragma mark - event response
#pragma mark - UITableViewDelegate && UITableViewDataSource
(代理順序往下排列)
#pragma mark - getters and setters
#pragma mark - private
注意:所有視圖或者對象的創(chuàng)建請盡量使用懶加載,調(diào)用的時(shí)候全部使用self.textBtn這樣的方式奕坟。如果是確定的不可變數(shù)組曙砂、字典蜓氨,可直接給定數(shù)組中的元素伏钠。(getters and setters分類中,懶加載可出現(xiàn)_調(diào)用對象抠艾,其它情況請遵循self.調(diào)用原則)
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong)UIButton * textBtn;
@end
@implementation ViewController
#pragma mark - life cycle
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.textBtn];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - private
#pragma mark - event response
#pragma mark - UITableViewDelegate && UITableViewDataSource
//(代理順序往下排列)
#pragma mark - CTAPIManagerCallBackDelegate
#pragma mark - getters and setters
- (UIButton *)textBtn
{
if (_textBtn == nil) {
_textBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_textBtn.frame = CGRectMake(300, 250, 100, 100);
_textBtn.backgroundColor = [UIColor yellowColor];
_textBtn.titleLabel.text = @"text";
[_textBtn addTarget:self action:@selector(text) forControlEvents:UIControlEventTouchUpInside];
}
return _textBtn;
}
@end
變量和方法
變量和方法的命名都遵循小駝峰命名。例如:textVariableStr
, - (void)textAction
響應(yīng)事件桨昙。
變量命名對照表(如果用到下表中沒有列舉出來检号,請去掉UI
、NS
遵循實(shí)際規(guī)則即可绊率〗髁玻或者一看就知道的通用簡寫)
方法命名對照表(方法多為動(dòng)詞或動(dòng)名詞)
功能 | 示例 |
---|---|
- (id)initXX | 初始化相關(guān)方法,使用init為前綴標(biāo)識,如初始化布局- (id)initView |
- (BOOL)isXX | 方法返回值為boolean型的請使用is前綴標(biāo)識 |
- (UIView *)getXX | 返回某個(gè)值的方法滤否,使用get為前綴標(biāo)識 |
- (void)setXX | 設(shè)置某個(gè)屬性值或者相關(guān)數(shù)據(jù) |
- (void)updateXX | 更新數(shù)據(jù) |
- (void)saveXX | 保存數(shù)據(jù) |
- (void)drawXX | 繪制相關(guān)脸狸,使用draw前綴標(biāo)識 |
- (void)clearXX | 清除數(shù)據(jù) |
- (void)XXXAction |
響應(yīng)事件,使用Action為后綴標(biāo)識 |
- (void)loadData |
加載數(shù)據(jù)(一般情況下VC中都會(huì)有這個(gè)方法) |
- (void)loadMoreData |
加載更多數(shù)據(jù) |
- (void)setupUI |
加載布局(一般情況下VC中都會(huì)有這個(gè)方法) |
常量
宏:小寫k+大駝峰 即為:#define kUserAgeKey @“ageKey”
全局常量:工程前+綴全大寫藐俺,下劃線隔開 即為:extern const NSString MW_USER_AGE_KEY
參數(shù)名
參數(shù)名以小駝峰命名炊甲,盡量參考蘋果原生方法風(fēng)格編寫。盡量可讀性好欲芹,看到方法名就知道這個(gè)方法是用來干什么的卿啡。參數(shù)應(yīng)該避免用單個(gè)字符命名。例:- (void)setDataImageUrl:(NSString *)imageUrl name:(NSString *)nameStr content:(NSString *)contentStr
資源文件規(guī)范
資源文件命名
全部小寫菱父,采用下劃線命名法颈娜,加前綴區(qū)分。所有的資源文件都需要加上工程前綴(小寫形式)浙宜。
命名模式:可加后綴_smal
l表示小圖,_big
表示大圖官辽,邏輯名稱可由多個(gè)單詞加下劃線組成,采用以下規(guī)則:
用途_模塊名_邏輯名稱
用途_模塊名_顏色
用途_邏輯名稱
用途_顏色
說明 | 前綴(工程前綴示例MW) | 示例 |
---|---|---|
按鈕相關(guān) | mw_btn_ | mw_btn_home_normal粟瞬、mw_btn_red,mw_btn_red_big |
背景相關(guān) | mw_btn_ | mw_bg_home_header同仆、mw_bg_main |
圖標(biāo)相關(guān) | mw_ic_ | mw_ic_home_location、mw_bg_input |
分割線相關(guān) | mw_div_ | mw_ic_home_location裙品、mw_bg_input |
默認(rèn)相關(guān) | mw_def_ | mw_ic_home_location俗批、mw_bg_input |
文件夾命名
創(chuàng)建文件夾最好創(chuàng)建實(shí)體文件夾,找到工程目錄市怎,創(chuàng)建相應(yīng)文件夾并拖入工程岁忘。文件夾命名使用相應(yīng)模塊結(jié)構(gòu)分層的英文,首字母要大寫区匠。例:Model
臭觉,View
,Controller
,Tool
蝠筑,Other
狞膘,Service
等等。
版本規(guī)范
采用A.B.C 三位數(shù)字命名什乙,比如:1.0.2挽封,當(dāng)有版本更新的時(shí)候,依據(jù)下面的情況來確定版本號規(guī)范臣镣。
版本號 | 說明 | 示例 |
---|---|---|
A.b.c | 屬于重大更新內(nèi)容 | 1.0.2 -> 2.00 |
a.B.c | 屬于小部分更新內(nèi)容 | 1.0.2 -> 1.2.2 |
a.b.C | 屬于補(bǔ)丁更新內(nèi)容 | 1.0.2 -> 1.0.4 |
第三方庫規(guī)范
希望Team能用時(shí)下較新的技術(shù)辅愿,對開源庫的選取,一般都需要選擇比較穩(wěn)定的版本忆某,作者在維護(hù)的項(xiàng)目点待,要考慮作者對issue的解決,以及開發(fā)者的知名度等各方面弃舒。選取之后癞埠,一定的封裝是必要的。
項(xiàng)目使用cocoapods統(tǒng)一管理開源第三庫文件聋呢,不需要手動(dòng)導(dǎo)入和手動(dòng)添加依賴庫苗踪。如果第三方不支持cocoapods,可手動(dòng)導(dǎo)入工程削锰。安裝cocoapods請移步這里cocoapods安裝
注釋規(guī)范
為了減少他人閱讀你代碼的痛苦值通铲,請?jiān)陉P(guān)鍵地方做好注釋。
類注釋
//
// MyViewController.m
// text
//
// Created by 林霞 on 2017/9/12.
// Copyright ? 2017年 林霞 1826692128@qq.com. All rights reserved.
//
該注釋是自動(dòng)生成的器贩,在xcode
中設(shè)置即可颅夺。Created by
電腦用戶名on
創(chuàng)建該文件的時(shí)間。Copyright 2017
后面的名字和郵箱是自己填寫和設(shè)置的蛹稍。具體可在xcode
工程吧黄,Project Document
中設(shè)置。這樣便可在每次新建類的時(shí)候自動(dòng)加上該頭注釋稳摄。
方法注釋
方法注釋,方法外部統(tǒng)一用
option + command + /
饲宿,方法內(nèi)部統(tǒng)一用//
注釋厦酬。
/**
測試
*/
- (void)text
{
//測試按鈕事件響應(yīng)
}
模型注釋
每個(gè)model
中的,包含的每個(gè)屬性瘫想,都必須要寫上相對應(yīng)的注釋仗阅,用///
注釋。閱讀者一看這個(gè)model国夜,就清楚知道model
中的每個(gè)字段代表的意思减噪,用來做什么事情的。
@interface DeliveryModel : NSObject
///提貨劵所在商圈id
@property (nonatomic, assign) long long mallId;
///商圈全稱
@property (nonatomic, copy) NSString *mallFullName;
///商圈簡稱
@property (nonatomic, copy) NSString *mallShortName;
///提貨劵號
@property (nonatomic, copy) NSString *credentialsCode;
///總金額
@property (nonatomic, assign) NSInteger totalAmount;
///提貨劵所在店鋪id
@property (nonatomic, assign) long long storeId;
///貨劵所在店鋪名稱
@property (nonatomic, copy) NSString *storeName;
///提貨劵id
@property (nonatomic, strong) NSNumber *credentialsId;
///狀態(tài):0:未提貨、1:已提貨筹裕、2:已分享醋闭、3:已退款
@property (nonatomic, assign) NSInteger state;
///提貨商品(以下為提貨商品參數(shù))
@property (nonatomic, strong) NSArray<DeliveryGoodslist *> *goodsList;
///二維碼
@property (nonatomic, copy) NSString *qrCode;
///商品總個(gè)數(shù)
@property (nonatomic, assign) NSInteger goodsCount;
@end
如果不是model的屬性,是其它類屬性朝卒,需要注釋证逻,請按照model屬性注釋方式。
編碼規(guī)范
- 所有的方法之間空一行抗斤。
- 所有的代碼塊之間空一行囚企,刪除多余的注釋。
- 所有自定義的方法需要給出注釋瑞眼。
- 盡量使用懶加載龙宏,在控制器分類時(shí)有提及和要求,其它自定義類按照控制器格式分類伤疙,沒有的分類不寫即可银酗。
- 代碼后的’{‘不需要獨(dú)占一行,包括方法之后掩浙,if花吟,switch等。
- 必須要統(tǒng)一的要求厨姚,屬性的定義請按照下圖property之后衅澈,空一格,括號之后空一格谬墙,寫上類名今布,空一格之后跟上
*
和屬性名。
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) DeliveryModel *delivery;
@property (nonatomic, strong) DeliveryLookAdapter *lookAdapter;
@property (nonatomic, strong) DeliveryLookAPIManager *lookManager;
- 遵循一般代碼規(guī)范拭抬,多模仿蘋果API部默。
- 刪除不用的代碼。
- 如果有方法一直不會(huì)用到造虎,請刪除(除工具類)傅蹂。
- 沒有執(zhí)行任何業(yè)務(wù)邏輯的方法,請刪除或給予注釋算凿,刪除多余的資份蝴。源或文件,添加必要的注釋氓轰。
- 比較大的代碼塊需要給出注釋婚夫。
其它規(guī)范
- 建議項(xiàng)目統(tǒng)一使用Masonry和xib結(jié)合的方式布局。不允許出現(xiàn)直接設(shè)置frame的情況署鸡。如果是純代碼的項(xiàng)目案糙,不允許出現(xiàn)xib和拉約束的情況限嫌。不建議使用純storyboard開發(fā)。
- 數(shù)據(jù)提供統(tǒng)一的入口时捌。無論是在 MVP怒医、MVC 還是 MVVM 中,提供一個(gè)統(tǒng)一的數(shù)據(jù)入口匣椰,都可以讓代碼變得更加易于維護(hù)裆熙。比如可使用一個(gè)DataManager,把 http禽笑、preference入录、eventpost、database 都放在DataManger里面進(jìn)行操作佳镜,我們只需要與DataManger打交道
- 提取方法僚稿,去除重復(fù)代碼。對于必要的工具類抽取也很重要蟀伸,這在以后的項(xiàng)目中是可以重用的蚀同。
- 盡可能的使用局部變量
- 盡量減少對變量的重復(fù)計(jì)算。
- 盡量在合適的場合使用單例啊掏。使用單例可以減輕加載的負(fù)擔(dān)蠢络,縮短加載的時(shí)間,提高加載效率迟蜜。但并不是所有的地方都適用于單例刹孔,簡單來說單例主要適用于以下三個(gè)方面:
1. 控制資源的使用,通過線程同步來控制資源的并發(fā)訪問娜睛。
2. 控制實(shí)例的產(chǎn)生髓霞,以達(dá)到節(jié)約資源的目的。
3. 控制數(shù)據(jù)的共享畦戒,在不建立直接關(guān)聯(lián)的條件下方库,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信。 - 最后不要忘了檢測內(nèi)存泄漏障斋∽萘剩可使用Instruments分析內(nèi)存。
緒言
文章如果有什么問題垃环,請閱讀過的小伙伴告知邀层,我會(huì)立即更正。
如果有什么意見或者建議晴裹,歡迎提出或者一塊討論被济。
希望可以一起寫出更好的代碼救赐。