關於手思3.0 代碼規範

關於手思3.0 代碼規範

工程之始可能須要的工具:

一、使用CocoaPods類庫管理工具。CocoaPods安裝和使用教程。git

二、下載安裝註釋插件VVDocumenter-Xcodegithub

3.使用代碼對齊的Xcode插件objective-c

XAlign:XALign 編程

ClangFormat ClangFormat-Xcode性能優化

4.快速進入沙盒目錄網絡

ZLGotoSandboxPlugin:查看沙盒的插件,當運行模擬器的時候,Shift + Common + w 直接查看當前模擬器下程序的沙盒。app

 

1、手思項目結構管理

#pragma mark -關於手思3.0對於文件的目錄要按以下結構建立:
-CategoryEx(全部類別類擴展放在裏面)
-HelpMacro(項目宏定義)
-Resources (全部圖片資源,聲音文件,其餘資源,相應資源放入相應組(Group)中)
-Utilities (工具集合,網絡請求,工具類,第三方庫等)
-MobileSiBuControllers(全部項目模塊代碼文件)
-CustomUI  (自定義UI控件)
-引用外部文件或者某個單獨的功能時,放在單獨的組中

 

關於手思3.0規範要點ide

1.命名規範(詳見下文)
2.全部控制器繼承BaseViewController  如:@interface HomeViewController : BaseViewController
3.ViewController,view,model應添加前綴SB (MVC) 4.使用DLOG(<#...#>)打印而不是NSLog(..),有大量打印信息時應把DLOG註釋掉 5.使用快捷鍵Command+shift+B,檢查代碼內存泄漏問題 6.全部保存數據的實體以Model結尾,如:UserModel 7.viewWillAppear,viewWillDisappear等寫在viewDidLoad上面,dealloc寫在.m文件最底行
8.不能出現警告,過期方法用新方法替代,沒有用到的變量刪掉或註釋掉

 

2、編碼規範

爲了提交團隊合做效率,在項目開發中,對於項目、類,變量等的命名,應該要易讀,易理解函數

一)、命名規範

關於命名的通常性的原則

1.最少字符,就是要儘可能的減小命名對象的長度,儘可能選擇字符少的名詞工具

2.名符其實,命名應該能直觀的描述被命名對象是什麼或者作什麼
3.避免歧義,儘可能不要採用多義詞,也不要使用命名組合以後產生多義的方式
4.上下文一致,好比謂詞的統一性,若是都是集合類,那麼使用Remove表示刪除操做,那麼全部上下文就應該都用這個Remove,而不要再用Delete
5.少用縮寫,除非是很常見的縮寫或者項目中定義好的縮寫,不然不要使用縮寫
6.優先使用全局常量而非宏,應使用static方式聲明常量;

主要點:控制器,自定義view以SB開頭
多單詞組合時,後面的單詞首字母大寫
如SBLoginViewCotroller,SBHomeViewCotroller
   SBPopView

 

鑑於目前項目使用的是MJExtensio進行字典模型自動轉換,因此屬性名與後臺保持一致便可

(1)類命名

一、變量首字母小寫,後面單詞首字母大寫,如userPassWord

二、使用可以反映類功能的名詞短語(使用英文翻譯)

3.命名時帶上類型,如xxxTv,xxxView,xxxStr等

四、文件名應包含描述繼承的類,如:文件名:BaseViewController   類:UIViewController
全部類名,接口名(Protocol)均以大寫字母開頭,多單詞組合時,後面的單詞首寫字母大寫。

如:@interface LoginViewCotroller : UIViewController
View--全部擴展自UIView的類以View結尾,如: GridView,StarView,OpenGLView,EmojiPageView。
ViewController-全部擴展自UIViewController的類以ViewController結尾,
Model--全部數據Model以Model結尾
 
如 HomePageViewControler, LoginViewController。
若是名稱太長則以VC結尾:如 AllPicturePreviewVC

四、自定義控件命名,以相應類名爲後綴命名。
對於UI相關的變量,命名時要後綴以特定的控件名,如UILabel的變量命名爲xxxLabel,xxxCell,其餘的如xxxButton,xxxTableView,xxxImageView等;

常見類型簡寫以下:
UIViewController:VC    UIImage:Img  UIImageView:Iv
UIView:View  UILabel:Lbl     UIButton:Btn
UINavigationBar:NBar   UIToolBar:TBar  UISearchBar:SBar
UITextField:TF  UITextView:Tv   NSArray:Array
NSMutableArray:MArray    NSDictionary:Dict  NSMutableDictionary:MDict
NSString:Str    NSMutableString:MStr     NSSet:Set       NSMutableSet:MSet

 

(2)特殊類命名

舉例:BaseClient、ImageStore


(3)分類(類別)命名

與類命名相同,此外需添加要擴展的類名和「+」
舉例:NSString+URLEncoding

(4)協議(委託)命名

與類命名相同,此外需添加「Delegate」後綴
舉例:UITableViewDelegate,MBProgressHUDDelegate

(5)方法及參數命名

方法:

首字母小寫,以後每一個單詞首字母都大寫
方法名使用動詞短語,能具體表達出該方法的功能

參數:

首字母小寫,以後每一個單詞首字母都大寫
具備足夠的說明性

舉例:

- (void)viewWillAppear:(BOOL)animated
- (void)setupPostValue:(int)value
- (void)adjustFontWithMaxSize:(CGSize)maxSize

 

參數要用描述該參數的標籤命名

- (void) sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;  //對
- (void) sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;               //錯


當參數過長時,每一個參數佔用一行,以冒號對齊。如:

-(void)saveUserInfo:(NSMutableDictionary *)dict
           userName:(NSString *)name
           passWord:(NSString *)pwd{
    ...
}

 
(6).點擊事件響應(下面幾種寫法均可以)

-(void)loginButtonClicked  (不推薦)
-(void)loginButtonClicked:(id)sender (推薦)
或
-(void)loginButtonAction
-(void)loginButtonAction:(UIButton *)sender
-(void)backBtnAction:(id)sender

手勢事件
- (void)handleTapGesture:(UITapGestureRecognizer *)tapGesture

 

getset 開頭的方法有特殊的意義,不要隨意定義。

  1. set 是屬性默認的設置方法,若是函數不是爲了設置類成員,則不要用 set 開頭,可用 setup 替代。
  2. get 和屬性方法無關,但在 Cocoa 中,其標準行爲是經過引用傳值,而不是直接返回結果的。欲獲取變量,直接以變量名爲名,如:userInfomation,而不是 getUserInfomation

 

屬性和變量申明問題

#pragma mark -變量問題
1.私有變量不該該寫在h裏面,h是對外公開的,更應該寫到m裏面
2.實例變量(成員變量),最好帶上前綴下劃線
3.變量須要有必定註釋
4.成員變量不該少於3個字符,採起見名知義原則

@interface ViewController ()
{
    //成員變量
    NSString  *_name;     //名字
    int       *_age;      //年齡
    NSString  *_passWord; //密碼
    NSArray   *_array1;
}

//屬性變量
@property (nonatomic,strong) NSArray *array2;
注意點:私有屬性,變量寫在.m文件中,.h文件中只寫對外公開的屬性變量

方法和變量的命令應該儘量作到自描述。
良好的風格:
UIButton *settingsButton;

不良的風格:
UIButton *setBut;

 

控件及數據的初始化

#pragma mark -初始化UI控件及數據源
使用initUI(或createSubview) 管理UI控件初始化,initDataSource初始化array,dict
//初始化全部UI相關
- (void)initUI
{
    [self initButton];
    [self initLabel];
}

//初始化數據源
-(void)initDataSource
{
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    NSMutableArray  *pesonArray=[[NSMutableArray  alloc]initWithCapacity:0];
}

- (void)initButton
{
    UIButton   *CSButton=[UIButton  buttonWithType:UIButtonTypeCustom];
    CSButton.frame=CGRectMake(100,100, 100, 80);
    [CSButton  addTarget:self action:nil forControlEvents:UIControlEventTouchDown];
    [self.view  addSubview:CSButton];
}

-(void)initLabel
{
    UILabel  *CSLabel=[[UILabel  alloc]initWithFrame:CGRectMake(10, 10, 100, 25)];
    CSLabel.textAlignment=NSTextAlignmentLeft;
    CSLabel.font=[UIFont  systemFontOfSize:14];
    CSLabel.text=@"標籤";
}

 

規範示例

#pragma mark ---規範示例 Coding Guidelines for Cocoa--
代碼越簡潔越明確越好,可是不能由於簡潔而致使語義不明確:
代碼 	評價
insertObject: atIndex: 	好
insert:at:              不明確,什麼被插入?at指什麼
removeObjectAtIndex: 	好
removeObject:           好,沒有以前討論的那些問題
remove:                 不明確,什麼被移除了

一般,不要縮寫對象的名稱。即便它們很長,也全拼:
代碼 	評價
destinationSelection 	好
destSel                 不明確
setBackgroundColor: 	好
setBkgdColor: 	不明確
--你可能認爲某些縮寫是衆所周知的。但凡是無絕對,尤爲是當開發者和你文化、語言背景不同,看這些縮寫就可能產生歧義。

 

良好的編程風格

多使用字面量語法,少用與之等價的方法(縮短源碼長度,更爲易讀)

    良好的風格:(字面量語法)
    NSArray      *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
    NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
    NSNumber *shouldUseLiterals = @YES;
    NSNumber *intNumber=@1;
    NSNumber *floatNumber=@2.5f;
    
    //取值
    NSString *name=names[1];
    NSString *product=productManagers[@"iPhone"];

 

    不良的風格:
    NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
    NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
    NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
    NSNumber *intNumber = [NSNumber numberWithInt:1];
    NSNumber *floatNumber = [NSNumber numberWithFloat:2.5f];\
    
    //取值
    NSString *name=[names objectAtIndex:1];
    NSString *product=[productManagers  objectForKey:@"iPhone"];

 

 


其餘

性能優化
1.用  DLOG(<#...#>)代替 NSLog(...)

2.必要時使用懶加載

3.重用

 

代碼片斷
熟練使用代碼片斷庫能夠提升編碼的速度。 Xcode4 中,打開一個項目並讓右側編輯區可視,而後點擊右側底部面板的第四個 {} 圖標,打開代碼片斷庫,你能夠將經常使用的代碼拖入其中。如下是一個最新的開源代碼片斷庫連接:
https://github.com/mattt/Xcode-Snippets

 

參考資料
[1] 《 NYTimes Objective-C Style Guide 》 https://github.com/NYTimes/objective-c-style-guide
[2]   https://github.com/VincentSit/NYTimes-Objective-C-Style-Guide-ZH (紐約時報 移動團隊 Objective-C 規範指南)
[3]   https://github.com/Chinamobo/iOS-Team-Norms (Chinamobo iOS 團隊規範)

薦 Objective-C編碼規範:26個方面解決iOS開發問題

相關文章
相關標籤/搜索