在一个代码开发团队里,有人写代码就是很臭.比如这篇英文博文里, 就讲了关于使用通用异常(GENERAL EXCEPTION)处理代码的问题.
通用异常简单来说就是
1 2 3 4 5 | try { } catch (Exception anything) { // 隐藏错误 } |
try { } catch (Exception anything) { // 隐藏错误 }
不管代码出不出错都加一个保险的处理方式,反正有错误抛出,都会被捕获.改BUG用这种方法实在是效率高.
下面的POWERSHELL脚本能统计出每个开发人员写的通用异常的数目.这样研发经理就可以时不是观察和保证代码的质量.遇到喜欢用TRY-CATCH的开发人员, 需要及时沟通和培训.
svn blame, svn praise和 svn annotate 都是一样作用的, 其实就是看当时的心情.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # 工程目录 $SolutionDir = "E:\Trunk4.0\Project" # 获得有效的源文件列表 $files = Get-ChildItem "$SolutionDir" -filter "*.cs" -Recurse | Where-Object {!(($_.FullName -like "*esigner*.cs") -or ($_.FullName -like "*AssemblyInfo*.cs"))} # 总的次数 $cnt = 0 # 通用异常的正则表达式 $pattern = "catch(\s*\(\s*Exception[\w\s]*\)|\s*$\s*\{|\s*\{)" # 用于保存每个开发人员的次数 $dict = @{} for ($i = 0; $i -lt $files.Count; $i++) { # 检查每一文件 $filename = $files[$i].FullName if (Test-Path $filename) { $content = (Get-Content $filename -Raw) # 读文件 if ($content.Length -gt 0) { $matches = [regex]::matches($content, $pattern) if ($matches.Count -gt 0) { # 如果有犯规 Write-Host "Processing $filename" $cnt = $cnt + $matches.Count $output = &svn blame -g -x -b "$filename" | grep -n -P "$pattern" ForEach ($obj in $output) { $author = $obj.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries) if ($author.Length -gt 3) { # 有效数据 if ($dict.ContainsKey($author[2])) { # 更新统计结果 $cur = $dict[$author[2]] $dict[$author[2]] = $cur + 1 } else { $dict[$author[2]] = 1 } } } } } } } $dict.GetEnumerator() | Sort-Object Value -descending Write-Host "Total = $cnt" |
# 工程目录 $SolutionDir = "E:\Trunk4.0\Project" # 获得有效的源文件列表 $files = Get-ChildItem "$SolutionDir" -filter "*.cs" -Recurse | Where-Object {!(($_.FullName -like "*esigner*.cs") -or ($_.FullName -like "*AssemblyInfo*.cs"))} # 总的次数 $cnt = 0 # 通用异常的正则表达式 $pattern = "catch(\s*\(\s*Exception[\w\s]*\)|\s*$\s*\{|\s*\{)" # 用于保存每个开发人员的次数 $dict = @{} for ($i = 0; $i -lt $files.Count; $i++) { # 检查每一文件 $filename = $files[$i].FullName if (Test-Path $filename) { $content = (Get-Content $filename -Raw) # 读文件 if ($content.Length -gt 0) { $matches = [regex]::matches($content, $pattern) if ($matches.Count -gt 0) { # 如果有犯规 Write-Host "Processing $filename" $cnt = $cnt + $matches.Count $output = &svn blame -g -x -b "$filename" | grep -n -P "$pattern" ForEach ($obj in $output) { $author = $obj.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries) if ($author.Length -gt 3) { # 有效数据 if ($dict.ContainsKey($author[2])) { # 更新统计结果 $cur = $dict[$author[2]] $dict[$author[2]] = $cur + 1 } else { $dict[$author[2]] = 1 } } } } } } } $dict.GetEnumerator() | Sort-Object Value -descending Write-Host "Total = $cnt"
svn blame 命令最耗时,因为需要连接代码服务器去统计每一行最后修改的人员.脚本执行完之后大概是这样的输出结果:
Name Value ---- ----- Jack 184 Tom 180 Total = 364
我们使用 [regex]::matches($content, $pattern) 先检查每个源文件是否有这样的错误.然后再使用 svn blame 去获得每一行具体是谁改的并且用 GREP来过滤. 随着错误减少,检查的时间就会相应的快许多.
参数 -g 则会考虑分支的合并.参数-x -b 则会排除 无意义的修改(比如空格)
最后通过 $dict.GetEnumerator() | Sort-Object Value -descending 根据次数来倒序. 下一步则是在 CI服务器上针对每一个开发者实时画一曲线.
GD Star Rating
loading...
本文一共 423 个汉字, 你数一下对不对.loading...
上一篇: 剑桥SHELL加油站旁边的意大利餐馆 Little Venice
下一篇: Teamviewer 支持多屏幕远程连接
扫描二维码,分享本文到微信朋友圈
这不是应该在 code review 的时候就避免的么?
我们还没有 CODE REVIEW 🙁
不断的回首自己,一直觉得自己写的代码很臭.
每个人都会有这个过程.
感觉这个过程会持续很久,就没有满意过似的.