博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代码统计、分析工具
阅读量:6927 次
发布时间:2019-06-27

本文共 3764 字,大约阅读时间需要 12 分钟。

分享两个工具

  • 代码统计:
  • 代码分析:

关于第三方工具的安装,推荐使用,唐巧大神也在中推荐过。使用brew search xxxx来查看是否有对应的工具可以使用Homebrew安装。

CLOC

CLOC是专门用于代码统计的命令行工具,支持几乎所有语言。

使用Homebrew安装:brew install cloc,使用也非常简单,命令行进入项目目录,执行cloc ./即可,这样会统计目录下的所有代码。如果不希望统计某些文件夹,可以设置需要忽略的目录,比如忽略Pods文件夹:cloc ./ --exclude-dir=Pods

统计结果:tool-1.png

oclit

oclit作为一个静态的代码分析工具,功能非常强大,而且出自国人之手。

为了一劳永逸,首先安装xctool:brew install xctool,这是Facebook提供的代替苹果xcodebuild的工具。

安装oclit:brew install Caskroom/cask/oclint,为了能够在Xcode上直接显示代码分析的结果,还需要完成以下几步

  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 pathexport PATH=${PATH}:/usr/local/bin#import what we have in bash_profilesource ~/.bash_profile#check for oclinthash oclint &> /dev/nullif [ $? -eq 1 ]; thenecho >&2 "oclint not found, analyzing stopped"exit 1fihash xctool &> /dev/nullif [ $? -eq 1 ]; thenecho >&2 "xctool not found, analyzing stopped"exit 1ficd ${SRCROOT}xctool -workspace MyProject.xcworkspace -scheme MyProject cleanxctool -workspace MyProject.xcworkspace -scheme MyProject -reporter json-compilation-database:compile_commands.json buildoclint-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 cleanxctool -workspace MyProject.xcworkspace -scheme MyProject -reporter json-compilation-database:compile_commands.json build

需要替换为

xctool -project MyProject.xcodeproj -scheme MyProject cleanxctool -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_COMPLEXITYCyclomatic complexity of a method, default value is 10LONG_CLASSNumber of lines for a C++ class or Objective-C interface, category, protocol, and implementation, default value is 1000LONG_LINENumber of characters for one line of code, default value is 100LONG_METHODNumber of lines for a method or function, default value is 50MINIMUM_CASES_IN_SWITCHCount of case statements in a switch statement, default value is 3NPATH_COMPLEXITYNPath complexity of a method, default value is 200NCSS_METHODNumber of non-commenting source statements of a method, default value is 30NESTED_BLOCK_DEPTHDepth of a block or compound statement, default value is 5

可惜的是,并没有Unused method parameter相关参数。

总之,oclint的分析还是具有比较高的参考性,对于提高代码的可读性、可维护性还是有一定帮助的。

转载地址:http://ksujl.baihongyu.com/

你可能感兴趣的文章
2d网络游戏的延迟补偿(Lag compensation with networked 2D games)
查看>>
shell 之for [转]
查看>>
[Windows核心编程]32bit程序在64bit操作系统下处理重定向细节[1]
查看>>
git 常用命令
查看>>
代码里面执行bat
查看>>
当苹果因为UIDevice、udid、uniqueIdentifier而把我们的应用拒之门外invalid binary的时候,呕心沥血解决方法啊...
查看>>
CSS实现DIV层背景透明而文字不透明
查看>>
培养iOS开发新人的一个思路
查看>>
PI专利网站
查看>>
mongoDB oplog的说明及应用
查看>>
超酷JQuery动画分页按钮,鼠标悬停滑动展开
查看>>
如何修改博客园插入代码的默认代码大小? - 心得小记
查看>>
strcpy和memcpy的区别
查看>>
ios 一个正则表达式测试(只可输入中文、字母和数字)
查看>>
VS调试-添加命令行参数
查看>>
Mac和Windows中常见中文字体的英文名称
查看>>
[ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
查看>>
使用PHP创建一个REST API(Create a REST API with PHP)
查看>>
牛人一个
查看>>
SharePoint 2013 实现多级审批工作流
查看>>