前言
本文是作者參考自己的部分代碼規(guī)范和網上眾多其它小伙伴的代碼規(guī)范,整理和寫出的。
規(guī)范涵蓋了很多內容,閱讀的小伙伴多點耐心哈。
By:申自禮
目的
為了利于項目維護以及規(guī)范開發(fā),促進成員之間Code Review的效率,故提出以下開發(fā)規(guī)范,如有更好的建議,歡迎提出。
本文檔的預期讀者包括:iOS開發(fā)人員。
命名規(guī)范
代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。
*注意:即使純拼音命名方式也要避免采用。但alibaba、taobao、youku、shanghai等國際通用的名稱,可視同英文.
大駝峰規(guī)則:每個單詞的首字母大寫。例:NameTextField。
小駝峰原則:第一個單詞首字母小寫,其余都大寫。例:nameTextField。
項目命名 && 文件命名
項目名和文件名都遵循大駝峰命名。例如:CWBusinessZongBu、CarWins-Group。
Bundle Identifier 命名
Bundle Identifier:采用反域名命名規(guī)范,以域名后綴(小寫com)+公司頂級域名(小寫carwins)+應用名(總部ZongBu駝峰命名方式)形式命名,例如:com.carwins.ZongBu
類名
類的命名都遵循大駝峰命名。一般是:前綴 + 功能 + 類型。例如:CW + Login + ViewController。
在實際開發(fā)中,一般都會給工程中所有的類加上屬于本工程的前綴。
常用控件類命名類型對照表(下表中前綴為:CW,如果用到下表中沒有列舉出來,請去掉UI首字母,遵循實際規(guī)則即可。)
| 控件名 | 類型 | 示例 |
|---|---|---|
| UIViewController | ViewController、VC | CWBaseViewController |
| UView | View | CWBaseView |
| UITableView | TableView | CWOrderTableView |
| UITableViewCell | Cell | CWOrderListCell |
| UIButton | Button、Btn | CWSuccessButton |
| UILabel | Label、Lab | CWSuccessLabel |
| UIImageView | ImgView | CWGoodsImgView |
| UITextField | TextField | CWNameTextField |
| UITextView | TextView | CWSuggestTextView |
其它類相關對照表
| 功能 | 類型 | 示例 |
|---|---|---|
| 工具類 | Tool | CWOrderTool |
| 代理類 | Delegate | CWOrderListDelegate |
| 管理類 | Manager | CWOrderListModel |
| 模型類 | Model | CWOrderListModel |
| Service類 | Service | CWOrderService |
| 布局類 | Layout | CWHomeLayout |
數(shù)據(jù)庫類 |
DataBase、表名+DBHelper |
CWFriendDataBase、CWUserTableDBHelper |
類目 |
XXX+(范圍,例如Extension, Additions 或者功能,例如Frame,Nib,Block) |
CWUIButton+Additions、CWUIButton+Block |
UIViewController請按照如下分類
#pragma mark - life cycle
#pragma mark - event response
#pragma mark - UITableViewDelegate && UITableViewDataSource
(代理順序往下排列)
#pragma mark - getters and setters
#pragma mark - private
注意:所有視圖或者對象的創(chuàng)建請盡量使用懶加載,調用的時候全部使用self.textBtn這樣的方式。如果是確定的不可變數(shù)組、字典,可直接給定數(shù)組中的元素。(getters and setters分類中,懶加載可出現(xiàn)_調用對象,其它情況請遵循self.調用原則)
#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響應事件。
變量命名對照表(如果用到下表中沒有列舉出來,請去掉UI、NS遵循實際規(guī)則即可?;蛘咭豢淳椭赖耐ㄓ煤唽懀?br>
方法命名對照表(方法多為動詞或動名詞)
| 功能 | 示例 |
|---|---|
| - (id)initXX | 初始化相關方法,使用init為前綴標識,如初始化布局- (id)initView |
| - (BOOL)isXX | 方法返回值為boolean型的請使用is前綴標識 |
| - (UIView *)getXX | 返回某個值的方法,使用get為前綴標識 |
| - (void)setXX | 設置某個屬性值或者相關數(shù)據(jù) |
| - (void)updateXX | 更新數(shù)據(jù) |
| - (void)saveXX | 保存數(shù)據(jù) |
| - (void)drawXX | 繪制相關,使用draw前綴標識 |
| - (void)clearXX | 清除數(shù)據(jù) |
- (void)XXXAction |
響應事件,使用Action為后綴標識 |
- (void)loadData |
加載數(shù)據(jù)(一般情況下VC中都會有這個方法) |
- (void)loadMoreData |
加載更多數(shù)據(jù) |
- (void)setupUI |
加載布局(一般情況下VC中都會有這個方法) |
常量
宏:小寫k+大駝峰 即為:#define kUserAgeKey @“ageKey”
全局常量:工程前+綴全大寫,下劃線隔開 即為:extern const NSString CW_USER_AGE_KEY
參數(shù)名
參數(shù)名以小駝峰命名,盡量參考蘋果原生方法風格編寫。盡量可讀性好,看到方法名就知道這個方法是用來干什么的。參數(shù)應該避免用單個字符命名。例:- (void)setDataImageUrl:(NSString *)imageUrl name:(NSString *)nameStr content:(NSString *)contentStr
資源文件規(guī)范
資源文件命名
全部小寫,采用下劃線命名法,加前綴區(qū)分。所有的資源文件都需要加上工程前綴(小寫形式)。
命名模式:可加后綴_small表示小圖,_big表示大圖,邏輯名稱可由多個單詞加下劃線組成,采用以下規(guī)則:
用途_模塊名_邏輯名稱
用途_模塊名_顏色
用途_邏輯名稱
用途_顏色
| 說明 | 前綴(工程前綴示例CW) | 示例 |
|---|---|---|
| 按鈕相關 | cw_btn_ | cw_btn_home_normal、cw_btn_red,cw_btn_red_big |
| 背景相關 | cw_btn_ | cw_bg_home_header、cw_bg_main |
| 圖標相關 | cw_ic_ | cw_ic_home_location、cw_bg_input |
| 分割線相關 | cw_div_ | cw_ic_home_location、cw_bg_input |
| 默認相關 | cw_def_ | cw_ic_home_location、cw_bg_input |
文件夾命名
創(chuàng)建文件夾最好創(chuàng)建實體文件夾,找到工程目錄,創(chuàng)建相應文件夾并拖入工程。文件夾命名使用相應模塊結構分層的英文,首字母要大寫。例:Model,View,Controller,Tool,Other,Service等等。
版本規(guī)范
采用A.B.C 三位數(shù)字命名,比如:1.0.2,當有版本更新的時候,依據(jù)下面的情況來確定版本號規(guī)范。
| 版本號 | 說明 | 示例 |
|---|---|---|
| A.b.c | 屬于重大更新內容 | 1.0.2 -> 2.00 |
| a.B.c | 屬于小部分更新內容 | 1.0.2 -> 1.2.2 |
| a.b.C | 屬于補丁更新內容 | 1.0.2 -> 1.0.4 |
第三方庫規(guī)范
希望Team能用時下較新的技術,對開源庫的選取,一般都需要選擇比較穩(wěn)定的版本,作者在維護的項目,要考慮作者對issue的解決,以及開發(fā)者的知名度等各方面。選取之后,一定的封裝是必要的。
項目使用cocoapods統(tǒng)一管理開源第三庫文件,不需要手動導入和手動添加依賴庫。如果第三方不支持cocoapods,可手動導入工程。安裝cocoapods請移步這里cocoapods安裝
注釋規(guī)范
為了減少他人閱讀你代碼的痛苦值,請在關鍵地方做好注釋。
類注釋
//
// MyViewController.m
// text
//
// Created by 林亦辰 on 2017/2/22.
// Copyright ? 2017年 iOSShen. All rights reserved.
//
該注釋是自動生成的,在xcode中設置即可。Created by 電腦用戶名on 創(chuàng)建該文件的時間。Copyright 2017 后面的名字和郵箱是自己填寫和設置的。具體可在xcode工程,Project Document中設置。這樣便可在每次新建類的時候自動加上該頭注釋。
方法注釋
方法注釋,方法外部統(tǒng)一用
option + command + /,方法內部統(tǒng)一用//注釋。
/**
測試
*/
- (void)text
{
//測試按鈕事件響應
}
模型注釋
每個model中的,包含的每個屬性,都必須要寫上相對應的注釋,用///注釋。閱讀者一看這個model,就清楚知道model中的每個字段代表的意思,用來做什么事情的。
@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;
///商品總個數(shù)
@property (nonatomic, assign) NSInteger goodsCount;
@end
如果不是model的屬性,是其它類屬性,需要注釋,請按照model屬性注釋方式。
編碼規(guī)范
- 所有的方法之間空一行。
- 所有的代碼塊之間空一行,刪除多余的注釋。
- 所有自定義的方法需要給出注釋。
- 盡量使用懶加載,在控制器分類時有提及和要求,其它自定義類按照控制器格式分類,沒有的分類不寫即可。
- 代碼后的’{‘不需要獨占一行,包括方法之后,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。
- 刪除不用的代碼。
- 如果有方法一直不會用到,請刪除(除工具類)。
- 沒有執(zhí)行任何業(yè)務邏輯的方法,請刪除或給予注釋,刪除多余的資。源或文件,添加必要的注釋。
- 比較大的代碼塊需要給出注釋。
其它規(guī)范
- 盡量以純代碼形式開發(fā),frame配合Masonry或者Extension來布局,宏定義或者常量表示寬高,避免使用320或375等固定數(shù)值。
- 數(shù)據(jù)提供統(tǒng)一的入口。無論是在 MVP、MVC 還是 MVVM 中,提供一個統(tǒng)一的數(shù)據(jù)入口,都可以讓代碼變得更加易于維護。比如可使用一個DataManager,把 http、preference、eventpost、database 都放在DataManger里面進行操作,我們只需要與DataManger打交道
- 提取方法,去除重復代碼。對于必要的工具類抽取也很重要,這在以后的項目中是可以重用的。
- 盡可能的使用局部變量
- 盡量減少對變量的重復計算。
- 盡量在合適的場合使用單例。使用單例可以減輕加載的負擔,縮短加載的時間,提高加載效率。但并不是所有的地方都適用于單例,簡單來說單例主要適用于以下三個方面:
1. 控制資源的使用,通過線程同步來控制資源的并發(fā)訪問。
2. 控制實例的產生,以達到節(jié)約資源的目的。
3. 控制數(shù)據(jù)的共享,在不建立直接關聯(lián)的條件下,讓多個不相關的進程或線程之間實現(xiàn)通信。 - 最后不要忘了檢測內存泄漏??墒褂肐nstruments分析內存等。