首页 > 技术文章 > 结对项目编程

this-cong 2018-10-16 20:39 原文

结对编程扩展功能实现

1项目简介

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。

推荐阅读