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.测试
这位同学在很多函数后面加了输出,也就是说他会在一些函数完成后给予成功信息,我认为这也是测试的一种很好的方法。
转载于:https://www.cnblogs.com/kevindu/p/4850559.html
Week 2 代码审查相关推荐
- Phabricator是什么,代码审查工具
Phabricator是什么? Phabricator支持两种代码审查工作流:"review"(提交前审查)和 "audit"(提交后审查). Phabrica ...
- 封闭、缺少代码审查,硕士刚毕业的“老”工程师揭露机器学习残酷现状!
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自 | 机器之心 编辑 | 陈萍.杜伟 当前,机器学习领域有没有夸 ...
- 代码审查规范(试用版)
目录 1.背景 2.目标 3.流程 4.指定代码审查规范 4.1.命名风格 4.2.常量定义 4.3.代码风格 4.4.注释风格 4.5.控制语句 5.执行代码审查规范 6.开展PR Bash活动 1 ...
- docker运行gerrit(代码审查工具)
gerrit是什么? Gerrit,一种免费.开放源代码的代码审查软件,使用网页界面. gerrit背景 Gerrit,一种免费.开放源代码的代码审查软件,使用网页界面.利用网页浏览器,同一个团队的软 ...
- Google 鼓励的 13 条代码审查标准,建议收藏!
作者 | Rafiullah Hamedy 译者 | 弯月,责编 | 杨碧玉 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 在本文中,我们将简要介绍 ...
- 代码审查就是在排大便——你懂的!
代码审查就是在排大便--你懂的! 序 豆瓣数据API和后台数据同步已经完成,我大概两天没去管这部分代码,主要是因为产品.老大都不是很积极.因为这个毕竟不是非常重要的. 今天我对代码进行了审查,也进行了 ...
- 代码审查工具 sonarqube 简介
目录 1. 什么是SonarQube? SonarQube的功能 1.糟糕的复杂度分布 2.重复 3.缺乏单元测试 4.没有代码标准 5.没有足够的或者过多的注释 6.潜在的bug 7.糟糕的设计(原 ...
- Google 鼓励的 13 条代码审查标准,建议收藏!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Rafiullah Hamedy 来源 | h ...
- java代码审查规范
2019独角兽企业重金招聘Python工程师标准>>> 分类 重要性 检查项 备注 命名 重要 命名规则是否与所采用的规范保持一致? 成员变量,方法参数等需要使用首字 ...
- 程序员必备的代码审查(Code Review)清单
转自 http://blog.jobbole.com/83595/ 在我们关于高效代码审查的博文中,我们建议使用一个检查清单.在代码审查中,检查清单是一个非常好的工具--它们保证了审查可以在你的团队中 ...
最新文章
- 目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)
- AMD加载器实现笔记(四)
- python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...
- P6793-[SNOI2020]字符串【广义SAM,贪心】
- c语言打印空心等腰梯形乐学,C语言做激光发射
- 数据分析 数据清理_数据清理| 数据科学
- Linux : DHCP 服务
- c++界面设计皮肤工具
- java 按顺序读取文件夹_java读取某个文件夹下的所有文件实例代码
- WiFi转串口 以太网模块
- android jni c调用java,Android JNI中C调用Java方法
- MATLAB中histogram函数的使用
- 蚂蚁金服副总裁蒋国飞:技术全面开放,与合作伙伴共发展
- Java并发编程73道面试题及答案 —— 面试稳了 侵立删
- mt4的服务器在哪个文件,mt4的服务器地址
- 从新建工程开始使用C++开发单片机(以STM32为例):六、C++输入输出流(附代码)
- 让你低调的app脱颖而出
- matlab中som结果,som 运行结果怎么看啊
- Live555: RtspServer 示例
- Mysql 基础操作知识专题