结对项目编程
结对编程扩展功能实现
1项目简介
- 合作者:201631062324 201631062624
- [gitee地址]:https://gitee.com/TBLGSn/Homework1.git
2项目简介
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
3PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟 ) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
Estimate | 估计这个任务需要多少时间 | 60 | 30 |
Development | 开发 | 90 | 180 |
Analysis | 需求分析 (包括学习新技术) | 50 | 150 |
Design Spec | 生成设计文档 | 60 | 45 |
Design Review | 设计复审 (和同事审核设计文档) | 45 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 25 | 15 |
Design | 具体设计 | 50 | 80 |
Coding | 具体编码 | 65 | 130 |
Code Review | 代码复审 | 60 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 65 | 90 |
Reporting | 报告 | 50 | 45 |
Test Report | 测试报告 | 30 | 40 |
Size Measurement | 计算工作量 | 30 | 45 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 30 |
合计 | 800 | 960 |
4代码互审情况
1.数据结构及算法代码情况:
- 还可能是自己不是很明确如何进行代码复查.发现的问题比较表面,例如:注释问题,类型转换等问题,代码复查过程中并没有思考相应的开发者的开发逻辑,也就很难发现严重的问题.但是在代码设计的过程中,个别函数功能太多,还需要更细化功能,模块化功能化使整个代码风格更加美观,在逻辑实现方面,考虑的比较全面。
2.TB_流光斯年代码情况:
简单性 | 废话较少,项目代码量越少,bug机会越小 |
清晰性 | 每个类、接口、方法和对象都有明确的用途,注释中也提到何时、何地、为何使用 |
完整性 | 编写完整的说明文档,注释清楚 |
健壮性 | 为错误和异常做出预测,并在程序中处理,这一点由于时间的关系,未能在程序中体现出来 |
5设计过程
参见链接 :https://www.processon.com/view/link/5bc6a262e4b0fe81b660fe2d
主要的想法,来源于编译原理。在编译原理中,能通过类似于下面的语句片段对于一个语句进行(语法)分析
void stmt() {
switch ( Iookkahead ) {
case expr:
match( expr ); match( ’;’ ); break;
case if:
match( if ); match('(’); match(expr); match(’)’); stmt();};
break;
case other;
match(other}; break;
........
( 这里颇有意思的是stmt语句能够包括另一条语句,因此"if“分支上我们会递归调用stmt方法). 同样,对于不同的参数,我们也能够调用不同的过程(即函数||方法)来完成相应的工作。 因此我们不难得到如下的伪代码
void Handle{
while( true ){
switch ( "识别到的参数") {
case "-w":
CountWord();
case "-l":
CountLinear();
case "-c":
CountChar();
case other;
Count(other}; break;
.............
}
if( "参数完结") break;
}
6代码说明
这次作业主要是在上次的基础上,进行修改扩充,以增加新的功能。 具体如下: ① 增加对于“-s”参数的支持,使得能够对于文件夹中的所有txt类型进行处理. ②. 增加对于”-a“参数的支持,使得能够统计文件中的信息代码行数、空行数、注释行数进行处理. ③. 修改部分变量名、函数名,使得能够具有更好的软件质量。 关键部分如下:
- 实现-a功能:
/*
* 统计代码行数、空行数、注释行数。
*@输入:char* outtextname:输入文件名 char* inputtxtname:输出文件名
*@输出:将信息写入 outtxtname 指定的文件中,采用的是追加方式
**/
void CountOtherLinear( char* infilename ,char* outfilname )
{
//文件指针
FILE* input = Openfile( infilename , "r" );
char ch = fgetc( input );
int Codeline = 0;
int Emptyline = 0;
int Annotatedline = 0;
/*总行数*/
int num =0;
/*统计*/
while( !feof( input ) ){
char data[ 100 ];
fgets(data,1024,input);
num ++;
if( strlen( data ) == 1 )
{
Emptyline ++; //空行数
}else{
/* 跳过空格*/
int i =0;
while( data[ i ] == ' ' )
i ++;
if( data[ i] != '/' )
{
Codeline ++; //代码数
}
}
}
Annotatedline = num - Emptyline - Codeline; //注释行数
//在outfilename中写入结果
FILE* output = Openfile( outfilname , "a+" );
fprintf( output ,"代码行/空行/注释行:%d/%d/%d\n", Codeline , Emptyline,Annotatedline);
Closefile( input ,output );
return ;
}
当然,其实我们函数与其说是实现了一个功能,我们还不如说是完成了三个功能。 实际上,我们应当考虑将具体的功能,再进一步细化,然后再进行组合以实现“组合功能”。
- 实现"-s"功能:
/*
* 递归处理文件夹 (暂时实现为打印出文件相关信息)
*@输入:char* outtextname:输入文件夹 char* inputtxtname:输出文件名
*@输出:将信息写入 inputtxtname 指定的文件中,采用的是追加方式
**/
void HandleRecurFiles ( char* infilename ,char* outfilename )
{
printf("%s \n",infilename);
//文件存储信息结构体
struct _finddata_t fileinfo;
//保存文件句柄
long fHandle;
/*字符串拼接,在文件名前加入./ 拼接成路径*/
char filename[ 100 ] ={""};
strcat( filename ,infilename );
// 处理所有文件
strcat( filename ,"/*");
if( (fHandle=_findfirst( filename , &fileinfo )) == -1L )
{
printf( "当前目录下没有文件\n");
return ;
}
else{
do{
//文件夹
if( _A_SUBDIR == fileinfo.attrib){
if( (strcmp(fileinfo.name,".") != 0 ) &&(strcmp(fileinfo.name,"..") != 0)){
//拼接出新路径
char filename1[ 100 ]={""};
strcat( filename1,infilename);
strcat( filename1,"/");
strcat(filename1 , fileinfo.name);
//递归处理文件夹
HandleRecurFiles( filename1 , outfilename );
}
}else{
// 此处本应该是,对发现的文件进行处理
printf("在%s发现%s",infilename,fileinfo.name);
}
}while( _findnext(fHandle,&fileinfo)==0);
}
//关闭文件
_findclose( fHandle );
return ;
}
7总结
- 总的来说,整个合作过程比较愉快;在合作沟通的过程中,由于各自的时间安排有限,相对于面对面来说,有时交流得不到及时的回复反馈,单独审视对方代码所耗费的精力大,1+1<2;但在合作过程中的其他方面,所展现的优点也不容忽视,面对问题可以提供更多的解决方案,对同一个难题,相当于有两倍的时间去思考解决,此时1+1>2。