每個大公司都有自己的代碼規范,大如Google、GitHub、Apple都可以找到他們的相關規范文檔,很多小公司或者團隊也有自己的規范。規范對于開發者來說,不只是代碼的樣式更好看,更有逼格,其實最大的意義在于增加代碼的可維護性:代碼樣式的統一、類中代碼的順序、命名規范等多方面的統一會讓團隊每個開發者在修復問題或者維護老代碼時,更加快速的定位到指定代碼,理解原有代碼邏輯,減少維護成本。
本文不會講這些規范或者我們的規范,主要講一下如何更便捷地使自己的代碼符合規范中格式(格式是指空行、空格、縮進、對齊等方面的規定)。
當開發者自己的代碼習慣與代碼規范存在較大沖突時,想要符合代碼規范,一般的進化路線是這樣的:
- 最笨的一定是寫完代碼,逐個去調整代碼使其符合規范;
2. 使用code snippt
code snippt 就是內置在xcode中的代碼樣式模板庫,xcode中已經有一些內置默認的樣式,通常我們需要自定義一些符合我們規范的模板(例如if else 、init、getter方法)。制作模板很簡單,只需要將需要制作模板的代碼卸載xcode編輯器中,然后選中這段代碼,按住command然后拖動到右側紅色方框中:
關于code snippt其實只要記住<#abc#>即可,其中abc就是要替換的地方顯示的內容, <#abc#>是使用的命令,這里需要注意不能先輸入<##>再插入abc。
具體可以參考:http://www.cocoachina.com/industry/20130604/6336.html
對于一個團隊來說,可以針對團隊代碼規范,建議一些基本的code snippts, 然后分發給團隊每個成員(創建好后,在路徑~/Library/Developer/Xcode/UserData/CodeSnippets中),這樣大家共享。
3. 工具化:
總有一些代碼時我們無法通過code snippt覆蓋的,這就需要我們使用一些工具,快速修改這些不符合規范的的代碼,這時我們可以通過Alcatraz安裝插件來解決(apple為了安全性,xcode8默認無法使用插件,使用參見請參考:https://www.ishuo.cn/doc/cbwrgnqf.html )。
1). ClangFomat-Xcode插件,使用方式參考 http://www.lxweimin.com/p/80cfa7430467
2). Uncrustify插件,使用方式參考 https://github.com/benoitsan/BBUncrustifyPlugin-Xcode
Uncrustify包含了ClangFomat-Xcode插件的功能,可以對選定的代碼或者文件操作,格式化為標準樣式,推薦使用。
安裝成功后,重啟xcode,可以通過下圖方式打開Uncrustify:
打開Uncrustify的perferences后如下圖, 按照圖示即可在指定路徑建立一個Uncrustify.cfg文件,Uncrustify.cfg文件中是對代碼格式的一些定義,我們需要根據自己的規范修改其中的定義,保存后。 對指定文件或者代碼使用“format active file”或“format selected lines”即可格式化代碼。(可以看到上圖中的還有view log 按鈕,可以查看在格式化過程中是否正常,出現問題在哪里)
例如我們的代碼規范如果是這樣的:
#pragma mark 待審批label
- (UILabel *)toApproveLbl
{
if (_toApproveLbl == nil)
{
_toApproveLbl = [UILabel new];
_toApproveLbl.font = FONT_SYSTEM(Adapter_Zoom(14));
_toApproveLbl.textAlignment = NSTextAlignmentCenter;
_toApproveLbl.textColor = cor3;
}
return _toApproveLbl;
}
那么就需要對默認生成文件中的配置進行一定修改,需要修改以下項目:
# Add or remove newline between 'if' and '{'
nl_if_brace = add # ignore/add/remove/force
其他配置項可以結合官方說明及文檔中注釋, 還有其他人總結的中文說明文檔,理解配置文件中各個參數的意義,從而配置符合自己團隊的規范。
注意上圖中的“perform format on save of a source code file”選項前面的勾需要謹慎勾選,這個選項將在你保存源文件或者關閉xcode(自動保存源文件)時自動格式化所有有改動的文件,相當于每個有所修改的文件進行整個文件的格式化。 因為目前.cfg中的配置項并不一定是每個項目最終規范的形式,我們可能暫時無法找到合適的配置項來解決規范要求的每個格式,如果選中了的話,可能導致源文件中某些代碼樣式被轉為錯誤的,不符合規范的樣式。
例如:默認配置項對于實例方法和block語法的縮進和換行的配置,格式化代碼后是這樣的:
[self.approveContentV
mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_topImgV.bottom).offset(5);
make.left.equalTo(_topImgV.left);
make.width.mas_equalTo(ValidWidth);
make.height.mas_equalTo(_contentH + Adapter_Height(26));
}];
而我們實際想要的是這樣的(目前仍未找到合適配置項解決此問題):
[self.approveContentV mas_makeConstraints:^(MASConstraintMaker *make)
{
make.top.equalTo(_topImgV.bottom).offset(5);
make.left.equalTo(_topImgV.left);
make.width.mas_equalTo(ValidWidth);
make.height.mas_equalTo(_contentH + Adapter_Height(26));
}];
所以建議在沒有完全摸清這個配置文件各個項目的情況下,暫時不要勾選。 暫時采用對那些可以確定格式化正確的代碼片段使用它格式化。
p.s. 如果大家看到一些開源代碼的規范樣式符合自己的團隊或者接近的話,可以在其基礎上修改.cfg文件,附錄中列了幾個使用了Uncrustify的開源代碼,可以在其代碼文件中找到.cfg文件。
4. 自動格式化
最便利的方式必然是開發者隨意寫代碼,在保存或者提交代碼時,IDE或者Git服務器或者Jenkins自動根據規范調整樣式,每個開發者更新最新代碼時,就是規范后的樣式。這其實也依賴于已經完全確定配置項目可以正確格式化代碼,使其符合代碼規范。
為提供便捷性,建議將常用操作設置快捷鍵。我的xcode設置了對選定代碼行格式化的快捷鍵 cmd shift e 。設置成功后,對應操作按鈕邊上會出現快捷鍵內容。
附錄:
使用Uncrustify的知名開源代碼:
apps-ios-wikipedia
CocoaLumberjack
inbox-ios
wonderful-objective-c-style-guide
一些可參考的代碼規范:
GitHub
raywenderlich
Realm
Spotify
The New York Times