码迷,mamicode.com
首页 > 其他好文 > 详细

Week 2 代码审查

时间:2015-10-01 00:34:54      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:

我的伙伴是6班的小伙子潘礼鹏,经过几天的相处我觉得真的是说话很有趣的人,性格非常好,我们很划得来。

以下为我对他的代码的审查结果:

  1. VS2012与VS2013的兼容性

在这里写一个工具集的问题,不同的版本之间有着不一样的工具集,VS2012自带的工具集是VS2012(V110),而VS2013的工具集为VS2013(V120)。

改动这个也很简单,只需要在 选中项目,右键->配置属性->平台工具集->选择VS2013(V120)即可。

 技术分享

  1. 代码分析

潘同学的代码一共有两个文件,分别是

fenshu.cpp

SZYS.cpp

首先来看一下 fenshu.cpp

由于文件较大,我们截取一段。

void Fenshu::tongfen(Fenshu b)

{//按照b来放大a

fenzi = fenzi * b.fenmu;

fenmu = fenmu * b.fenmu;

}

 

void Fenshu::add(Fenshu b)

tongfen(b);

fenzi = fenzi + b.fenzi*(fenmu/b.fenmu);//防溢出

yuefen();

}

这个文件主要是实现对于所有分数的处理,比如加减乘除通分约分。

 

通过这一段程序我们能看出来:

  1. 该同学能够及时换行,代码的格式让人看起来很舒服。
  2. 该同学有加注释的好习惯,能方便队友更容易地上手他的代码。

        不足之处:所有的变量名都是用中文标示的,这样看起来不是很舒服。

再来看一下SZYS.cpp

从名字来看我揣测SZYS是四则运算的意思。

tmpstr = getNumbString(numb[i + 1]);

                   if(op1[i] == "×")

                   {

                            tmp.mul(numb[i + 1]);

                            if(addsubKuohaoFlag(i,op1))

                            {

                                     exercise = "(" + exercise + ")";  //考虑到*/优先级,无条件加括号

                            }

                            if(Random(2) == 0)  //0的话新加的在右边,1在左边

                            {

                                     exercise += " × " + tmpstr;

                            }

                            else

                            {

                                     if(muldivKuohaoFlag(i,op1))

                                     {

                                               exercise = "(" + exercise + ")"; //*/也有先后顺序

                                     }

                                     exercise = tmpstr + " × " + exercise; 

                            }

                            continue;

                   }

                   if(op1[i] == "÷")

                   {

                            if(numb[i + 1].getFenzi() == 0 && tmp.getFenzi() != 0)

                            {

                                     tmp.set(0,tmp.getFenmu(),0);

                                     exercise = tmpstr + " ÷ " + "(" + exercise + ")";

                            }

                            else if(numb[i + 1].getFenzi() == 0 && tmp.getFenzi() == 0)

                            {

                                     failFlag = true;  //除数被除数都为0,此时判定为生成失败,退回重新生成

                                     break;

                            }

                            else

                            {

                                     tmp.div(numb[i + 1]);

                                     if(addsubKuohaoFlag(i,op1))

                                     {

                                               exercise = "(" + exercise + ")";

                                     }

                                     exercise += " ÷ " + tmpstr;

                            }

                            continue;

                   }

这个文件主要是处理逻辑。

在这段代码中,我发现:

  1. 各个flag没有什么意思,有点混乱。
  2. 起变量名的问题变得有些严重,比如addsubkuohaoFlag,让人看起来很费力气。
  3. 封装的不够,有500多行代码,有些方法有150多行。
  4. 分成了多个步骤,稍稍有一点繁琐。
  5. 最重要的一点,他的乘除号不是UTF-32编码的!这个在我运行程序对比时才看出来。

当然,也有很多优点:

1.       单元测试,程序运行完一个单元都会输出当前的状态,这样就立刻能知道是那个模块错了。我认为这个很重要!,也是我应该做的。

2.       定义了自己的类型,让逻辑变得简明易懂。

3.       考虑的十分全面,有很多关于优先级、括号的判断。这样也就是说基本功能实现的不错。

4.       每一个函数都有注释,可以快速理解他的思路。

5.       注重了内存,没有随便使用大数量的数组。我在第一版程序中使用了数组。后来用了List代替。

3.实际测验

实践出真知。

 技术分享

经过对这些运算的处理,发现了乘除号不属于 UTF-32编码!,其他的全都正确。

然后是测试对不同输入的支持。

  1. -n 100 -r 1 这种情况下会进入死循环。

          说明没有对无法生成的情况做判断。

  2.–n 100 –r 10 输出正常,所有分数和0的输出符合要求。

  3.–n 1000 –r 100 跑了16秒,输入输出正常。

  4.–e xxx –a 输出对比正常。

 

4.时间复杂度分析

   刚才说到1000 个跑了16秒,这是什么问题呢?我们启用代码分析。

 技术分享

技术分享

   后来我发现,主要是字符串的判重效率太低,占用了太多资源。

5.测试

这位同学在很多函数后面加了输出,也就是说他会在一些函数完成后给予成功信息,我认为这也是测试的一种很好的方法。

 

Week 2 代码审查

标签:

原文地址:http://www.cnblogs.com/kevindu/p/4850559.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!