软件总代码行数软件注释率分析.docx

上传人:b****7 文档编号:25052222 上传时间:2023-06-04 格式:DOCX 页数:23 大小:310.02KB
下载 相关 举报
软件总代码行数软件注释率分析.docx_第1页
第1页 / 共23页
软件总代码行数软件注释率分析.docx_第2页
第2页 / 共23页
软件总代码行数软件注释率分析.docx_第3页
第3页 / 共23页
软件总代码行数软件注释率分析.docx_第4页
第4页 / 共23页
软件总代码行数软件注释率分析.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

软件总代码行数软件注释率分析.docx

《软件总代码行数软件注释率分析.docx》由会员分享,可在线阅读,更多相关《软件总代码行数软件注释率分析.docx(23页珍藏版)》请在冰豆网上搜索。

软件总代码行数软件注释率分析.docx

软件总代码行数软件注释率分析

文档名称:

软件总代码行数_软件注释

率分析

作者:

日期:

1.cncc

1.1工具简介

度量工具名称

cncc

网址

操作方式

命令行

实现语言

C++

适用的操作系统

Windows

可以度量的属性

code-lines,empty-lines,comment-lines,total-lines

备注

1.2工具优缺点总结

最新版本cncc-1-3-1,在sourceforge中2004年已经停止更新。

最大的优点是源代码全部存于一个cpp文件,便于集成。

缺点:

1.代码基本没有注释。

2.下载的代码编译有9个错误。

3.费了2个多小时也没搞定。

1.3使用例程

无。

2.CodeCount

2.1工具简介

度量工具名称

CodeCount

网址

操作方式

GUI

实现语言

C++

适用的操作系统

Windows

可以度量的属性

total-lines,empty-lines,comment-lines,code-lines,

备注

2.2工具优缺点总结

优点:

工具比较精简,统计源文件总行数、代码行数、空白行数、注释行数,代码有一定的注释。

缺点:

下载的源码是vc7工程,由于机器并没有vc7,利用工具进行工程类型转换,将vc7的工程转换为vc6的工作,编译出错。

核心代码如下:

BOOLbCommentSet=FALSE;//注释行统计标识有"/*"时TRUE,"*/"时FALSE

BOOLbQuatoSet=FALSE;//字符串统计标识首次一行有奇数个"时TRUE,下一行有奇数个"时FALSE

intnLength=(int)file.GetLength();

 

CStringbufRead;

intnLineCommentBegin=0;

while(file.ReadString(bufRead)!

=FALSE)

{

BOOLbStatedComment=FALSE;//本行作为注释行是否已统计过

BOOLbStatedCode=FALSE;//本行作为代码行是否已统计过

nLines++;

bufRead.TrimLeft();//先将文件头的空格或制表符去掉

if(bufRead.GetLength()==0)//为空白行

{

nBlankLines++;

continue;

}

if(bCommentSet&&bufRead.Find(_T("*/"))==-1)

{

nCommentLines++;

continue;

}

if(bufRead.Find(_T("//"))==-1&&bufRead.Find(_T("/*"))==-1&&bufRead.Find(_T("*/"))==-1)

{//如果本行根本就无注释符,则要不是注释符,要不是代码行

if(bCommentSet)

{

nCommentLines++;continue;

}

else

{

if(bufRead.Find('"')==-1)

{

nCodeLines++;continue;

}

}

}

if(bufRead.Find(_T("//"))==0&&!

bCommentSet&&!

bQuatoSet)

{

nCommentLines++;

continue;

}

BOOLbDoubleSplashFound=FALSE;

BOOLbSplashStarFound=FALSE;

for(inti=0;i

{

//charcTemp=bufRead[i];

wchar_tcTemp=bufRead[i];

if(bufRead[i]=='/'&&bufRead[i+1]=='/'&&!

bCommentSet&&!

bQuatoSet)

{

if(!

bStatedComment&&(m_nStatMethod==1||m_nStatMethod==2))

{

bStatedComment=TRUE;

nCommentLines++;

}

bDoubleSplashFound=TRUE;

//i++;//应该+1,但也没有什么用处

break;

}

elseif(bufRead[i]=='/'&&bufRead[i+1]=='*'&&!

bCommentSet&&!

bQuatoSet)

{

if(!

bStatedComment&&(m_nStatMethod==1||m_nStatMethod==2))

{

bStatedComment=TRUE;

nCommentLines++;

}

bCommentSet=TRUE;

bSplashStarFound=TRUE;

i++;

}

//计算代码行必须在bCommentSet关闭之前

elseif(bufRead[i]!

=''&&bufRead[i]!

='\t'&&!

bCommentSet)

{

if(!

bStatedCode)

{

bStatedCode=TRUE;

nCodeLines++;

}

if(bufRead[i]=='\\')

{//\之后的字符要跳过

i++;

continue;

}

if(bufRead[i]=='\'')

{

if(bufRead[i+1]=='\\')

i+=2;

else

i+=1;

continue;

}

if(bufRead[i]=='"')

{//"必须引起重视,感谢ltzhou

bQuatoSet=!

bQuatoSet;

}

}

elseif(bufRead[i]=='*'&&bufRead[i+1]=='/'&&bCommentSet&&!

bQuatoSet)

{

if(!

bStatedComment&&(m_nStatMethod==1||m_nStatMethod==2))

{

bStatedComment=TRUE;

nCommentLines++;

}

bCommentSet=FALSE;

bSplashStarFound=TRUE;

i++;

}

}

if(bDoubleSplashFound)

{

if(m_nStatMethod==2&&bStatedCode)//如果统计方法为第三种,且同时有代码行与注释行,则只计注释行

{

nCodeLines--;

}

if(m_nStatMethod==0&&!

bStatedCode)//如果统计方法为第一种,且未作为代码行统计过,那么必为注释行

{

nCommentLines++;

}

continue;

}

if(bufRead[bufRead.GetLength()-1]=='"'&&!

bCommentSet)

{//若某行最后一个是",则必定用来关闭bQuatoSet,记代码行一行,否则报错

bQuatoSet=!

bQuatoSet;

if(!

bQuatoSet)

{

if(!

bStatedCode)

{

bStatedCode=TRUE;

nCodeLines++;

}

}

else

{

CStdioFilefileLog;

if(fileLog.Open(m_strLogFile,CFile:

:

modeCreate|CFile:

:

modeWrite|CFile:

:

modeNoTruncate)==TRUE)

{

CStringstrMsg;

if(fileLog.GetLength()==0)

{

strMsg.Format(_T("文件\t行\t问题\n"),strFileName,nLines);

fileLog.WriteString(strMsg);

}

strMsg.Format(_T("%s\t%d\t字符串换行未用\\\n"),strFileName,nLines);

fileLog.WriteString(strMsg);

fileLog.Close();

}

}

continue;

}

if(bufRead[bufRead.GetLength()-1]!

=''&&bufRead[bufRead.GetLength()-1]!

='\t'&&!

bCommentSet

&&bufRead[bufRead.GetLength()-2]!

='*'&&bufRead[bufRead.GetLength()-1]!

='/')

{//如果最后一个字符非空格或制表符,且前面无/*,最后两个字符不是*/,则为代码行

if(!

bStatedCode)

{

bStatedCode=TRUE;

nCodeLines++;

}

}

if(bSplashStarFound)

{

if(m_nStatMethod==2&&bStatedCode)//如果统计方法为第三种,且同时有代码行与注释行,则只计注释行

{

nCodeLines--;

}

if(m_nStatMethod==0&&!

bStatedCode&&!

bStatedComment)//若该行无代码如/*abc*///222

//但是统计方法是第一种,则需要追加注释行计数一次

{

bStatedComment=TRUE;

nCommentLines++;

}

}

if(!

bStatedComment&&bCommentSet)//可能是前面有/*,在第一种统计方法中,未作为代码行计算过,那么本行肯定是注释行

{

if(m_nStatMethod==0&&!

bStatedCode)

{

bStatedComment=TRUE;

nCommentLines++;

}

}

if(bQuatoSet&&bufRead[bufRead.GetLength()-1]!

='\\')

{

CStdioFilefileLog;

if(fileLog.Open(m_strLogFile,CFile:

:

modeCreate|CFile:

:

modeWrite|CFile:

:

modeNoTruncate)==TRUE)

{

CStringstrMsg;

if(fileLog.GetLength()==0)

{

strMsg.Format(_T("文件\t行\t问题\n"),strFileName,nLines);

fileLog.WriteString(strMsg);

}

strMsg.Format(_T("%s\t%d\t字符串换行未用\\\n"),strFileName,nLines);

fileLog.WriteString(strMsg);

fileLog.Close();

}

}

}

 

file.Close();

2.3使用例程

通过分析其源代码,抽取解析源文件部分的功能代码,构建独立的工程,经测试可以完成代码行等数据的统计工作,但仍需要进一步测试。

下一步工作:

将本工程与实现功能单元最大行数的工程合并,最终实现关于代码行数的度量工具。

3.codeAnalysis

3.1工具简介

度量工具名称

codeAnalysis

网址

操作方式

GUI

实现语言

C++

适用的操作系统

Windows

可以度量的属性

code-lines,empty-lines,comment-lines,

备注

3.2工具优缺点总结

缺点:

1.实现过于简单,没有利用价值。

2.可以执行,但结果不正确,界面截图如下:

3.经过代码分析,其核心统计代码考虑情况不完善。

核心代码如下:

for(inti=0;i

{

strItem=m_listSourceFile.GetItemText(i,0);

if(!

oSrcFile.Open(strItem,CFile:

:

modeRead))

{

CStringstrMsg="cannotopenfile:

";

strMsg+=strItem;

MessageBox(strMsg);

return;

}

for(;;)

{

if(!

oSrcFile.ReadString(strLine))

break;

strLine.TrimLeft();

strLine.TrimRight();

if(0==strLine.GetLength())

iBlankCount++;

elseif("//"==strLine.Left

(2))

iCommentCount++;

else

iSourceCount++;

}

oSrcFile.Close();

}

总结:

没有使用价值。

3.3使用例程

无。

4.codeAnalyer

4.1工具简介

度量工具名称

codeAnalyer

网址

操作方式

GUI

实现语言

java

适用的操作系统

WindowsLinux

可以度量的属性

total-lines,empty-lines,comment-lines,code-lines

备注

支持C,C++,java语言的源码

4.2工具优缺点总结

并没有实际运行起来,因此着重分析其对应处理代码行统计的代码。

优点:

1.该工具可以显示项目的文件树

2.核心代码在CodeAnalysis目录下的几个类,封装非常好,例如专门处理comment的类,度量对象的类Stats。

4.3使用例程

”CodeAnalyzer-0.7.0.jar”图标右键单击后,在“打开方式”里选择”Java(TM)PlatformSEbinary”。

1.新建CodeSet

选择”File”菜单里的”NewCodeSet”菜单项,如图4.3.1所示。

图4.3.1–新建CodeSet

2.给CodeSet重命名

选中新建的CodeSet”New”,单击鼠标右键,如图4.3.2所示。

图4.3.2–给CodeSet重命名

在弹出菜单中选择”Rename”选项,在弹出的对话框中输入新的codeset名称,如图2.3所示。

图4.3.3–给CodeSet重命名

3.为这个CodeSet选择ExtensionSet

选择”Tools”菜单里的”ExtensionSets”菜单项,再选择”Select”子菜单项,如图2.4所示。

图4.3.4–选择ExtensionSet

再选择该子菜单项下的的”StandardC(*.c*.h)”选项,如图4.3..5所示。

图4.3.5–选择ExtensionSet

4.构建CodeSet视图

选中重命名后的CodeSet”CodeAnalyzerForC”,单击鼠标右键,如图4.3.6所示。

图4.3.6–构建codeset视图

在弹出菜单中选择”AddBranch”选项,选择要检测的实例代码的路径,如图2.7所示。

图4.3.7–选择实例路径

构建好的CodeSet视图如图4.3.8所示。

图4.3.8–构建好的codeset视图

5.执行

选择”Run”菜单里的”Run”菜单项,如图4.3.9所示。

图4.3.9–执行实例

分析的结果如图4.3.10所示。

图4.3.10–执行结果

5.生成报告

选择”Reports”菜单里的”FullHTMLReport”菜单项,如图4.3.11所示。

图4.3.11–选择报告类型

选择生成的报告的保存路径,如图4.3.12所示。

图4.3.12–选择保存路径

选择分析只包含文件夹还是文件夹文件都包括,如图2.13所示。

图4.3.13–选择包含类型

生成的html报告如图4.3.14所示。

图4.3.14–html报告

5.SourceMeter

5.1工具简介

度量工具名称

SourceMeter

网址

 

操作方式

命令行

实现语言

Java

适用的操作系统

Windows/ Unix

可以度量的属性

FCNumberofprocessedfiles

LOTLinesoftext

LOTNENon-emptylinesoftext

JFLDNumberofJavafielddefinitions

备注

开源。

代码已找到。

官方文档非常详细

SourceMeterisatoolforcalculatingmetricsonsourcecodebasesinanylanguage.Itprovidesanumberofbuilt-inmetrics,buthasalsobeendesignedtomaketheimplementationofnewmetricsassimpleaspossible.

5.2工具优缺点总结

优点:

1.实现方案完善

2.帮助文档齐全

3.代码有研究价值

5.3使用例程

1.必须有Java2(J2SE)环境。

2.解压下载的压缩文件。

3.修改SourceMeter.cmd(forWindows)文件,指定SourceMeter的路径。

4.也可以将SourceMeter的bin目录设置到环境变量中,这样可以任意目录都可以执行SourceMeter。

5.运行SourceMeter,会有使用提示

6总结

采用CodeCount和另一开源代码(定位函数定义行)结合,进行源代码分析,可以实现软件总代码行数、软件注释率和功能单元最大有效代码行数的度量。

若进行源码研究的话,推荐CodeCount、SourceMeter、codeAnalyer。

集成这3个度量的工具采用GUI界面,开发语言采用C++,工具VC6。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1