在一个代码开发团队里,有人写代码就是很臭.比如这篇英文博文里, 就讲了关于使用通用异常(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服务器上针对每一个开发者实时画一曲线.
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK