博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sharing A Powerful Tool For Calculate Code Lines
阅读量:4700 次
发布时间:2019-06-09

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

最近正好需要统计下某项目代码行数,然后就找代码行数统计工具。以前找到过一个,但是只有在VS2010下有用,VS2012和VS2013下的统计就不好使了。

接着搜索了一下代码行数统计绿色工具免费版,看到花花绿绿的浮动窗口和卧虎藏龙的下载链接,感觉非常令人生厌,而且,有些国产软件下载总是让你一不小心就中毒,所以最后还是放弃了下载。

当然,你知道,这点简单小功能,对于已经习惯自己搬砖搞定一切的码农,实在没有必要再费时间搜来搜去,而且那首歌唱得好,“Let it go,let it go...The code doesn‘t bother me anyway.”,所谓求人不如求己是也。

抽空自己写了这个代码行数分析winform工具,目前测试通过支持的语言有C#、Java、SQL、JavaScript和Python,共享出来,希望对你有帮助。

软件界面:

一、程序简单分析

统计分析代码行数,需要分析源文件。这里的程序选择简单的打开源文件的方法,但是读取内容不是一下子全部读完,而是一行一行读取,读取后,需要按统计条件分析并计数。

统计条件抽象如下:

using System;namespace PowerCodeCalculator.Model{    ///     /// 代码统计条件    ///     [Serializable]    public sealed class CodeStatisticCondition    {        ///         /// 代码目录 绝对路径 形如:D:\PowerCode        ///         public string CodeDirectory { get; set; }        ///         /// 统计的代码类型 通常为.cs代码文件        ///         public string FileTypeFilter { get; set; }        ///         /// 忽略统计的代码文件 如VS自动生成的.designer.cs文件等 多个以逗号,分隔        ///         public string IgnoreFileType { get; set; }        ///         /// 是否统计大括号{或}        ///         public bool IsCalcBrace { get; set; }        ///         /// 是否统计空行行数        ///         public bool IsCalcEmptyLine { get; set; }        ///         /// 是否统计注释行数        ///         public bool IsCalcComment { get; set; }        ///         /// 是否启用多线程统计        ///         public bool IsEnableMultiThread { get; set; }    }}
CodeStatisticCondition

代码源文件信息CodeInfo抽象如下:

using System;namespace PowerCodeCalculator.Model{    ///     /// 代码信息实体    ///     [Serializable]    public sealed class CodeInfo    {        ///         /// 文件名绝对路径 形如:c:\Program.cs        ///         public String FilePath { get; set; }        ///         /// 代码行数        ///         public Int64 LineCount { get; set; }        ///         /// 代码字符数        ///         public Int64 CharCount { get; set; }    }}
CodeInfo

返回的源文件统计信息CodeStatisticInfo抽象如下:

using System;using System.Collections.Generic;using System.Collections.Concurrent;namespace PowerCodeCalculator.Model{    ///     /// 代码统计结果信息实体    ///     [Serializable]    public sealed class CodeStatisticInfo    {        ///         /// 是否成功        ///         public bool IsOK { get; set; }        ///         /// 代码总行数        ///         public Int64 TotalCount { get; set; }        ///         /// 代码字符总数        ///         public Int64 TotalCharCount { get; set; }        ///         /// 代码信息列表        ///         public List
CodeInfoList { get; set; } ///
/// 统计输出信息 /// public String OutPutInfo { get; set; } }}
CodeStatisticInfo

主要统计的业务逻辑在CodeCounterService的Calc方法中:

public static CodeStatisticInfo Calc(CodeStatisticCondition condition){    //1、验证参数    var statResult = CheckCondition(condition);    if (statResult.IsOK == false)    {        return statResult;    }    //2、递归获取所有代码目录    var dirList = GetFileDir(condition.CodeDirectory);    //3、以目录为单位进行遍历统计    try    {        if (condition.IsEnableMultiThread == false) //单线程统计        {            foreach (var dir in dirList)            {                var innerCodeInfoList = GetCodeInfoList(dir, condition);                statResult.CodeInfoList.AddRange(innerCodeInfoList);            }        }        else //多线程统计 待统计代码目录较多,文件较大或者个人PC配置渣渣的情况下请慎用        {            var taskCnt = 8; //并发任务数            var dictDir = GetGroupDir(taskCnt, dirList);            var taskFactory = new TaskFactory();            foreach (var kv in dictDir)            {                PowerLogger.AppendLog("任务【{0}】,并发执行{1}个目录的代码统计", kv.Key, kv.Value.Count);                var listTask = new List
>>(); foreach (var item in kv.Value) { var notifyTask = taskFactory.StartNew
> ( () => { return GetCodeInfoList(item, condition); } ); listTask.Add(notifyTask); } Task.WaitAll(listTask.ToArray()); //等待一批任务并行执行完成 foreach (var tmpTask in listTask) { statResult.CodeInfoList.AddRange(tmpTask.Result); } } } } catch (Exception ex) { statResult.IsOK = false; statResult.OutPutInfo = string.Format("统计代码发生异常:{0}", ex); } if (statResult.IsOK == false) { return statResult; } //4、统计代码总行数及输出 statResult.TotalCount = statResult.CodeInfoList.Sum(x => x.LineCount); statResult.TotalCharCount = statResult.CodeInfoList.Sum(x => x.CharCount); var sb = new StringBuilder(1024); sb.AppendFormat("代码总行数:{0}", statResult.TotalCount); sb.AppendLine(); sb.AppendFormat("代码总字符数:{0}", statResult.TotalCharCount); sb.AppendLine(); if (statResult.CodeInfoList.Any()) { sb.Append("代码行数统计明细:"); sb.AppendLine(); } else { sb.Append("没有匹配的代码文件"); } foreach (var codeInfo in statResult.CodeInfoList) { sb.Append(codeInfo.FilePath); sb.AppendLine(); sb.AppendFormat("【代码行数】:{0}", codeInfo.LineCount); sb.AppendLine(); sb.AppendFormat("【代码字符数】:{0}", codeInfo.CharCount); sb.AppendLine(); sb.AppendLine(); } statResult.OutPutInfo = sb.ToString(); return statResult;}
Calc

 

二、存在的主要不足和缺点

1、不同语言统计支持没有经过充分测试

目前这个小程序仅仅验证了自己经常使用的几种开发语言,其他语言未验证是否通过。

2、多线程统计支持不好

代码中,我想用Task提升性能,目前测试下来,多线程比单线程耗时更久,非常不友好。本来计划使用多线程技术打开文件并行分析每个文件的代码行数,毕竟,IO和计算密集型程序在多线程下应该能够发挥优势。但是看到根据目录并发分析统计代码效果并不好,所以我就直接放弃了多文件同时分析的实现。

3、统计数据不精确

代码行数统计并不完全准确,“统计”的时候,可能某项目下已经无效的代码也加入了统计。还有就是注释,不同语言的注释解析是个难题。再比如说压缩后的js文件,这个也会造成解析统计的不准确。

 

demo地址:

可执行文件下载:

转载于:https://www.cnblogs.com/jeffwongishandsome/p/Sharing-A-Powerful-Tool-For-Calculate-Code-Lines.html

你可能感兴趣的文章
『TensorFlow2.0正式版教程』极简安装TF2.0正式版(CPU&GPU)教程
查看>>
bug收集
查看>>
TCP重置报文段及RST常见场景分析
查看>>
TCP三次握手与四次分手
查看>>
Pow共识算法
查看>>
原型模式
查看>>
Merkle树
查看>>
以太坊RLPx传输协议
查看>>
C++虚函数的工作原理
查看>>
哈希表原理
查看>>
Bloom过滤器
查看>>
比特币核心数据结构
查看>>
分布式系统:时间、时钟和事件序列
查看>>
顺序锁
查看>>
代理模式(Proxy Pattern)
查看>>
观察者模式(Observer Pattern)
查看>>
分布式系统:向量时钟
查看>>
模板模式(Template Pattern)
查看>>
Raft共识算法
查看>>
excel 去掉 空单元格
查看>>