Week 2 代码审查
我的伙伴是6班的小伙子潘礼鹏,经过几天的相处我觉得真的是说话很有趣的人,性格非常好,我们很划得来。
以下为我对他的代码的审查结果:
- VS2012与VS2013的兼容性
在这里写一个工具集的问题,不同的版本之间有着不一样的工具集,VS2012自带的工具集是VS2012(V110),而VS2013的工具集为VS2013(V120)。
改动这个也很简单,只需要在 选中项目,右键->配置属性->平台工具集->选择VS2013(V120)即可。

- 代码分析
潘同学的代码一共有两个文件,分别是
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();
}
这个文件主要是实现对于所有分数的处理,比如加减乘除通分约分。
通过这一段程序我们能看出来:
- 该同学能够及时换行,代码的格式让人看起来很舒服。
- 该同学有加注释的好习惯,能方便队友更容易地上手他的代码。
不足之处:所有的变量名都是用中文标示的,这样看起来不是很舒服。
再来看一下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;
}
这个文件主要是处理逻辑。
在这段代码中,我发现:
- 各个flag没有什么意思,有点混乱。
- 起变量名的问题变得有些严重,比如addsubkuohaoFlag,让人看起来很费力气。
- 封装的不够,有500多行代码,有些方法有150多行。
- 分成了多个步骤,稍稍有一点繁琐。
- 最重要的一点,他的乘除号不是UTF-32编码的!这个在我运行程序对比时才看出来。
当然,也有很多优点:
1. 单元测试,程序运行完一个单元都会输出当前的状态,这样就立刻能知道是那个模块错了。我认为这个很重要!,也是我应该做的。
2. 定义了自己的类型,让逻辑变得简明易懂。
3. 考虑的十分全面,有很多关于优先级、括号的判断。这样也就是说基本功能实现的不错。
4. 每一个函数都有注释,可以快速理解他的思路。
5. 注重了内存,没有随便使用大数量的数组。我在第一版程序中使用了数组。后来用了List代替。
3.实际测验
实践出真知。

经过对这些运算的处理,发现了乘除号不属于 UTF-32编码!,其他的全都正确。
然后是测试对不同输入的支持。
- -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 代码审查的更多相关文章
- 使用stylelint对CSS/Sass做代码审查
对样式审查?很少人会这么做吧,但实际上开发者应该有这样的态度,尤其是不同团队多人开发时,这一点尤为重要. 在本文中,我将陈述两点:一是为什么我们需要对样式进行审查,二是如何将审查工具融合到整体的构建流 ...
- Android APK瘦身之Android Studio Lint (代码审查)
******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...
- 给 C# 开发者的代码审查清单
这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...
- [转]给 C# 开发者的代码审查清单
这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...
- Phabricator是什么,代码审查工具
Phabricator是什么? Phabricator支持两种代码审查工作流:"review"(提交前审查)和 "audit"(提交后审查). Phabrica ...
- 转:给 C# 开发者的代码审查清单
给 C# 开发者的代码审查清单 [感谢@L就是L 的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考. ...
- 静态代码审查工具FxCop插件开发(c#)
FxCop是一款微软官方提供的.net平台代码审查工具,目的是检查我们编写的程序集的代码是否符合规范.FxCop默认提供的是微软默认的审查规则,而且该规则符合<Framework DesignG ...
- 使用StyleCop进行代码审查
使用StyleCop进行代码审查 工欲善其事,必先利其器,上篇简单介绍了怎样使用Astyle进行代码格式化,使编写的代码具有一致的风格.今天简单介绍下怎样使用StyleCop对原代码进行审查,看编写的 ...
- **代码审查:Phabricator命令行工具Arcanist的基本用法
Phabricator入门手册 http://www.oschina.net/question/191440_125562 Pharicator是FB的代码审查工具,现在我所在的团队也使用它来进行代码 ...
- 程序员必备的代码审查(Code Review)清单【转载】
在我们关于高效代码审查的博文中,我们建议使用一个检查清单.在代码审查中,检查清单是一个非常好的工具——它们保证了审查可以在你的团队中始终如一的进行.它们也是一种保证常见问题能够被发现并被解决的便利方式 ...
随机推荐
- tkinter学习系列之(五)Checkbutton控件
目录 目录 前言 (一)基本属性 (二)案例 1.简单的复选框 2.组合复选框 目录 前言 复选框:可以同时多选的一组框,其只有两种状态,选中与未选中. (一)基本属性 (1)说明: tkinter里 ...
- January 12th, 2018 Week 02nd Friday
Nothing behind me, everything ahead of me, as is ever so on the road. 我的身后空空荡荡,整个世界都在前方,这就是在路上. That ...
- SAP CRM 开发学习资料和教程整理【不定时更新】
本文链接:http://www.cnblogs.com/hhelibeb/p/6276929.html 首先是SAP网站上面的相关内容 SAP Customer Relationship Manage ...
- 菜鸟水平如何在Android Studio中添加uiautomator测试框架
1.启动AS,弹出创建Android Studio项目 2.选择 "Start a new Android Studio project",输入 application name ...
- Java关于远程调试程序教程
本节尝试一下Java远程调试的东西,记录一遍简单入门的东西.也就算是使用记录吧! 写一个简单程序打成jar丢到远程服务器运行,模拟远程Server在运行.就拿Java调用shell脚本提交作业程序为例 ...
- 转载 SpringMVC详解(二)------详细架构
目录 1.SpringMVC 详细介绍 2.SpringMVC 处理请求流程 3.配置前端控制器 4.配置处理器适配器 5.编写 Handler 5.配置处理器映射器 6.配置视图解析器 7.Disp ...
- ECS简述
一.查看ECS实例 使用场景 •实例的日常维护 •实例运行状态和详细信息的查看 二.启动ECS实例 使用场景 •实例停止运行之后的再次启动 三.停止.重启ECS实例 使用场景 •实例运行的服务暂停时停 ...
- mybatis基础系列(一)——mybatis入门
好久不发博客了,写博文的一个好处是能让心静下来,整理下之前学习过的一些知识一起分享,大神路过~ mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. ...
- YOCVM
一.热补丁的本质 对于线上紧急的bug,重新提审AppStore的时间过长.因此,能够下发一段补丁代码到线上运行,并结合Runtime,实时改变App原有的行为,就显得极为重要.补丁代码的形式可以有很 ...
- android ActionBarSherlock使用说明
源代码地址:https://github.com/JakeWharton/ActionBarSherlock 1.添加项目依赖包 2.修改AndroidManifest.xml中的主题(或者继承该主题 ...