提升自己逼格的編程之美之代碼規範



頭文件#import的順序(商量)

寫法模板

#import <系統庫>

#import <第三方庫>

#import “其他類”

儘量按照先系統類 第三方類 自己寫的類順序導入 中間不能有空格

建議的寫法

1.png   

不建議的寫法

2.png

@Class的寫法

寫法模板:@class class1, class2;

建議的寫法

3.png   

不建議的寫法

4.png   

@Interface的寫法

寫法模板

@interface 類名 : 父類 <協議1, 2="">

@interface和類名中間一個空格

類名後緊跟:之後空格加上父類協議之間用,空格分割

建議的寫法

5.png

不建議的寫法

6.png   

@protocol的寫法

寫法的模板

@protocol 協議的名稱 <協議1, 2="">

@potocol和協議的名稱有空格 協議的名稱和其他協議有空格 其他協議之間有空格

建議的寫法

7.png   

不建議的寫法

8.png   

@property的寫法

@property (關鍵詞, 關鍵詞) 類 *變量名稱;

關鍵詞用,空格分割 類前後空格

正確寫法

9.png   

不建議的寫法

10.png

@property關鍵詞的使用

對象 strong

基本變量assign

XIB控件 代理 weak

字符串和block使用 copy

對於一些弱引用對象使用weak

對於需要賦值內存對象 copy

h頭文件方法寫法

寫法模板

@interface

方法的參數在一排顯示

方法之間保留一行

第一個方法和@interface保留空行

最後一個方法和@end保留空行

建議的寫法

11.png   

錯誤寫法

12.png   

聲明const的字符串

開頭用k標識

推薦k+模板名字首字母大寫+作用名稱 防止和其他的重複

比如:CartViewModel類需要聲明更新購物車列表的通知

kCVMNoticationUpdateCartList

如果是聲明Cell的重用字符

k+cell的名稱+identifier

比如: GBHomeItemTableViewCell的標識符

kGBHomeItemTableViewCellIdentifier

Const聲明字符串位置

如果是需要聲明在h裏面讓其他的類用到需要在h聲明m實現

聲明

13.png   

實現

14.png

對於如果導入是UIKit類就使用UIKIT_EXTERN 如果是Founction使用關鍵詞FOUNDATION_EXTERN

如果只在本類使用只用寫實現 不用寫聲明。

方法儘量控制最多五十行

一個方法內部最多五十行 如果超過就精簡代碼 就分開方法寫

方便之後進行熱修復 代碼重構

註釋一定要寫

自己管理的類一定註釋屬性用途 方法的用途 參數的說明

屬性如果設置默認值 一定註明默認值是什麼

如果方法內部存在邏輯判斷 方法跳轉 一定註釋判斷用法 方法跳轉用法

除了初始化操作

其他聲明變量 賦值 判斷 應該註明註釋用途

註釋的寫法

Class類註釋

111.png   

property屬性的註釋

112.png   

方法的註釋

如果有返回值 請加上return

113.png   

局部變量和全局變量註釋

114.png   

Block註釋

115.png   

NSUM的註釋

116.png

不允許外接修改的屬性要設置readonly

大家平時設置屬性默認是可讀可寫 但是這樣容易對於別人造成誤解 以爲可以賦值

對於只能獲取的屬性 一定寫readonly

正確的寫法

117.png   

錯誤的寫法

118.png   

頭文件引入的其他類 要使用@class

頭文件引入的類使用@class聲明不實用#import引入

可以防止互相引入 編譯失敗 不容易查找的BUG

造成的缺點

m文件還要#import 其他類調用這個類屬性也要#import對應的類

綜合來說寧願自己多操作 也要防止這種循環引入的BUG的出現

建議的寫法

119.png   

不建議寫法

120.png   

pragma mark的使用

對於屬性的不同作用 比如設置顏色的 設置字體的 設置其他樣式 的可以進行分組

對於方法的作用分類 比如添加功能 刪除功能的

對於其他的代理方法 Get Set方法 Init初始化方法

建議的寫法

1111.png   

BOOL類型屬性的聲明

屬性set不要帶is get要帶is

建議寫法

1112.png   

不建議寫法

1113.png   

方法命名的規範

不能用init set 開頭進行命名

如果不是寫初始化方法不要用init進行開頭

如果不是屬性的set方法不要用set作爲方法的前綴

{}的寫法

建議的寫法

1122.png   

不建議的寫法

1121.png   

計算符號兩邊要有空格

比如 + - * / =等運算符左右有空格

建議的寫法

21.png   

不建議的寫法

22.png   

控件命名的規範

對於命名一定不要簡寫 那篇很長的單詞 但是一些單詞就是簡寫的除外 比如WTO RMB

UILabel結尾加上Label;

UIImageView結尾記上ImageView

等等讓其他的編程人員看名字就知道變量的用法 和屬於什麼控件

建議的寫法

23.png    

不建議的寫法

24.png   

if判斷裏面的條件要提取出來

對於if裏面很多的判斷條件 要提取出來 方便之後進行斷點測試

建議的寫法

31.png   

不建議的寫法

32.png   

enum的定義

對於歸屬所在的enum 要寫在對應的類

我們現在就全部enum放在一個文件 覺得和蘋果的編碼規範違背 並且分離代碼有點麻煩

使用NS_ENUM進行定義

建議的寫法

1.png   

不建議的寫法

2.png   

對於初始化一定要使用類對應的初始化方法

比如UIView的對應初始化方法爲

3.png   

UIViewController對應的爲

4.png   

防止初始化用init new等沒經過系統進行設置一些默認的屬性 造成bug

對於聲明NSString const要對適應對應的模塊

比如系統的 NSNotificationName

5.png   

建議的寫法

6.png   

不建議的寫法

7.png   

對於#define宏命名

單詞全部的大寫 單詞之間用_分割

建議的寫法

8.png   

不建議的寫法

9.png   

對象調用方法要留空格

建議的寫法

11.png   

不建議的寫法

12.png   

對於只在m內部聲明的const 需要添加static

這個我覺得可以不加 但是無法看到蘋果的實現 所以不知道蘋果的規範怎麼寫的

建議寫法

13.png   

不建議的寫法

14.png   

對於局部的變量儘量的初始化

局部的變量要初始化 屬性有默認的值 所以我們不必須對於屬性進行初始化

我之前遇到的一個BUG就是int類型沒有初始化給我默認Nan造成崩潰

建議的寫法

15.png   

不建議的寫法

16.png   

對於一些對象判斷是否賦值可以不進行初始化 但是對於一定不會爲nil要進行初始化

變量名的規範

一定要使用駝峯的命名

建議的寫法

21.png   

不建議的寫法

22.png

對於屬性的賦值

不要直接調用set方法

建議的寫法

000.png   

不建議的寫法

000.png   

對於NS_OPTIONS類型多個值用|連接不能用+

建議的寫法

01.png   

不建議的寫法

02.png   

block的命名規範

之前研究過很多的第三方的命名 對於蘋果官方的沒找到

有CallBack結尾 Complete結尾 Block結尾 還有CompletionHandle結尾的

我看到蘋果很多的結尾都是用CompletionHandle結尾

大部分命名是Block我們按照Block命名

建議的寫法

03.png   

錯誤寫法

04.png   

使用NSUserDefaults要先創建

因爲我們用到NSUserDefaults無非是保存和讀取 事先的創建一個對象 可以精簡代碼

當執行方法很多 用變量替換

建議的寫法

05.png   

不建議的寫法

06.png   

儘量少在initialize load方法做一些初始化的事情

影響程序的啓動

建議的做法

07.png   

不建議的做法

08.png   

通知的移除

通知在dealloc要使用移除對象監聽的方法

建議的寫法

001.png   

不建議的寫法

002.png   

判斷不要放在一行

判斷放在一行也是可以的 但是我們還是要求正規一些 畢竟註明Apple的goto BUG

建議的寫法

003.png   

不建議的寫法

004.png

對於我們取值和存值的key要定義一下

定義一下key 方便我們使用 並且方便之後改名字

建議的寫法

005.png   

不建議的寫法

006.png

方法的參數連接不能有空格

建議的寫法

aa.png   

不建議的寫法

aaa.png   

對於block的循環引用使用weakify 和strongify

建議的寫法

b.png   

不建議的寫法

bb.png   

佈局和設置約束的方法選擇

可以實現GBInitViewProtocol協議 執行對應的方法

建議的寫法

c.png

有利於其他人很方便查找當前界面佈局和添加試圖的位置

屬性要儘量使用懶加載

我們一個界面有很多控件 利用懶加載可以美化代碼

所有的懶加載放在Getter的mark的下面

建議的寫法

a.png   

推薦的界面框架

所有界面的控件元素獨立到另外的UIView

UIViewController只負責跳轉界面

新建UIView負責界面的顯示

VIewModel負責數據的請求和解析

APi負責請求

model負責後臺數據解析

other 負責樣式和其他處理

多使用字面量

字符串 @””

a1.png   

NSNumber @()

a2.png   

字典 @{}

a3.png   

數組 @[]

a4.png   

字典和數組的取值和存值

多用類型常量 少用#define

建議的寫法

b1.png   

不建議的寫法

b2.png   

對於一些狀態 選項的使用枚舉

儘量少用根據數字判斷狀態少用字符串 數字判斷狀態

建議的寫法

b3.png   

不建議的寫法

b4.png   

多使用類族

比如我們需要創建一個類 有多個樣式

b5.png   

ZHCustomRedView

b6.png   

ZHCustomWhiteView

b7.png

類名加上前綴避免衝突

因爲團隊的合作 可能會出現大家想到一樣的名字或者添加第三方庫引入和第三方庫名字一樣

儘量加上前綴。

如果只針對工程就使用工程的縮寫

比如自己個人的第三方庫就加上自己名字或者暱稱的縮寫

建議的寫法

c1.png   

不建議的寫法

c2.png   

提供全能的初始化方法

對於初始化參數有很多 但是不是一定全部使用的可以提供多個初始化方法

建議的寫法

c3.png   

不建議的寫法

c4.png   

實現Description方便調試

這個不推薦自己手寫 可以使用Xcode插件自動生成 屬性越多會加重手寫代碼的長度

儘可能使用不可變的對象

對於OC存在很多可變的對象 比如NSMutableString NSMutableArray NSMutableDictionary等等

對於一些不允許改變的直接使用不可變對象

可以節省對象開支 還可以防止別人修改數據造成bug

建議的寫法

c5.png   

不建議的寫法

c6.png   

如果建議的使用Block和代理

我覺得代理可以用在寫控件需要數據源賦值 和一些事件回調的時候使用

我查閱了蘋果的block基本上都是執行一個時間 需要異步回調就使用block

如果沒有主動執行動作 而是監聽異步的回調 建議用代理

建議的寫法

c7.png   

不建議的寫法

c8.png   

記得Dealloc記得釋放

記得在Dealloc釋放註冊的通知和KVO的監聽

不釋放容易造成內存釋放崩潰

養成習慣把按照方法功能到分類裏面

對於一些有按照功能類型的方法劃分在一個分類裏面 分類和之前類寫在同一個文件

建議的寫法

d1.png   

不建議的寫法

d2.png   

爲第三方類添加分類添加前綴

比如爲系統UIView添加分類Add的添加前綴

建議的寫法

d3.png   

不建議的寫法

d4.png   

儘量少在分類裏面使用屬性

假設我們分類有一個只讀的字段 我們可以不使用屬性 可以使用方法

建議的寫法

d5.png   

不建議的寫法

d6.png   

非要在自己類的分類添加讀寫的屬性 可以用語法糖

可以利用主類的私有變量

建議的寫法

d7.png

不建議的寫法

d8.png   

對於給第三方和系統的類非要添加屬性 可以使用runtime。

對於一些自己不確定的可以使用try catch

對於不知道後臺返回什麼類型的 可以使用try catch

建議的寫法

e1.png   

因爲OC是運行時語法 可能array不一定是NSArray類型的

不建議的寫法

e2.png   

如果後臺返回list爲字段 這段代碼就崩潰了 可以使用try catch也可以用Model庫 或者自己添加判斷

使用dispatch_once來創建單例

建議的寫法

e3.png   

不建議的寫法

e4.png   

便利的寫法

如果只需要便利數組和字典的寫法用for in

建議的寫法

e5.png   

不建議的寫法

e6.png   

需要便利字典和數組的內容 並且需要索引用enumerator

建議的寫法

e7.png   

不建議的寫法

e8.png

如果想進行緩存使用NSCache不要使用NSDictionary進行緩存

建議的寫法

f1.png   

不建議的寫法

f2.png   

尤達表達式

推薦:

f3.png   

不推薦:

f4.png   

nil 和 BOOL 檢查

推薦

f5.png   

不建議的寫法

f6.png   

黃金大道

建議的寫法

121.png   

不建議的寫法

122.png   

複雜的表達式

建議的寫法

123.png   

不建議的寫法

124.png   

三元運算符

推薦:

221.png

不推薦:

222.png   

當三元運算符的第二個參數(if 分支)返回和條件語句中已經檢查的對象一樣的對象的時候,下面的表達方式更靈巧:

推薦:

223.png   

不推薦:

224.png   

錯誤處理

有些方法通通過參數返回 error 的引用,使用這樣的方法時應當檢查方法的返回值,而非 error 的引用。

推薦:

32.png   

此外,一些蘋果的 API 在成功的情況下會對 error 參數(如果它非 NULL)寫入垃圾值(garbage values),所以如果檢查 error 的值可能導致錯誤 (甚至崩潰)。

數組和字典最好指定元素的類型

建議的寫法

33.png   

不建議的寫法

34.png   

數組和字典的元素垂直寫

建議的寫法

35.png   

不建議寫法

36.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章