iOS 代碼規(guī)范

前言

代碼規(guī)范可以說(shuō)是老生常談的話(huà)題了, 也是程序員自我修養(yǎng)的一種體現(xiàn), 雖然一套好的代碼規(guī)范不能使程序運(yùn)行的更加流暢, 不能使程序直接的影響到程序的功能執(zhí)行,但是如果能再發(fā)開(kāi)之前就能明確定義一套代碼規(guī)范,并且嚴(yán)格的去執(zhí)行,肯定能非常有效的提高代碼閱讀性,高的閱讀性也使得后期開(kāi)發(fā),維護(hù)等事半功倍,上手難度降低,在新人加入進(jìn)行也能更快的融入團(tuán)隊(duì)回还。

我們團(tuán)隊(duì)的一套代碼規(guī)范,提供大家參考裆泳。

命名規(guī)范

我們盡可能遵守 Apple 的命名約定, 其推薦使用長(zhǎng)的,描述性強(qiáng)的方法和變量名,使其閱讀起來(lái)更加清晰易懂。不能隨意使用縮寫(xiě),導(dǎo)致其他人員閱讀代碼困難柠硕。 The coding guide for cocoa

駝峰命名

針對(duì)屬性,變量,方法等均采用小寫(xiě)字母開(kāi)頭的駝峰命名準(zhǔn)則工禾。

前綴

項(xiàng)目名稱(chēng),類(lèi)名,文件名都應(yīng)該保持一致的前綴名,根據(jù) Apple Guide 建議類(lèi)名前綴應(yīng)該使用 2 個(gè)英文以上最好,因?yàn)?Apple 寫(xiě)的框架都是直接使用 2 個(gè)英文字母開(kāi)頭, 使用 3 個(gè)字母 能有效防止類(lèi)名重復(fù)影響工程。

我們使用CC (caicai)前綴

方法命名

根據(jù) Cocoa 命名方法規(guī)則,我們應(yīng)該準(zhǔn)守這幾個(gè)點(diǎn)蝗柔。

  1. 使用小寫(xiě)字母開(kāi)頭,后面嵌套連接的字母使用大寫(xiě)開(kāi)頭闻葵。不過(guò)在寫(xiě)Category Method的時(shí)候, 也盡量加入CC前綴,但不強(qiáng)求癣丧;

  2. 對(duì)于采取動(dòng)作行為的方法,使用動(dòng)詞開(kāi)頭,但是不要直接使用 do或者does

  3. 每個(gè)方法參數(shù)前必須帶有相同或者能清晰表達(dá)其原意的關(guān)鍵字槽畔。

  4. 子類(lèi)化創(chuàng)建相對(duì)父類(lèi)更加詳細(xì)功能的方法時(shí)應(yīng)該把新增參數(shù)添加在原有方法的后面。

  5. 假如方法名過(guò)長(zhǎng)的時(shí)候可以采用每個(gè)參數(shù)獨(dú)占一行的規(guī)則,并保持每個(gè)參數(shù)分號(hào) : 對(duì)齊的方式排列坎缭。

  6. 實(shí)例方法和類(lèi)方法 (-/+) 符號(hào)后面應(yīng)該保持一個(gè)空格, 如:

- (void)starMonitoring;

命名屬性和實(shí)例變量

  1. 一般屬性一致采用 @property 進(jìn)行聲明, 特殊的數(shù)據(jù)類(lèi)型可以使用實(shí)例變量聲明竟痰。

  2. @property (nonatomic, copy) NSString *name;
    屬性關(guān)鍵字首個(gè)應(yīng)該是 原子性,到內(nèi)存管理關(guān)鍵詞签钩。如果需要寫(xiě)讀寫(xiě)關(guān)鍵字的話(huà), 其排在第二位.如: @property (nonatomic, readwrite, copy) NSString *name;

  3. 聲明實(shí)例變量時(shí)必須采用_下劃線(xiàn)作為變量名前綴掏呼。

  4. 添加 @property 相應(yīng)代碼段, 提高編碼速度。

命名頭文件

  1. 頭文件名必須采用一致的前綴開(kāi)頭, 加上其代表相關(guān)類(lèi)名代表的形容詞即可铅檩。盡量不要使用縮寫(xiě),寧愿名字稍微長(zhǎng)點(diǎn)兒,也要讓其有一目了然的效果憎夷。
  2. 聲明相關(guān)的類(lèi)擴(kuò)展和協(xié)議時(shí),必須將其聲明放在主類(lèi)文件夾里面,這樣閱讀起來(lái)相對(duì)方便。
  3. 如果有多個(gè)功能相似的類(lèi),可以考慮將其劃分為一個(gè)框架,使用 .h 文件進(jìn)行聲明管理昧旨。

命名 Category 方法

在寫(xiě)添加類(lèi)別方法時(shí), 必須采用前綴名_ 后連接對(duì)應(yīng)方法名的方式來(lái)進(jìn)行添加拾给。這樣就有效的避免,覆蓋掉系統(tǒng)原有或新增方法, 導(dǎo)致意想不到的問(wèn)題發(fā)生。
如: - (void)CC_methodName

統(tǒng)一的ViewController 模板

針對(duì)大多數(shù)沒(méi)有特別復(fù)雜邏輯的控制器實(shí)現(xiàn)文件, 我們制定了一套 @implementation 實(shí)現(xiàn)模板.
如下:

#import "CCHomeViewController.h"
    
@interface CCHomeViewController ()
    
@end
    
@implementation CCHomeViewController
    
#pragma mark - 1.Life Cycle
    
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    // 1.設(shè)置導(dǎo)航欄
    [self setupNavBar];
    // 2.設(shè)置view
    [self setupView];
    // 3.請(qǐng)求數(shù)據(jù)
    [self setupData];
    // 4.設(shè)置通知
    [self setupNotification];
}
    
#pragma mark - 2.Setting View and Style
    
- (void)setupNavBar {
     
}
    
- (void)setupView {
    
}
    
- (void)setupData {
   
}

#pragma mark - Action 相關(guān)事件方法
    
#pragma mark - lazy load
    
#pragma mark - UITableView 相關(guān) delegate datasource

#pragma mark - UICollectionView

#pragma mark - 其他一些自定義view代理

#pragma mark - Networking 網(wǎng)絡(luò)請(qǐng)求


可以到 Xcode 修改 ViewController 文件模板, 創(chuàng)建的時(shí)候即自動(dòng)生成模板樣式兔沃。

點(diǎn)語(yǔ)法

在訪問(wèn)屬性或者修改的過(guò)程中,應(yīng)該全程使用 . 語(yǔ)法來(lái)進(jìn)行蒋得。 能提高閱讀性同時(shí), 還能減少代碼長(zhǎng)度。但是又不能濫用乒疏。
推薦:

view.backgroundColor = [UIColor orangeColor];
[UIApplication sharedApplication].delegate;

反對(duì):

[view setBackgroundColor:[UIColor orangeColor]];
UIApplication.sharedApplication.delegate;

私有屬性

要求私有屬性必須在類(lèi) extension 下使用 @peoperty 聲明.
例如:

@interface CCHomeController ()
    
@property (nonatomic, strong) NSDate *lastRefreshTokenTime;
@property (nonatomic, assign) CCRefreshTokenStatus lastRefreshTokenStatus;

//編碼后的App版本號(hào)额衙,6位數(shù)字,如3.0.1為030001
@property (nonatomic, copy) NSString *encodeVersion;     
@end

常量

枚舉常量

要求使用 NS_ENUM() 函數(shù)而非 enum() 函數(shù)進(jìn)行聲明怕吴。 其具有更強(qiáng)的類(lèi)型檢查和代碼補(bǔ)全功能窍侧。
例如代表網(wǎng)絡(luò)狀態(tài)的常量, 網(wǎng)絡(luò)連接成功, 失敗,正在連接等。 我們通常采用枚舉的方式表示转绷。
例如:

typedef NS_ENUM(NSUInteger, MyEnum) {
    MyEnumValueA = 0,
    MyEnumValueB,
    MyEnumValueC,
};

其他類(lèi)型常量

多用類(lèi)型常量, 少用 #define 預(yù)處理指令.

  1. 不要使用#define預(yù)處理指令來(lái)定義常量,因?yàn)檫@樣的常量不包括類(lèi)型信息,編譯器只會(huì)在編譯前執(zhí)行查找和替換操作,即使有人重新定義了常量值,編譯器也不會(huì)發(fā)出警告,這樣會(huì)導(dǎo)致應(yīng)用程序中的常量值不一致.
  1. 在實(shí)現(xiàn)文件.m中使用static const來(lái)定義"只在編譯單元張可見(jiàn)的常量",由于此類(lèi)常量不在全局符號(hào)表中,所以無(wú)須為其名稱(chēng)加前綴.
  1. 在頭文件中使用extern來(lái)聲明全局常量,并在相關(guān)文件中定義其值,這種常量要出現(xiàn)在全局符號(hào)表中,所以其名稱(chēng)應(yīng)該加以區(qū)分,通常用與之相關(guān)的類(lèi)名做前綴.

參考連接


只在一個(gè)文件中使用,.m文件
static  const  NSTimeInterval kAnimalTime =0.3;

多個(gè)類(lèi)中使用伟件,全局
extern NSTimeInterval  constkAnimalTime; //In the header file


const  NSTimeInterval  kAnimalTime =0.3; //In the implementation file

@implementation 
    
static const NSTimeInterval KAnimationDuration = 0.3;
    
NSString *const CCLoginManagerDidLoginNotification = @"CCLoginManagerDidLoginNotification";
    
@interface
    
extern NSString *const CCLoginManagerDidLoginNotification;
    

反對(duì)

#define ANIMATION_DURATION 0.3;
#define CCLoginManagerDidLoginNotification @"CCLoginManagerDidLoginNotification";

使用類(lèi)型常量定義在效果一目了然, 在使用過(guò)程就能確定其常量類(lèi)型。
需要注意的是如果使用類(lèi)型常量定義,若常量局限于某編譯單元,也就是實(shí)現(xiàn)文件里面,則使用 ==K==作為前綴, 若常量在類(lèi)之外公開(kāi)出來(lái),則需要使用規(guī)定的類(lèi)名作為前綴议经。

文件引入方式

  1. 在 .h 文件中盡量使用 @class 聲明文件, 直到 .m 文件中真正需要的時(shí)候在使用 @improt 進(jìn)行引用, 能有效的防止其它類(lèi)引入此類(lèi)時(shí), 一并也引入了

  2. @improt 文件順序: 可以先寫(xiě)引入系統(tǒng)文件, 依次到 Public.h 最后才到我們自己編寫(xiě)的文件斧账。

  3. 檢查文件,避免引入到?jīng)]有使用到的文件,發(fā)現(xiàn)應(yīng)及時(shí)清除谴返。

多用字面量語(yǔ)法,少用與之等價(jià)的語(yǔ)法

我們?cè)趧?chuàng)建 NS 開(kāi)頭的數(shù)據(jù)類(lèi)型的時(shí)候, 一律采用字面量語(yǔ)法的形式進(jìn)行創(chuàng)建。
推薦:

NSArray *array = @[@"123", @"456"];
NSDictionary *dictionary = @[@"name": @"jersey", @"age": @"61"];
NSNumber *number = @18;
NSString *string = array[0];

反對(duì):

NSArray *array = [NSArray arrayWithObjects:@"123", @"456", nil];
[NSDictionary dictionaryWithObjectsAndKeys:@"jersey", @"name", @"61", @"age", nil];
NSNumber* number = [NSNumber numberWithInt: 18];
NSString *string = [array objectAtIndex: 1];

功能一致,但是使用字面量能令代碼更為整潔咧织。并且對(duì)于創(chuàng)建數(shù)組,字典使用字面量語(yǔ)法創(chuàng)建,當(dāng)誤傳 nil 時(shí)能更早的發(fā)現(xiàn)錯(cuò)誤亏镰。

間距

  • 不要使用 tab 鍵來(lái)進(jìn)行縮進(jìn), 應(yīng)該使用 4 個(gè)空格來(lái)代替。

  • 方法的大括號(hào)和其他的大括號(hào)(if/else/switch/while 等等)始終和聲明在同一行開(kāi)始拯爽,在新的一行結(jié)束索抓。

  • 方法之間應(yīng)該正好空一行,這有助于視覺(jué)清晰度和代碼組織性毯炮。在方法中的功能塊之間應(yīng)該使用空白分開(kāi)逼肯,但往往可能應(yīng)該創(chuàng)建一個(gè)新的方法。

推薦:

if (user.isHappy) {
    // Do something
}
else {
    // Do something else
}

條件語(yǔ)句

  • 條件判斷語(yǔ)句執(zhí)行主體不管是 if 里面還是 else 里面都必須要使用大括號(hào)包住, 即使代碼是一行的情況(Apple SSL/TLS gotofail)桃煎。 以及 for 循環(huán)篮幢。
  • if-else中,else不另起一行为迈,與if的反括號(hào)在同一行三椿,如上段代碼所示,注意else前后均有空格葫辐。
  • switch-case中搜锰,case后的代碼多余一行,則需要{}包裹耿战,建議所有case和default后的代碼塊均用{}包裹蛋叼。

涉及位置:@interface、方法實(shí)現(xiàn)剂陡、if-else狈涮、switch-case等。
優(yōu)點(diǎn): 減少代碼冗余行數(shù)鸭栖,代碼更加緊湊歌馍,結(jié)構(gòu)清晰。

推薦:

if(hasSillyName){
    LaughOutLoud()
} else {
    BlowTheHorn();
}

for(int i = 0 ; i < 10 ; i ++){
    BlowTheHorn();
}

反對(duì):

if(hasSillyName)
    LaughOutLoud();               //避免晕鹊。

for(int i = 0 ; i < 10 ; i ++)
    BlowTheHorn();                //避免松却。

避免尤達(dá)表達(dá)式

不要使用尤達(dá)表達(dá)式。尤達(dá)表達(dá)式是指捏题,拿一個(gè)常量去和變量比較而不是拿變量去和常量比較玻褪。它就像是在表達(dá) “藍(lán)色是不是天空的顏色” 或者 “高個(gè)是不是這個(gè)男人的屬性” 而不是 “天空是不是藍(lán)的” 或者 “這個(gè)男人是不是高個(gè)子的”

表達(dá)式條件應(yīng)該是先寫(xiě)變量在到常量的判斷過(guò)程
推薦:

if ([myValue isEqual:@42]) { 

    } 

不推薦:

if ([@42 isEqual:myValue]) {

    }

黃金大道

在使用條件語(yǔ)句編程時(shí),盡管遇到邏輯復(fù)雜的代碼,我們也應(yīng)該盡量避免其嵌套導(dǎo)致閱讀困難。
盡量使用 return 將不符合邏輯的直接忽略掉. 然后將要執(zhí)行的代碼放到判斷語(yǔ)句外面,減少嵌套公荧。

推薦:

- (void)someMethod {
    if (![someOther boolValue]) {
        return;
    }
    // Do something important
}

不推薦:

- (void)someMethod {
    if ([someOther boolValue]) {
        // Do something important
    }
}

復(fù)雜的表達(dá)式

當(dāng)出現(xiàn)復(fù)雜的 if 條件的時(shí)候, 可以把它們分別提取出來(lái)賦值到 BOOL 變量上, 讓邏輯更加清晰明了, 約定 2 個(gè)條件以上則需要將其單獨(dú)提取出來(lái)带射。
例如:

BOOL nameContainsSwift  = [sessionName containsString:@"Swift"];
BOOL isCurrentYear      = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession     = nameContainsSwift && isCurrentYear;

if (isSwiftSession) {
    // Do something very cool
}

三元運(yùn)算符

推薦使用三元運(yùn)算符進(jìn)行運(yùn)算. 它能使代碼更加簡(jiǎn)潔清晰。
推薦:

result = a > b ? x : y;

不推薦:

result = a > b ? x = c > d ? c : d : y;

當(dāng)三元運(yùn)算符的第二個(gè)參數(shù)(if 分支)返回和條件語(yǔ)句中已經(jīng)檢查的對(duì)象一樣的對(duì)象的時(shí)候循狰,下面的表達(dá)方式更靈巧:
推薦:

result = object ? : [self createObject];

不推薦:

result = object ? object : [self createObject];

錯(cuò)誤處理

很多系統(tǒng)方法通過(guò) error 返回指針的形式來(lái)表示錯(cuò)誤, 我們應(yīng)該針對(duì)其返回值判斷, 而非錯(cuò)誤變量窟社。
推薦:

NSError *error;
if (![self trySomethingWithError:&error]) {
    // 處理錯(cuò)誤
}

反對(duì):

NSError *error;
[self trySomethingWithError:&error];
if (error) {
    // 處理錯(cuò)誤
}

一些蘋(píng)果的 API 在成功的情況下會(huì)寫(xiě)一些垃圾值給錯(cuò)誤參數(shù)(如果非空)券勺,所以針對(duì)錯(cuò)誤變量可能會(huì)造成虛假結(jié)果(以及接下來(lái)的崩潰)。

NSNotification

約定在我們自己定義 NSNotification 的時(shí)候應(yīng)該把通知的名字定義為一個(gè)字符串常量, 就像把我們暴露給其他類(lèi)的字符串常量一樣灿里。使用 extern 關(guān)鍵字將其在 .h 文件聲明, 并且在 .m 文件對(duì)其定義关炼。

** 使用約定的 CC 作為前綴, 后跟具體通知名稱(chēng), 同時(shí)推薦使用 Did/Will 這樣的動(dòng)詞連接表示最好 **

推薦:

CCBadgeManager.h
extern NSString *const CCBadgeInfoDidUpdateNotification;

CCBadgeManager.m
NSString *const CCBadgeInfoDidUpdateNotification = @"CCBadgeInfoDidUpdateNotification";

Self 循環(huán)引用

我們?cè)趯?xiě) block 回調(diào)的時(shí)候, 特別是對(duì)于實(shí)例方法中調(diào)用, 很容易導(dǎo)致其循環(huán)引用。
我們?cè)陧?xiàng)目中已經(jīng)引入一組強(qiáng)弱引用的宏定義. @weakify(self) 匣吊、@strongify(self)
我們?cè)谟龅叫枰揎?Self 的時(shí)候直接使用這組宏來(lái)進(jìn)行修飾即可儒拂。。

例如

[JSDStartInfo getStartInfoSuccess:^{
   @weakify(self)
   [JSDCheckVersion checkWithPass:^{
       @strongify(self);
       [self reloadView];
   }];
}];

MVC模式

項(xiàng)目文件結(jié)構(gòu)主要以項(xiàng)目每個(gè)大模塊相應(yīng)下來(lái)進(jìn)行劃分色鸳。如 Main,Home,Invest,Discover,Wealth,More,Account社痛。 這幾個(gè)主要功能模塊進(jìn)行一一劃分、
我們想新建添加模塊的時(shí)候, 必須遵守這個(gè)原則去創(chuàng)建文件夾命雀。

code 一致采用 MVC 設(shè)計(jì)框架, 每個(gè)模塊功能點(diǎn)一般劃分成 Model,ViewController,View,DataEngine 去進(jìn)行實(shí)現(xiàn). 每個(gè)模塊各執(zhí)其職蒜哀。

  • Model: 保存相應(yīng)的數(shù)據(jù)結(jié)構(gòu), 邏輯復(fù)雜的情況下, 可以將數(shù)據(jù)操作邏輯從 ViewController 移動(dòng)到 Model 去進(jìn)行實(shí)現(xiàn), 防止 ViewController 代碼過(guò)于冗余. 不方便閱讀。
  • ViewController: 主要負(fù)責(zé)獲取 Model 層數(shù)據(jù), 進(jìn)而管理 View 層. 以及 User 一系列交互邏輯, 都由其負(fù)責(zé)響應(yīng)管理吏砂。 由于此層任務(wù)繁重, 邏輯復(fù)雜的時(shí)候容易造成代碼冗余的狀態(tài), 必要的時(shí)候我們也可以更換成 MVVC 模式去有效的避免 MVC 這個(gè)缺點(diǎn)撵儿。
  • View: 主要負(fù)責(zé)接收 Model 層數(shù)據(jù), 進(jìn)行頁(yè)面渲染 數(shù)據(jù)展示, 一般無(wú)特殊情況, 建議使用 Xib 去完成界面構(gòu)建, 除非是特殊頁(yè)面, 否則盡量統(tǒng)一使用 Xib 的形式 去完成每個(gè)界面。
  • DataEngine:

圖片管理

項(xiàng)目中的圖片一致存放到 Assets.xcassets 進(jìn)行管理. 從 V3.0 版本開(kāi)始是按模塊劃分進(jìn)行管理的, 但是到后面版本的更新迭代中, 出現(xiàn)了按版本順序進(jìn)行分組, 建議后面將圖片一致保存到原有的模塊分組中去,然后每次不需要使用的圖片,及時(shí)清除, 減少 App 體積狐血。

** 圖片名稱(chēng): 圖片名稱(chēng)可以以模塊作為首接 _ 連接其相應(yīng)功能點(diǎn)淀歇。這樣在以后查找起來(lái)也相對(duì)方便 **
如: icon_trade_result_fail 投資,結(jié)果頁(yè),狀態(tài)。 icon_discover_activity 發(fā)現(xiàn),活動(dòng)

Xcode 版本.

Xcode 版本更新迭代很快, 建議定時(shí)到 App Store 進(jìn)行更新到最新版氛雪。

三方庫(kù)管理工具

使用 Cocoapods 統(tǒng)一對(duì)第三庫(kù)進(jìn)行管理, 建議定時(shí)更新到最新版本, 保持版本一致房匆。
關(guān)于引用三方庫(kù)原則: github 上的項(xiàng)目必須要求 200 Star 以上

TODO

當(dāng)在開(kāi)發(fā)某個(gè)功能中遇到一些疑難雜癥的問(wèn)題, 但是又由于時(shí)間緊急, 來(lái)不及把細(xì)節(jié)做到完美, 如果在不影響當(dāng)前功能使用的情況下, 為了防止在后面的開(kāi)發(fā)中遺忘掉, 我們必須要在相應(yīng)的地方添加注釋 然后以 ==TODO:== 的格式, 接相關(guān)問(wèn)題描述添加進(jìn)來(lái), 待后面有空閑時(shí)間之后回來(lái)進(jìn)行修復(fù)完善。

CGRect 使用(忽略)

當(dāng)需要訪問(wèn) CGRect 中某個(gè)成員時(shí), 應(yīng)該使用 CGGeometry 函數(shù)來(lái)直接訪問(wèn)报亩。 而不是使用 .語(yǔ)法來(lái)獲取。

推薦:

CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);

反對(duì)

CGRect frame = self.view.frame;

CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;

使用 Route 管理控制器切換

為了方便業(yè)務(wù)擴(kuò)展,以及更好的管理 ViewController,對(duì) JLRoutes 三方庫(kù)進(jìn)行一層封裝來(lái)實(shí)現(xiàn),對(duì) 控制器的管理井氢。 所以項(xiàng)目中涉及到的 Push Presen Dismiss 等, 一致使用封裝的 JSDRouter 來(lái)完成弦追。
一行代碼即可完成控制器的跳轉(zhuǎn)
例如:

 [JSDRouter openURL:JSDRouteAccountCenter];
 [JSDRouter openURL:JSDRouteTradeExtract info:@{@"withdrawInfo":withdrawInfo}];
 [JSDRouter openURL:JSDROUTE_BACK];

防止重復(fù)造輪子

在著手開(kāi)發(fā)新需求之前,應(yīng)先觀察一下項(xiàng)目中,是否有已經(jīng)封裝好的相關(guān)功能類(lèi),如果已經(jīng)有了,最好在當(dāng)前類(lèi)上添加 Catogory 進(jìn)行擴(kuò)展。

項(xiàng)目中的基礎(chǔ)功能類(lèi), 以及對(duì)應(yīng)封裝的工具一致保存在 Class ---> Public花竞。

單例

要求必須使用線(xiàn)程安全的 GCD 函數(shù)進(jìn)行創(chuàng)建劲件。

例如:

+ (instancetype)shareInstance {
    static id sharedInstance = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

關(guān)于縮寫(xiě)

Objective-C 本身就是讓閱讀者讀起來(lái)就像在閱讀句子一樣的一門(mén)語(yǔ)言, 變量, 常量 特別是方法名相對(duì)其他語(yǔ)言來(lái)說(shuō)會(huì)相對(duì)長(zhǎng)一點(diǎn),主要用意就是為了表達(dá)更加清晰明了, 盡量不讓閱讀的人產(chǎn)生歧義,并且基本能達(dá)到光看代碼名字就知道其用意。
所以我們也應(yīng)該嚴(yán)格遵守語(yǔ)言的設(shè)計(jì)風(fēng)格, 和大家保持一致, 能有效的提高我們協(xié)同開(kāi)發(fā)的效率同時(shí),也能使我們能編寫(xiě)出更容易讓大家接受的代碼约急。

主要參考文檔: Cocoa guide 可接受的縮略語(yǔ)和首字母縮略詞

不推薦大家使用縮寫(xiě),寧愿命名長(zhǎng)一點(diǎn),也一定要保證語(yǔ)義表達(dá)清晰的原則零远。

主要參考資料:

Coding Guidelines for Cocoa
Google Objective-C Style Guide
紐約時(shí)報(bào) 移動(dòng)團(tuán)隊(duì) Objective-C 規(guī)范指南
禪與 Objective-C 編程藝術(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厌蔽,隨后出現(xiàn)的幾起案子牵辣,更是在濱河造成了極大的恐慌,老刑警劉巖奴饮,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纬向,死亡現(xiàn)場(chǎng)離奇詭異择浊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)逾条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)琢岩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人师脂,你說(shuō)我怎么就攤上這事担孔。” “怎么了吃警?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵攒磨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汤徽,道長(zhǎng)娩缰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任谒府,我火速辦了婚禮拼坎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘完疫。我一直安慰自己泰鸡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布壳鹤。 她就那樣靜靜地躺著盛龄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芳誓。 梳的紋絲不亂的頭發(fā)上余舶,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音锹淌,去河邊找鬼匿值。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赂摆,可吹牛的內(nèi)容都是我干的挟憔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烟号,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绊谭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起汪拥,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤达传,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趟大,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹤树,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逊朽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罕伯。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叽讳,靈堂內(nèi)的尸體忽然破棺而出追他,到底是詐尸還是另有隱情,我是刑警寧澤岛蚤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布邑狸,位于F島的核電站,受9級(jí)特大地震影響涤妒,放射性物質(zhì)發(fā)生泄漏单雾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一她紫、第九天 我趴在偏房一處隱蔽的房頂上張望硅堆。 院中可真熱鬧,春花似錦贿讹、人聲如沸渐逃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茄菊。三九已至,卻和暖如春赊堪,著一層夾襖步出監(jiān)牢的瞬間面殖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工雹食, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜普,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓群叶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钝荡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子街立,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開(kāi)發(fā)人員編寫(xiě)出簡(jiǎn)潔、可維護(hù)埠通、可靠赎离、可 測(cè)試、高效...
    iOS行者閱讀 4,446評(píng)論 21 35
  • 概要 Objective-C是一門(mén)面向?qū)ο蟮膭?dòng)態(tài)編程語(yǔ)言端辱,主要用于編寫(xiě)iOS和Mac應(yīng)用程序梁剔。關(guān)于Objectiv...
    DreamMmMmM閱讀 1,157評(píng)論 0 7
  • iOS代碼規(guī)范 一虽画、前言 本規(guī)范基于Google Objective-C Style Guide和百度Object...
    CoderHw閱讀 896評(píng)論 0 7
  • 開(kāi)課以來(lái),不知不覺(jué)已經(jīng)一周過(guò)去啦荣病!不得不好好的吐槽家里的網(wǎng)速码撰,每逢直播必卡! 這周的作業(yè)分別是雪人个盆,房...
    吖雜閱讀 253評(píng)論 2 1
  • 小說(shuō)介紹與目錄 上一章: 10章 一杯董酒定新人颊亮,忙前忙后全瞎忙 01 連著兩日雨天柴梆,今天終于露出太陽(yáng),欣格上班時(shí)...
    戴麗雯閱讀 337評(píng)論 0 5