我的伙伴是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 代码审查的更多相关文章

  1. 使用stylelint对CSS/Sass做代码审查

    对样式审查?很少人会这么做吧,但实际上开发者应该有这样的态度,尤其是不同团队多人开发时,这一点尤为重要. 在本文中,我将陈述两点:一是为什么我们需要对样式进行审查,二是如何将审查工具融合到整体的构建流 ...

  2. Android APK瘦身之Android Studio Lint (代码审查)

    ******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...

  3. 给 C# 开发者的代码审查清单

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...

  4. [转]给 C# 开发者的代码审查清单

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...

  5. Phabricator是什么,代码审查工具

    Phabricator是什么? Phabricator支持两种代码审查工作流:"review"(提交前审查)和 "audit"(提交后审查). Phabrica ...

  6. 转:给 C# 开发者的代码审查清单

      给 C# 开发者的代码审查清单   [感谢@L就是L 的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考. ...

  7. 静态代码审查工具FxCop插件开发(c#)

    FxCop是一款微软官方提供的.net平台代码审查工具,目的是检查我们编写的程序集的代码是否符合规范.FxCop默认提供的是微软默认的审查规则,而且该规则符合<Framework DesignG ...

  8. 使用StyleCop进行代码审查

    使用StyleCop进行代码审查 工欲善其事,必先利其器,上篇简单介绍了怎样使用Astyle进行代码格式化,使编写的代码具有一致的风格.今天简单介绍下怎样使用StyleCop对原代码进行审查,看编写的 ...

  9. **代码审查:Phabricator命令行工具Arcanist的基本用法

    Phabricator入门手册 http://www.oschina.net/question/191440_125562 Pharicator是FB的代码审查工具,现在我所在的团队也使用它来进行代码 ...

  10. 程序员必备的代码审查(Code Review)清单【转载】

    在我们关于高效代码审查的博文中,我们建议使用一个检查清单.在代码审查中,检查清单是一个非常好的工具——它们保证了审查可以在你的团队中始终如一的进行.它们也是一种保证常见问题能够被发现并被解决的便利方式 ...

随机推荐

  1. spark-Scala

    一.spark的特点 1.快速的 2.容易使用的 3.通用的 4.开放的 二.spark组件 sparkCore sparkSQL sparkStreaming MLibmachielearning ...

  2. Python进阶(一)

    完成慕课网的python基础学习以后,大约花了三天时间,平均每天一个小时,总结了一些比较好的例题和思想方法,下面来学习python进阶吧 参考廖雪峰官方课程 函数 python官方函数调用文档 定义默 ...

  3. Shiro-Subject 分析

    Subject反正就好像呈现的视图.所有Subject 都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager:可以把Subject认为是一个门面: ...

  4. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  5. Tronado自定义Form组件

    Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...

  6. openssl交叉编译记录

    本次任务是要完毕嵌入式Linux下对openssl程序的支持.     我的开发环境:ARM9开发板 和 嵌入式Linux操作系统.装有Linux系统(我的是ubuntu9.04)的PC机一台.串口和 ...

  7. tomcat7的catalina.sh配置说明

    捞财宝项目8G内存tomcat7的配置JAVA_OPTS="-Xms1024m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=2048M  -XX:M ...

  8. 【转】一个域名是用哪里的DNS来解析的,电脑怎么知道找哪一个DNS呢? 我注册域名的时候会在服务商那里配置DNS解析,一般需要24小时后才能访问,我想知道,解析后的这个数据是不是会同步到世界上所有的DNS服务器呢!如果不是,当我访问我的这个域名的时候,电脑怎么知道去找到我注册的这一家的DNS服务器呢,谁告诉他的呢?

    看看DNS一些基础知识,你就了解了.1.DNS就是域名服务器,他的任务就是确定域名的解析,比如A记录MX记录等等. 2.任何域名都至少有一个DNS,一般是2个.为什么要2个以上呢?因为DNS可以轮回处 ...

  9. unhandled exception(没有处理异常)

    背景 今天在代码中抛出了Exception类, 但是出现了代码报错 意思是,未处理异常 原因 因为Exception是check异常,也就是必须在代码层面直接捕获处理的,这类异常有IOExceptio ...

  10. nohup: failed to run command `java': No such file or directory

    在执行脚本添加这一行 source /etc/profile exec nohup java -Xms1024m -Xmx2048m -jar /opt/dev/claimzuul/$JAR_BAO ...