關(guān)于iOS代碼風(fēng)格管理的兩三事

代碼風(fēng)格的兩三事兒

前一陣一直在做單元測試相關(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)格部署。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末携兵,一起剝皮案震驚了整個濱河市疾掰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徐紧,老刑警劉巖静檬,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并级,居然都是意外死亡拂檩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門嘲碧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來广恢,“玉大人,你說我怎么就攤上這事呀潭《っ裕” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵钠署,是天一觀的道長糠聪。 經(jīng)常有香客問我,道長谐鼎,這世上最難降的妖魔是什么舰蟆? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮狸棍,結(jié)果婚禮上身害,老公的妹妹穿的比我還像新娘。我一直安慰自己草戈,他們只是感情好塌鸯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唐片,像睡著了一般丙猬。 火紅的嫁衣襯著肌膚如雪涨颜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天茧球,我揣著相機(jī)與錄音庭瑰,去河邊找鬼。 笑死抢埋,一個胖子當(dāng)著我的面吹牛弹灭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揪垄,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼穷吮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了福侈?” 一聲冷哼從身側(cè)響起酒来,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤卢未,失蹤者是張志新(化名)和其女友劉穎肪凛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辽社,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伟墙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了滴铅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳葵。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汉匙,靈堂內(nèi)的尸體忽然破棺而出拱烁,到底是詐尸還是另有隱情,我是刑警寧澤噩翠,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布戏自,位于F島的核電站,受9級特大地震影響伤锚,放射性物質(zhì)發(fā)生泄漏擅笔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一屯援、第九天 我趴在偏房一處隱蔽的房頂上張望猛们。 院中可真熱鬧,春花似錦狞洋、人聲如沸弯淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耳胎。三九已至惯吕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怕午,已是汗流浹背废登。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郁惜,地道東北人堡距。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像兆蕉,于是被迫代替她去往敵國和親羽戒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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