前一陣一直在做單元測試相關(guān)的內(nèi)容痹换,想來終于把自動化測試的一整套方案弄的差不多了宾符,于是在想還有沒有其他可以提升代碼質(zhì)量的事兒可做嚼沿。
記得去年在某度的時候,每次苦逼地搬完磚提交代碼的時候蒸绩,都會有一個代碼風(fēng)格校驗(yàn)的審查祭钉,如果沒有通過規(guī)則的話是提交不上去的骤菠,并且還會給出相應(yīng)的警告它改。比如下面代碼
@property(nonatomic,strong)MGJAwesomeCommand *awesomeCMD;
if(sth.){xxx;return;}
// Unrelated comment
void someFunction() {
doWork(); // Does something
doMoreWork(); // Does something else
}
那么對于追求More Free[和吳悠無關(guān)??] 的程序員這個有意義么?
其實(shí)我認(rèn)為是有意義的商乎,第一央拖、由于現(xiàn)在我們都是團(tuán)隊(duì)作戰(zhàn),如果團(tuán)隊(duì)內(nèi)部可以做到代碼風(fēng)格統(tǒng)一, 采用同一個代碼規(guī)范鹉戚,讓不同人寫出來的程序可讀性基本一致或者接近鲜戒,這樣對于新人來說, 做過一個模塊后,在接觸別人代碼抹凳,別的模塊代碼的時候遏餐,無論開發(fā)還是維護(hù)都會更快上手, 他的精力可以更多放在其他方面。同時, 好的代碼規(guī)范赢底,編程習(xí)慣也可以減少bug的產(chǎn)生失都,減少開發(fā)人員和測試人員的的時間成本柏蘑;第二 、工具化程度是衡量一個公司技術(shù)水準(zhǔn)很重要的一個考量.例如跑Unit Test,代碼風(fēng)格檢測,持續(xù)化集成都自動化的時候,這些東西都是可以極大的節(jié)省時間精力的東西粹庞。
那么如何來做到這些咳焚,使團(tuán)隊(duì)內(nèi)部代碼風(fēng)格趨于統(tǒng)一呢?有下面幾種方案信粮。
1.使用插件
比如ClangFormat-Xcode一款格式化代碼工具,能夠讓開發(fā)者使用 Clang 將代碼格式化為 LLVM趁啸、Google强缘、Chromium、Mozilla 或 WebKit 等格式不傅。操作類似下面這樣
2.定制模版
團(tuán)隊(duì)內(nèi)部可以設(shè)置類的代碼組織結(jié)構(gòu), 例如ViewController類可以按照以下順序來組織代碼結(jié)構(gòu):
#pragma mark - def
#pragma mark - override
#pragma mark - api
#pragma mark - model event
#pragma mark - view event
#pragma mark - private
#pragma mark - getter / setter
那么如何制定一個模版呢旅掂,從頭制作一個模板類有些坑。 我們采用簡單的辦法, 先拷貝一個模板類访娶, 然后修改成自己需要的樣子商虐。
這里推薦一個簡單的模板類的模板. 先下載下來, 再修改成你需要的樣子, 最后拷貝到Xcode的文件模板文件夾里
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/Folder
這樣就可以使用了。
(這里順便安利下之前寫的一個單元測試的模版通過Alcatraz搜索Kiwi-Template進(jìn)行安裝)
3.最佳推薦
以上兩種方法操作起來都稍微有點(diǎn)麻煩或是不是太方便崖疤,比如使用插件的話每次只能一個文件一個文件的去修改秘车,而且只能裝在Xcode上;使用定制模版的話每次需要從模版中創(chuàng)建劫哼,似乎有點(diǎn)別扭叮趴,并且也只能用在Xcode上。而且兩種方法也起不到通知程序員代碼風(fēng)格矯正的作用权烧,那么有沒有一種既簡單又不限制IDE而且還能通知程序員代碼風(fēng)格不符的方法呢眯亦?
這里羞羞地推薦一下自己寫的一個工具。具體的使用方法如下:
這里以最近正在寫的Command為例,首先打開工程目錄般码,例如我的目錄是下面這樣
然后打開終端執(zhí)行命令
curl -o format-check -ssl https://github.com/Bupterambition/objc-format-check/blob/master/format-check?raw=true
下載完畢后執(zhí)行
bash format-check
這樣就全部搞定了妻率。那么上面操作具體做了什么呢,其實(shí)很簡單板祝。
首先format-check會clone下來一個工具(這里參考了Space Commander)放在.format-check目錄宫静,然后執(zhí)行我們的工具。工具主要干了兩件事券时。
.clang-format
在當(dāng)前目錄下添加了.clang-format文件囊嘉,這個文件主要是做什么的呢?
其主要是設(shè)定了代碼的一些風(fēng)格.
Language: Cpp
AccessModifierOffset: -1
ConstructorInitializerIndentWidth: 4
SortIncludes: false
AlignAfterOpenBracket: true
AlignEscapedNewlinesLeft: true
AlignOperands: false
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: false
AlwaysBreakTemplateDeclarations: false
AlwaysBreakBeforeMultilineStrings: false
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
什么意思呢,比如將
AllowShortFunctionsOnASingleLine:false
那么這樣風(fēng)格的代碼
int f() { return 0; }
將是不允許的革为,
需要改成這樣的才能通過規(guī)則
int f() {
return 0;
}
那么具體效果是什么樣呢,如果你commit的代碼中有上述風(fēng)格的代碼扭粱,那么提交的時候?qū)@樣
根據(jù)提示你可以選擇一鍵修正所有要commit的腳本或是使用git commit --no-verify來忽略。
Git Hook
另一個是在/AwesomeCommand/.git/hook/中添加了一個pre-commit的腳本震檩,那么這個pre-commit是干什么的呢琢蛤,很簡單,這個東西就是在你每次要commit代碼之前蜓堕,git都會去找有沒有這個文件。如果有這個文件博其,那么就去文件里執(zhí)行一些特定的shell腳本套才,比如我們的pre-commit是去/.format-check/目錄下執(zhí)行format-objc-hook
腳本
如果您使用后覺得這個工具不好用的話可以在您的工程目錄下執(zhí)行下面命令進(jìn)行刪除
curl -ssl https://raw.githubusercontent.com/Bupterambition/objc-format-check/master/uninstall.sh|bash
至此,我們就完成了一個代碼風(fēng)格審查工具的部署慕淡,如果團(tuán)隊(duì)想要制定代碼風(fēng)格的話只需要修改和.git
同目錄下的.clang-format
文件就好背伴,具體的規(guī)則可以參考這個,每種樣式點(diǎn)擊一下會彈出相應(yīng)的實(shí)例代碼峰髓。[不過要記得.gitignore中需要把.clang-fotmat去掉,這樣只需要由一個人制定好了規(guī)則每個人pull一下就OK了]傻寂。同時只需要把剛剛download下來的format-check文件放到相應(yīng)的組件文件夾下執(zhí)行一邊就可以完成全部組件的代碼風(fēng)格部署。