代碼統計、分析工具

分享兩個工具json

關於第三方工具的安裝,推薦使用Homebrew,唐巧大神也在博客中推薦過。使用brew search xxxx來查看是否有對應的工具可使用Homebrew安裝。xcode

CLOC

CLOC是專門用於代碼統計的命令行工具,支持幾乎全部語言。bash

使用Homebrew安裝:brew install cloc,使用也很是簡單,命令行進入項目目錄,執行cloc ./便可,這樣會統計目錄下的全部代碼。若是不但願統計某些文件夾,能夠設置須要忽略的目錄,好比忽略Pods文件夾:cloc ./ --exclude-dir=Podsapp

統計結果:tool-1.png工具

oclit

oclit做爲一個靜態的代碼分析工具,功能很是強大,並且出自國人之手。ui

爲了一勞永逸,首先安裝xctoolbrew install xctool,這是Facebook提供的代替蘋果xcodebuild的工具。spa

安裝oclit:brew install Caskroom/cask/oclint,爲了可以在Xcode上直接顯示代碼分析的結果,還須要完成如下幾步.net

  1. 添加Aggregate,![image](/images/Tool/tool-2.png)![image](/images/Tool/tool-3.png)
  2. 爲剛纔建立的Aggregate添加運行腳本,注意:不要在選中Aggregate的狀態下點擊Editor菜單,否則Add Run Script Build Phase按鈕是灰色的 ![image](/images/Tool/tool-4.png)
  3. 添加腳本代碼,腳本代碼和官方文檔有些不一樣。
#import path
export PATH=${PATH}:/usr/local/bin
#import what we have in bash_profile
source ~/.bash_profile
#check for oclint
hash oclint &> /dev/null
if [ $? -eq 1 ]; then
echo >&2 "oclint not found, analyzing stopped"
exit 1
fi

hash xctool &> /dev/null
if [ $? -eq 1 ]; then
echo >&2 "xctool not found, analyzing stopped"
exit 1
fi

cd ${SRCROOT}
xctool -workspace MyProject.xcworkspace -scheme MyProject clean
xctool -workspace MyProject.xcworkspace -scheme MyProject -reporter json-compilation-database:compile_commands.json build
oclint-json-compilation-database \
-e Pods \
-- -rc=LONG_LINE=100 \
-rc=NCSS_METHOD=60 \
-rc=MINIMUM_CASES_IN_SWITCH=1 \
| sed 's/\(.*\.\m\{1,2\}:[0-9]*:[0-9]*:\)/\1 warning:/'

注意:上面代碼中的MyProject須要替換成你的工程名,若是你的工程不是用workspace來管理的,那麼其中這兩行代碼命令行

xctool -workspace MyProject.xcworkspace -scheme MyProject clean
xctool -workspace MyProject.xcworkspace -scheme MyProject -reporter json-compilation-database:compile_commands.json build

須要替換爲code

xctool -project MyProject.xcodeproj -scheme MyProject clean
xctool -project MyProject.xcodeproj -scheme MyProject -reporter json-compilation-database:compile_commands.json build

4.編譯剛纔建立的Aggregate,須要耐性等待結果,完成以後就能看到oclint給出的結果

錯誤排查

若build成功了可是沒有給出任何警告,極可能是出現了錯誤

  1. 檢查![image](/images/Tool/tool-5.png)
    是否有警告,以前就遇到team沒選擇對,致使沒有分析結果,或者像我同樣選擇None。
  2. 檢查是否存在~目錄下.bash_profile文件,由於此文件是隱藏文件,首先要讓Finder能顯示隱藏文件,命令行執行defaults write com.apple.finder AppleShowAllFiles TRUEkillall Finder,在Finder中Command+Shift+G前往文件夾,填寫~查看,若無此文件,命令行進入次目錄建立一個便可:cd ~touch .bash_profile。恢復隱藏文件的隱藏defaults write com.apple.finder AppleShowAllFiles FALSEkillall Finder

分析結果

oclit的代碼分析結果包括三種警告等級從高到底依次是:P1,P2,P3。

P3

  • 變量名長度:Long variable name P3 Variable name with 28 characters is longer than the threshold of 20 變量名超過20個字符,固然20的閥值是能夠設置,以後會介紹。
  • 反向邏輯:Inverted logic,好比
if (![response isKindOfClass:[NSError class]]) {
    //
}
else{
    //
}
  • 方法行數:Long method P3 Method with 179 lines exceeds limit of 100,方法下的代碼超過100行,不包括註釋。
  • 參數未使用:Unused method parameter P3 The parameter 'section' is unused.,不過這個警告在IOS開發中比較廣泛,能夠忽略
  • 嵌套深度Deep nested block P3 Block depth of 8 exceeds limit of 5,好比各類block的嵌套或者if/else的嵌套

固然還有不少其餘的狀況

P2

  • 圈複雜度(CCN):High cyclomatic complexity P2 Cyclomatic Complexity Number 31 exceeds limit of 10,意味着代碼的複雜程度
  • NPath 複雜度:/High npath complexity P2 NPath Complexity Number 384 exceeds limit of 200,具體不是很清楚

目前遇到的P2就是這些,P1的尚未遇到過。

回到剛纔的腳本代碼中

-- -rc=LONG_LINE=300 \
-rc=NCSS_METHOD=60 \

這是oclit給出的參數設置LONG_LINE表示每行代碼的最長字符數,NCSS_METHOD表示有效代碼行的最大行數。0.8dev版本的其餘參數包括

CYCLOMATIC_COMPLEXITY
Cyclomatic complexity of a method, default value is 10

LONG_CLASS
Number of lines for a C++ class or Objective-C interface, category, protocol, and implementation, default value is 1000

LONG_LINE
Number of characters for one line of code, default value is 100

LONG_METHOD
Number of lines for a method or function, default value is 50

MINIMUM_CASES_IN_SWITCH
Count of case statements in a switch statement, default value is 3

NPATH_COMPLEXITY
NPath complexity of a method, default value is 200

NCSS_METHOD
Number of non-commenting source statements of a method, default value is 30

NESTED_BLOCK_DEPTH
Depth of a block or compound statement, default value is 5

惋惜的是,並無Unused method parameter相關參數。

總之,oclint的分析仍是具備比較高的參考性,對於提升代碼的可讀性、可維護性仍是有必定幫助的。

相關文章
相關標籤/搜索