结对编程扩展功能实现

1项目简介

  • 合作者:201631062324 201631062624
  • [gitee地址]:https://gitee.com/TBLGSn/Homework1.git

2项目简介

WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

3PSP表格

PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟 )
Planning计划6030
Estimate估计这个任务需要多少时间6030
Development开发90180
Analysis需求分析 (包括学习新技术)50150
Design Spec生成设计文档6045
Design Review设计复审 (和同事审核设计文档)4520
Coding Standard代码规范 (为目前的开发制定合适的规范)2515
Design具体设计5080
Coding具体编码65130
Code Review代码复审6030
Test测试(自我测试,修改代码,提交修改)6590
Reporting报告5045
Test Report测试报告3040
Size Measurement计算工作量3045
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6030
合计800960

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。

转载于:https://www.cnblogs.com/this-cong/p/9800511.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐