代碼規(guī)范
1.封裝
所有方法、屬性名稱嚴(yán)格仿照蘋果API的命名方式,做到見名思意。
2.命名規(guī)則
代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。
* 注意:即使純拼音命名方式也要避免采用。但alibab、taobao、youku、hangzhou等國(guó)際通用的名稱,可視同英文.
大駝峰規(guī)則:每個(gè)單詞的首字母大寫。例:NameTextField。
小駝峰原則:第一個(gè)單詞首字母小寫,其余都大寫。例:nameTextField。
類名前綴: 無需使用前綴,
類名后綴: 以控件名稱為后綴,TableViewCell,CollectionViewCell統(tǒng)一用Cell為后綴; 數(shù)據(jù)層統(tǒng)一以Model為后綴。如:
+ LoginView
+ LoginCell
+ LoginModel(數(shù)據(jù)層統(tǒng)一后綴為Model)
控制器: 在名稱結(jié)尾縮寫Controller,如: 類名+Controller
LoginController
屬性: 除了Cell以外所有的控件和類名在名稱結(jié)尾寫全稱(別管多長(zhǎng)統(tǒng)一寫全稱?。?/h3>
+ @property (nonatomic, strong) UIButton *loginButton;
+ @property (nonatomic, strong) UIButton *loginLabel;
+ @property (nonatomic, strong) UIButton *loginView;
+ @property (nonatomic, strong) UIButton *loginTextField;
+ @property (nonatomic, strong) UIButton *loginTextView;
變量命名,以下劃線'_'開頭:
BOOL _isLoginOtherDevice;
常量命名,以通知舉例: 模塊+動(dòng)作+Notification
LivingPraiseCountNotification
GOWHBChatListCountNotification
+ @property (nonatomic, strong) UIButton *loginButton;
+ @property (nonatomic, strong) UIButton *loginLabel;
+ @property (nonatomic, strong) UIButton *loginView;
+ @property (nonatomic, strong) UIButton *loginTextField;
+ @property (nonatomic, strong) UIButton *loginTextView;
BOOL _isLoginOtherDevice;LivingPraiseCountNotificationGOWHBChatListCountNotification以請(qǐng)求頭拼接舉例: 模塊+用途
ShoppingAddNewAddressGroupChatCreateNewGroup
枚舉命名,應(yīng)以枚舉類型開頭,以枚舉標(biāo)記為輔:
typedef NS_ENUM(NSInteger,UITableViewScrollPosition)
{
UITableViewScrollPositionNone,
UITableViewScrollPositionTop,
UITableViewScrollPositionMiddle,
UITableViewScrollPositionBottom,
};
3.全局的變量盡量使用常量,用extern進(jìn)行拓展,不要使用宏。
4.不使用pch文件,把常用的頭文件放在自定義的頭文件包含,能用常量就不要使用宏,不常用的頭文件用到再包含。
5.注釋規(guī)范
為了減少他人閱讀你代碼的痛苦值,請(qǐng)?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)一用//注釋。
/**
測(cè)試
*/
- (void)text
{
//測(cè)試按鈕事件響應(yīng)
}
6.h文件的引用必須使用@class,不要使用#import!
7.使用NSDictionary,NSArray,NSString內(nèi)容進(jìn)行操作、處理服務(wù)器返回?cái)?shù)據(jù)等操作時(shí),應(yīng)調(diào)用空值判斷。
8.一定要注意自己接觸過的類的dealloc必須要走
9.UIViewController請(qǐng)按照如下分類
#pragma mark - life cycle
#pragma mark - event response
#pragma mark - UITableViewDelegate && UITableViewDataSource
(代理順序往下排列)
#pragma mark - getters and setters
#pragma mark - private
* 注意:所有視圖或者對(duì)象的創(chuàng)建請(qǐng)盡量使用懶加載,調(diào)用的時(shí)候全部使用self.textBtn這樣的方式。如果是確定的不可變數(shù)組、字典,可直接給定數(shù)組中的元素。(getters and setters分類中,懶加載可出現(xiàn)_調(diào)用對(duì)象,其它情況請(qǐng)遵循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
10.變量和方法
變量和方法的命名都遵循小駝峰命名。例如:textVariableStr, - (void)textAction響應(yīng)事件。
變量命名對(duì)照表(如果用到下表中沒有列舉出來,請(qǐng)去掉UI、NS遵循實(shí)際規(guī)則即可?;蛘咭豢淳椭赖耐ㄓ煤?jiǎn)寫)
方法命名對(duì)照表(方法多為動(dòng)詞或動(dòng)名詞)
| 功能 | 示例 |
|---|---|
| - (id)initXX. | 初始化相關(guān)方法,使用init為前綴標(biāo)識(shí),如初始化布局- (id)initView |
| - (BOOL)isXX. | 方法返回值為boolean型的請(qǐng)使用is前綴標(biāo)識(shí) |
| - (UIView *)getXX | 返回某個(gè)值的方法,使用get為前綴標(biāo)識(shí) |
| - (void)setXX | 設(shè)置某個(gè)屬性值或者相關(guān)數(shù)據(jù) |
| - (void)updateXX | 更新數(shù)據(jù) |
| - (void)saveXX | 保存數(shù)據(jù) |
| - (void)drawXX | 繪制相關(guān),使用draw前綴標(biāo)識(shí) |
| - (void)clearXX | 清除數(shù)據(jù) |
| - (void)XXXAction | 響應(yīng)事件,使用Action為后綴標(biāo)識(shí) |
| - (void)loadData | 加載數(shù)據(jù)(一般情況下VC中都會(huì)有這個(gè)方法) |
| - (void)loadMoreData | 加載更多數(shù)據(jù) |
| - (void)setupUI | 加載布局(一般情況下VC中都會(huì)有這個(gè)方法) |
11.參數(shù)名
參數(shù)名以小駝峰命名,盡量參考蘋果原生方法風(fēng)格編寫。盡量可讀性好,看到方法名就知道這個(gè)方法是用來干什么的。參數(shù)應(yīng)該避免用單個(gè)字符命名。例:- (void)setDataImageUrl:(NSString *)imageUrl name:(NSString *)nameStr content:(NSString *)contentStr
12.文件夾命名
創(chuàng)建文件夾最好創(chuàng)建實(shí)體文件夾,找到工程目錄,創(chuàng)建相應(yīng)文件夾并拖入工程。文件夾命名使用相應(yīng)模塊結(jié)構(gòu)分層的英文,首字母要大寫。例:Model,View,Controller,Tool,Other,Service等等。
13.編碼規(guī)范
- 所有的方法之間空一行。
- 所有的代碼塊之間空一行,刪除多余的注釋。
- 所有自定義的方法需要給出注釋。
- 盡量使用懶加載,在控制器分類時(shí)有提及和要求,其它自定義類按照控制器格式分類,沒有的分類不寫即可。
- 代碼后的’{‘不需要獨(dú)占一行,包括方法之后,if,switch等。
- 必須要統(tǒng)一的要求,屬性的定義請(qǐng)按照下圖property之后,空一格,括號(hào)之后空一格,寫上類名,空一格之后跟上*和屬性名。
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) DeliveryModel *delivery;
@property (nonatomic, strong) DeliveryLookAdapter *lookAdapter;
@property (nonatomic, strong) DeliveryLookAPIManager *lookManager;
- 遵循一般代碼規(guī)范,多模仿蘋果API。
- 刪除不用的代碼。
- 如果有方法一直不會(huì)用到,請(qǐng)刪除(除工具類)。
- 沒有執(zhí)行任何業(yè)務(wù)邏輯的方法,請(qǐng)刪除或給予注釋,刪除多余的資。源或文件,添加必要的注釋。
- 比較大的代碼塊需要給出注釋。
14.其它規(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ù)代碼。對(duì)于必要的工具類抽取也很重要,這在以后的項(xiàng)目中是可以重用的。
- 盡可能的使用局部變量
- 盡量減少對(duì)變量的重復(fù)計(jì)算。
- 盡量在合適的場(chǎng)合使用單例。使用單例可以減輕加載的負(fù)擔(dān),縮短加載的時(shí)間,提高加載效率。但并不是所有的地方都適用于單例,簡(jiǎn)單來說單例主要適用于以下三個(gè)方面:
- 控制資源的使用,通過線程同步來控制資源的并發(fā)訪問。
- 控制實(shí)例的產(chǎn)生,以達(dá)到節(jié)約資源的目的。
- 控制數(shù)據(jù)的共享,在不建立直接關(guān)聯(lián)的條件下,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信。
- 最后不要忘了檢測(cè)內(nèi)存泄漏??墒褂肐nstruments分析內(nèi)存。