一、命名規(guī)范? ??
?1.類的命名? ?
? ? ? 1.1 大駝峰式命名:每個(gè)單詞的首字母都采用大寫字母 ? ? ??
? ? ? ? ? ?例子:MLHomePageViewController? ??
? ? ?1.2 前后綴要求? ? ? ? ??
? ? ? ? ? 自定義控件 使用公司 ML 前綴 窘疮, ? ? ??
? ? ? ? ? ViewController: 使用ViewController做后綴? ? ? ??
? ? ? ? ? 例子: MLHomeViewController? ? ? ? ? ? ? ? ??
? ? ? ? ? View: 使用View做后綴? ? ? ??
? ? ? ? ? 例子:MLAlertView? ? ? ?
? ? ? ? ? UITableCell:使用Cell做后綴? ? ? ??
? ? ? ? ?例子:MLNewsCell? ? ? ??
? ? ? ? ? Protocol: 使用Delegate或者DataSource作為后綴? ? ? ??
? ? ? ? ?例子:UITableViewDelegate? ? ? ??
? ? ? ? ? UI控件依次類推 ScrollView袋哼,TextField, TextView?
? 2.property變量? ??
? ? ? 2.1 小駝峰式命名:第一個(gè)單詞以小寫字母開始,后面的單詞的首字母全部大寫
? ? ?例子:@property (strong, nonatomic) NSString *userName;? ??
? ? ? 2.2 控件命名:統(tǒng)一以全稱后綴命名的方式:? ??
? ? ? 例如? ? ? ? Button loginButton? ? ? ? Label userNameLabel? ? ? ? TextField passwordTF? ? ? ? TextView commentTextView ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TableView historyTableView? ? ? ? ScrollView scrollView? ??
? 3.宏命名? ??
? ? ? 3.1 全部大寫闸衫,單詞間用 _ 分隔涛贯。 ??
? ? ? 例子:#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"? ??
? ? ? 3.2 宏的位置要在import下面蔚出,@interface 的上面? ??
? ?4.枚舉? ??
? ? ? 4.1 Enum類型的命名與類的命名規(guī)則一致? ?
? ? ? 4.2 Enum中枚舉內(nèi)容的命名需要以該Enum類型名稱開頭? ? ??
? ? ? 4.3 使用 typedef NS_ENUM 定義 與swift兼容 ?
? ? ? ? ? 例子:? ? ? ?
? ? ? ? ? ? typedef NS_ENUM (NSInteger, AFNetworkReachabilityStatus) {? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ?AFNetworkReachabilityStatusUnknown ? ? ? ? ? ? ? ? ? ?= -1,? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? AFNetworkReachabilityStatusNotReachable ? ? ? ? ? ? = 0,? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? AFNetworkReachabilityStatusReachableViaWWAN ?= 1,? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?AFNetworkReachabilityStatusReachableViaWiFi ? ? ? = 2? ? ? ?
? ? ? ? ? ? ? ? ? ? ?};? ?
? ? 5.Class中方法命名? ? ? ?
? ? ? ? 使用小駝峰規(guī)則弟翘,用動(dòng)詞命名虫腋,第一個(gè)單詞的首字母小寫,其他單詞的首字母大寫稀余。以下為幾種常用方法的命名:? ? ? ?
? ? ? ?5.1 彈出提示框或者提示信息悦冀,命名以 show 開頭,
? ? ? ? ?例:showHUD? ? ??
? ? ? ?5.2 按鈕點(diǎn)擊方法睛琳,命名以 控件名+Clicked 結(jié)尾盒蟆,
? ? ? ? ?例:loginBtnClicked? ? ?
? ? ? ?5.3 設(shè)置方法,命名以 set 開頭师骗,
? ? ? ? 例:setData? ? ?
? ? ? ? 5.4 具有返回值的獲取方法历等,命名以 get開頭,
? ? ? ? 例:getData? ? ?
? ? ? ?5.5 通過(guò)異步加載數(shù)據(jù)的方法丧凤,命名以 load(本地?cái)?shù)據(jù))/query/request(請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)) 開頭募闲,
? ? ? ? ? ?例:loadData? ? ? ?
? ? ? ?5.6 布爾型的判斷方法,命名以 is 或 has愿待,或具有邏輯意義的單詞如 equals浩螺,
? ? ? ? ? ?例:isEmpty? ? ?
? ? ? ?5.7 保存數(shù)據(jù)相關(guān)的方法,命名以 save 開頭仍侥,
? ? ? ? ? ?例:saveGoodsData,? ? ?
? ? ? ?5.8 對(duì)數(shù)據(jù)重組的方法要出,命名以 reset 開頭,
? ? ? ? ? ?例:resetOrderData,
? ? ? ?5.9 清除數(shù)據(jù)相關(guān)的方法农渊,命名以 clear/clean/remove 開頭患蹂,
? ? ? ? ? ? 例:clearUserData,? ??
? ? 6. Delegate方法命名? ? ?
? ? ? ? 6.1 類的實(shí)例必須為回調(diào)方法的參數(shù)之一, 如? ? ? ? ?
? ? ? ? ? - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section? ? ?
? ? ? ? 6.2 回調(diào)方法的參數(shù)只有類自己的情況,方法名要符合實(shí)際含義, 如:? ? ? ? ??
? ? ? ? ?- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView? ? ??
? ? ? ?6.3 以類的名字開頭(回調(diào)方法存在兩個(gè)以上參數(shù)的情況)以表明此方法是屬于哪個(gè)類的, 如:? ? ? ? ?
? ? ? ? ?- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath? ? ??
? ? ? ?6.4 使用did和will通知Delegate已經(jīng)發(fā)生的變化或?qū)⒁l(fā)生的變化, 如:? ? ? ? ?
? ? ? ? ?- (NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;? ? ? ? ?
? ? ? ? ?- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;? ??
? ? 7. 切圖命名:? ? ? ? ? ?
? ? ? ??切圖命名:
? ? ? ?頁(yè)面_模塊_類別_功能_狀態(tài).png
? ? ? ? 如:home_tab_btn_search_normal.png)
? ? ? ? ? ? ? ?首頁(yè)_標(biāo)簽欄_按鈕_搜索_默認(rèn)狀態(tài).png
? ? ? ?常用英文名:
? ? ? ?模塊:
標(biāo)簽欄 nav ? ? ? ? ? ? ? 菜單欄 tab?? ? ? ? ? ? ?背景 bg? ? ? ? ? ? ? ? 左側(cè)導(dǎo)航 leftbar ? ? ? ? ? ? 啟動(dòng)頁(yè)面 lanuch?? ? ? ? ? ? ?工具欄 tool?? ? ? ? ? ? ?主頁(yè)面 home?? ? ? ? ? ? ?列表 list
個(gè)人資料porfile ?? ? ??登錄 login ? ? ? ? ? ? ? 注冊(cè) regsiter ?? ? ??標(biāo)題 title
類別:
標(biāo)志 logo ? ? ? ? ? ? ? ? 圖標(biāo)ic ? ? ? ? ? ? ? ? ? ? 按鈕 btn ? ? ? ? ? ? ? 進(jìn)度條 progress bar ?? ? ??默認(rèn)圖片 def ? ? ? ? ? ? ? ? ? 分隔圖片 div? ? ? ? ? ? 圖片 img? ? ? ? ? ? ? ? ? ??評(píng)論 comment
廣告 ad ? ? ? ? ? ? ? ? ? 提示信息 msg ? ? ? ? ?彈出 pop ? ? ? ? ? ? ?輸入框 input ? ? ? ? ? ? ? ? ? ?菜單 menu ? ? ? ? ? ? ? ? ? ? ?復(fù)選框 chb ? ??? ? ? ? ?單選框rb? ? ? ? ? ? ? ? ? ? 下拉 cbb
功能:
搜索 search ? ? ? ? ? ?收藏 collect ? ? ? ? ? ? ?時(shí)間 time ? ? ? ? ? ? ? 音頻 audio ? ? ? ? ? ? ? ? ? ? ?視頻 viedio ? ? ? ? ? ? ? ? ? ?用戶 user ? ? ? ? ? ? ? ?排名 ranked ? ? ? ? ? ? ? ?關(guān)閉 close
返回 back ? ? ? ? ? ? ? ?編輯 eidt ? ? ? ? ? ? ? ? 刪除 delete ? ? ? ? ? ?鏈接 link ? ? ? ? ? ? ? ? ? ? ? ? 下載 download ? ? ? ? ? ? ? 注釋 note ? ? ? ? ? ? ? ?刷新 refresh ? ? ? ? ? ? ? ?取消 cancel
設(shè)置 setting
? ? ? ? 狀態(tài):
默認(rèn) normal(nor)?? ? ? ? ? ? ?按下 pressed?? ? ? ? ? ? ?選中 selected(sel)?? ? ? ? ? ? ?不可點(diǎn)擊 disabled(dis)
? ? 8. 關(guān)于UI布局? ? ?
? ? ? ?8.1 使用Interface Builder進(jìn)行界面布局? ? ??
? ? ? ?8.2 Xib文件的命名與其對(duì)應(yīng)的.h文件保持相同? ? ??
? ? ? ?8.3 Xib或SB文件中控件的必須進(jìn)行重命名砸紊,不允許出現(xiàn)Label ImageView等Xcode缺省命名传于。?
二、類中代碼規(guī)范? ??
? ? ?1. import規(guī)范? ? ??
? ? ? ?當(dāng)一個(gè)Controller或者一個(gè)Class中需要用到不同的類和Define時(shí), 我們應(yīng)當(dāng)把#import劃分.? ? ??
? ? ? ?劃分原則: 哪個(gè)Controller或者Class是本Controller或者Class的次級(jí)就放在一起, 公共Controller或Class就與之前的空一行, 緊跟著下面.? ? ??
? ? ?分隔 用 #pragma mark-
? ? ? ?// controller
? ? ? ?#import "TripDetailViewController.h"
? ? ? ?#import "TripEvaluationViewController.h"
? ? ? ?#import "EvaluateViewController.h"
? ? ? ?#pragma mark -
? ? ? ?// view
? ? ? ?#import "HCSStarRatingView.h"
? ? ? ?#import "UndealTripHeader.h"
? ? ? ?#import "FinishedTripHeader.h"
? ? ? ?#import "GPMapAnnotationView.h"
? ? ? #import "GPMapDriverAnnotationView.h"
? ? ? // model&tool
? ? ? ?#import "GPCancelTripRequest.h"
? ? ? ?#import "GPGetTripDetailRequest.h"
? ? ? ?#import "GPWebServiceManager.h"
? ? ? ?#import "GPEvaluateTripRequest.h"
? ? ? (建議)需要經(jīng)常使用的醉顽,新建Importer.h 文件沼溜,導(dǎo)入到.pch頭文件中
? ? ? ? #import <UIKit/UIKit.h>
? ? ? ? #import<Foundation/Foundation>
? ? ? ?//百度地圖
? ? ? ?//引入base相關(guān)所有的頭文件
? ? ? ? #import//引入地圖功能所有的頭文件
? ? ? ? #import//引入檢索功能所有的頭文件
? ? ? ? #import//引入定位功能所有的頭文件?
? ? ? ? #import//引入計(jì)算工具所有的頭文件
? ? ? ? #import//只引入所需的單個(gè)頭文件
? ? ? ? #import//猿題庫(kù)網(wǎng)絡(luò)請(qǐng)求框架
? ? ? ? #import "YTKNetworkAgent.h"
? ? ? ? #import "HLShadowAndCornerImageView.h"
? ? ? 2. property 聲明
? ? ? ? ?2.1 聲明位置
? ? ? ? ? 在.m文件中最上方,定義空的category進(jìn)行聲明游添,根據(jù)內(nèi)存管理關(guān)鍵字來(lái)劃分模塊, 且以 "*" 分類對(duì)齊(基礎(chǔ)數(shù)據(jù)類型除外)系草,nonatomic 修飾放在最后∷衾裕 不可在實(shí)現(xiàn)類中用大括號(hào)的方式申明私有變量找都,避免這些變量在方法中使用時(shí),與方法的傳入?yún)?shù)理解作用域理解混淆 例子:
#import "CodeStandardViewController.h"
// 在這個(gè)category(類目)中定義變量和方法
@interface CodeStandardViewController ()
@property (weak, nonatomic) IBOutlet UILabel? ? ? ? ? ? *priceLabel;
@property (weak, nonatomic) IBOutlet UIImageView? ? ? ? *otherInfoImageView;
@property (weak, nonatomic) IBOutlet UILabel? ? ? ? ? ? *tripPassengerCountLabel;
@property (strong, nonatomic) AspRetrievePasswordView? *retrievePassword;
@property (strong, nonatomic) UITextField? ? ? ? ? ? ? *foucsTextField;
@property (copy, nonatomic) NSString? ? ? ? ? ? ? ? ? ? *brandName;
@property (copy, nonatomic) NSString? ? ? ? ? ? ? ? ? ? *brandType;
@property (assign, nonatomic) NSInteger? ? ? ? ? ? ? ? zeroCount;
@property (assign, nonatomic) NSInteger? ? ? ? ? ? ? ? verificationCode;
@end
@implementation CodeStandardViewController
/* 錯(cuò)誤 聲明
{
NSDictionary *vcConfigDict;
BOOL isInfoViewShown;
}
/*
@end
? ? ? ? ?2.2 使用
? ? ? ? ?在.m中 以 self. 的方式使用廊酣,不使用下劃線的形式
? ? 3.方法規(guī)范
? ? ? ? 3.1在聲明函數(shù)時(shí)"-"與"(type)"必須空一格, 且后面的參數(shù)類型與"*"也必須空一格.多個(gè)參數(shù)冒號(hào)對(duì)齊能耻。
/**
<#Description#>
@param result <#result description#>
@param mapView <#mapView description#>
@param error <#error description#>
*/
+ (void)showRoute:(BMKDrivingRouteResult *)result
on:(BMKMapView *)mapView
errorCode:(BMKSearchErrorCode)error;
? ? ? ?3.2方法與方法之間相隔一行的間距,在函數(shù)體內(nèi), 如果第一句調(diào)用的是系統(tǒng)方法, 可不換行, 如果是自定義的方法(包括if-else和for in), 必須換行.
+ (void)showRoute:(BMKDrivingRouteResult *)result
on:(BMKMapView *)mapView
errorCode:(BMKSearchErrorCode)error {
NSArray* overlaysArray = [NSArray arrayWithArray:mapView.overlays];
[mapView removeOverlays:overlaysArray];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
? ?4. if-else規(guī)范
? ? ? 4.1 使用結(jié)構(gòu)清晰的排版方式, if-else語(yǔ)句與方法名空行, return語(yǔ)句可以不用空行.
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// code body
}
return self;
}
? ? ?4.2 if-else內(nèi)部也必須跟著空行, 在else之后的"}"可不空行.
- (void)viewDidLoad {
[super viewDidLoad];
if (age < 0) {
// Code Body
}
}
? ? ? ?4.3 if-else超過(guò)四層的時(shí)候, 就要考慮重構(gòu), 多層的if-else結(jié)構(gòu)很難維護(hù)。 合理使用ifelse, 當(dāng)某個(gè)場(chǎng)景只需滿足一個(gè)條件才能進(jìn)入if-else時(shí), 應(yīng)該把if-else抽成一個(gè)模塊嚎京。
- (void)viewDidLoad {
[super viewDidLoad];
if (age < 0) {
NSLog(@"這是錯(cuò)誤的年齡");
return;
}
NSLog(@"現(xiàn)在時(shí)%ld歲", (long)age):
}
? ? ? ?4.4 if-else必須加"{}"符號(hào), 哪怕是一行判斷.
? ?5. 運(yùn)算符規(guī)范
? ? ? 5.1 一元運(yùn)算符和參數(shù)之間不放置空格, 比如"!"非運(yùn)算符, "&"安位與, "|"安位或.
BOOL isOpen? = true;
BOOL isClose = !isOpen;
? ? ?5.2 二元運(yùn)算符和參數(shù)之間要有空格, 如賦值號(hào)"="左右各留一個(gè)空格.
self.myString = @"mySring";
? ? ?5.3 三目運(yùn)算符和參數(shù)之間必須得有空格, 如判斷符"?"結(jié)果符":"
NSInteger userAge = @"Man" ? 18 : 19;
? ?6. NSDictionary
? ? ? 當(dāng)NSDictionary里的Key : Value過(guò)多時(shí), 應(yīng)拆分為多行顯示, 并以 ":" 對(duì)齊
NSDictionary *people = @{@"xiaoming" : 18,
@"xiaohong" : 19,
@"xiaowang" : 20};
? ?7. NSArray(視情況)
? ? ?當(dāng)NSArray里的元素過(guò)多時(shí), 應(yīng)拆分為多行顯示, 并以第一個(gè)元素對(duì)齊.
? ? ?NSArray *nameArray = @[@"小明",@"小紅",@"小王"];
? ?8. #pragma mark -
? ? 對(duì)于相同性質(zhì)的屬性遥倦、方法使用 mark 分組
#pragma mark - lift cycle
#pragma mark - IBAction
? ?9.TODO 規(guī)范
? ? ?對(duì)于多人開發(fā)的項(xiàng)目准脂,//? TODO后 必須加上作者
? 10. 枚舉
? ? ?項(xiàng)目中不允許直接使用數(shù)字代替
typedef NS_ENUM(NSInteger, TripStatus) {
TripStatusNotPublish = 0,
// 已發(fā)布
TRIP_STATUS_PUBLISHED = 10,
// 重派單
TRIP_STATUS_REDISPACH = 15,
// 已派單
TRIP_STATUS_DISPACHED = 20,
// 已接單
TRIP_STATUS_RECEIVED = 30,
// 正在接
TRIP_STATUS_PICKING = 33,
// 已接到
TRIP_STATUS_PICKEDUP = 35,
// 已出發(fā)
TRIP_STATUS_STARTED = 40,
// 已完成
TRIP_STATUS_DONE = 50,
// 已取消
TRIP_STATUS_CANCELED = -1
};
三雀鹃、注釋規(guī)范
? ? ?最好的代碼是不需要注釋的 盡量通過(guò)合理的命名
? ? ?良好的代碼把含義表達(dá)清楚 在必要的地方添加注釋
? ? ?注釋需要與代碼同步更新
? ? 如果做不到命名盡量的見名知意的話舷暮,就可以適當(dāng)?shù)奶砑右恍┳⑨尰蛘適ark.
? 1. 文件頭
? ? ? 與公司的要求統(tǒng)一
? ? ?1.1 必須出現(xiàn) 文件創(chuàng)建者, 創(chuàng)建日期帕涌,創(chuàng)建者聯(lián)系方式
//
//? UserCenterViewController.h
//? GuaGuaPassenger
//
//? Created by Wang Hai Long (wanghailong096@sunfit.cn) on 10/10/2016.
//? Copyright ? 2016 Sunfit. All rights reserved.
? ?2. 屬性注釋
? ? ? 例子:
? ? /** 學(xué)生 */
? ? @property (nonatomic, strong) Student *student;
? ?3. 方法聲明注釋:
? ? ? 以下情況必須加注釋
? ? ?3.1 接口中定義的所有方法
? ? ?3.2 抽象類中自定義的抽象方法
? ? ?3.3 抽象父類的自定義公用方法
? ? ?3.4 工具類的公用方法
? ? option+command+? 自動(dòng)生成注釋格式
/**
* @brief 登錄驗(yàn)證
*
* @param personId 用戶名
* @param password 密碼
* @param complete 執(zhí)行完畢的block
*
* @return
*/
+ (void)loginWithPersonId:(NSString *)personId
password:(NSString *)password
complete:void (^)(CheckLogon *result))complete;