代码规范与复审2——个人博客作业week
一、关于编程规范的重要性论证
1、不支持。
1)编程规范有利于自己提高编程效率和编程质量。编码是程序员的职责,一个好的信息技术产品必然有高质量的代码,高质量的代码首先
一点它必须遵守某种编程规范。如果你的源代码被作为产品发布,那么你必须保证它和其它产品一样很好的包装并保持整洁。
2)编程规范有利于别人迅速理解自己的代码。一个软件整个生命周期内成本的80%用于维护,几乎没有一个软件在整个生命周期内全部由它的原始作者来维护。编程规范改善了软件的可读性,使工程师更加快速、彻底的理解新代码。
3)提高了团队编程的效率。 大量数据表明,软件存在问题或者隐患,很大一部分是由于未遵守基本准则所致,如果能在项目早期明确规则,则会避免许多麻烦。为了简化工作,团队中每一个编写软件的人都必须遵守编程规范。
除此之外,每个人都习惯看自己的代码,如果团队中的成员能够统一编程的规范,那么大家阅读别人代码的时候就会更加有耐心。
2、我是个艺术家,手艺人,我有自己的规范和原则。
反驳。
个人的能力是有限的,一个成功的软件必然与团队中各个成员的努力密不可分。当一个团队共同开发一个软件的时候,每个人都必须遵守共同的编程规范。否则自身个性的编程规范会对团队中的其他成员阅读代码造成障碍。
3、规范不能强求一律,应该允许很多例外。
反驳
既然是规范,就必须制定清楚、并且每个人都要遵守。比如,在同一项目组应明确规定对接口函数参数的合法性检查应由函数的调用者负责还是由接口函数本身负责。对于模块间接口函数的参数的合法性检查这一问题,往往有两个极端现象,即:要么是调用者和被调用者对参数均不作合法性检查,结果就遗漏了合法性检查这一必要的处理过程,造成问题隐患;要么就是调用者和被调用者均对参数进行合法性检查,这种情况虽不会造成问题,但产生了冗余代码,降低了效率。
《快速软件开发》中指出,一个软件的稳定性往往比其功能更重要,一旦团队成员的代码衔接出现漏洞,软件的不稳定性就会极高,从而影响到整个软件的效果。
4、我擅长制定编码规范,你们听我的就好了。
反驳。
编码规范的目的在于提高整个团队的编码效率,因此除了合理性,应当符合绝大多数成员的编码习惯。如果你使用的编码规范并不是为你的项目专门设计的,它对你的项目也许并不是最佳方案。。同样,这只是语法:非最优并不表示是不好。也许对你的项目来说它不是最理想的,但并不能表明它不值得遵守。不错,对于你的项目,你并没有从中获得该有的好处,但对于一个大型公司来说,它带来的好处是巨大的。除此之外,专门针对某个项目制定编码规范一般效果会更好。一个项目拥有自己的编码风格无可厚非。
二、代码复查
Code Review Checklist
General
- Does the code work? Does it perform its intended function, the logic is correct etc.
1)四则运算表达式生成器基本功能实现
2)在处理中文字符的输入输出上可以采用这种方式:
#include<locale.h>
locale china("chs");//use china character
wifstream exercise(exer);//exer为输入文件名
wstring str;//string -〉wtring 表示按照中文字符格式输入
ifstream answer(answ);//answ为输入文件名
string ans;
exercise.imbue(china);//use locale object
answer.imbue(china);
3)处理输入上欠考虑:当输入的表达式个数为小数时,程序无法正常遇见运行
- Is all the code easily understood?
1)代码结构清晰,分支明确
2)由于分支比较多,如果能够在每个分支的后面进行注释,能够进一步提高代码的可读性
- Does it conform to your agreed coding conventions? These will usually cover location of braces, variable and function names, line length, indentations, formatting, and comments.
1)符合运算符前后加空格、括号对齐等编程习惯
2)对一个函数进行注释时,应当对输入输出进行说明
3)注释措辞可以更加严谨一些
4)函数名、变量名规范易懂
- Is there any redundant(多余的) or duplicate(重复的) code?
1)辗转相除法求最大公因数
int i = ;
while((i <= mole) || (i < deno))
{
if( (mole % i == ) && (deno % i == ) ){
mole = mole / i;
deno = deno / i;
continue;
}
i++;
}
=>
int dce(int a, int b)
{
int c;
if (a>b)
{
while (b != )
{
c = a%b; a = b; b = c;
}
return(a);
}
else
{
while (a != )
{
c = b%a; b = a; a = c;
}
return(b);
} }
- Is the code as modular as possible?
这次项目主要的操作对象是分数,这份代码将分数类的属性及其操作独立开来,代码的模块化程度较强。但我在这里有一点建议,就是分数类尽可能独立成fraction.h和fraction.cpp,这样可以很便利的找到与分数相关的属性和操作,而不需要在source.cpp中反复翻看。
- Can any global variables be replaced?
无全局变量
- Is there any commented out code?
无。个人认为允许保留与调试有关的代码。
- Do loops have a set length and correct termination conditions?
是的。
- Can any of the code be replaced with library functions?
无
- Can any logging or debugging code be removed?
无
Security
- Are all data inputs checked (for the correct type, length, format, and range) and encoded?
while(r < ){
cout<<"数值过小,放过程序员吧,请重新输入"<<endl;
cin>>r;
}
while(r > ){
cout<<"数值过大,放过那些小学生吧,请重新输入"<<endl;
cin>>r;
}
cout<<"请输入将要生成的式子的个数:"<<endl;
cin>>n;
while(n > ){
cout<<"数值过大,放过那些小学生吧,请重新输入"<<endl;
cin>>n;
}
1)考虑到输入处理还是很厉害的,不像我当时的程序只是限制了少量的输入格式,都没有对非法输入进行处理,不过考虑的不够全面
2)生成表达数个数问题可以进行动态数组内存分配或者选择vector<Math>
3)对用户可能输入的小数没有进行处理,导致程序无法识别输入并反馈错误信息
- Where third-party utilities are used, are returning errors being caught?
无
- Are invalid parameter values handled?
按理来说,不论变量的值是否有用,程序员都应当保证在程序运行的过程中任何变量的值都是经过初始化的
Documentation
- Do comments exist and describe the intent of the code?
程序配置有readme,写的比较详细
- Are all functions commented?
部分没有。
- Is any unusual behavior or edge-case handling described?
分类讨论的思路不够严谨
Testing
- Is the code testable? i.e. don’t add too many or hide dependencies, unable to initialize objects, test frameworks can use methods etc.
我对本程序的实现思路进行了梳理:
运算符的个数事实上并不属于本程序需要考虑的因素,并且在计算的过程中出现非法分数,比如负数或分母为零的情况时,只需要重新生成一个分数或 者运算符即可,如果重新生成一个表达式,程序运行的效率将会大大下降。
三、代码复查心得
1、一边运行一边读代码,可以有效提高阅读别人代码的速度
2、在审查代码的过程中,我意识到了自己程序存在的设计缺陷:
为了实现表达式的查重,我在设计中添加有两个栈——
操作数栈:记录操作数的顺序,进行加法和乘法时,总是将较小的数先进
操作符栈:记录运算符的顺序(此处有BUG)
当两个表达式的计算结果+操作数栈+运算符栈相同时,我判定两个表达式相同,然而事实上存在下述情况:
表达式 | 逆波兰式 | 操作数栈 | 运算符栈 |
1*2+1 | 1 2 * 1 + | 1 1 2 | + * |
1+1*2 | 1 2 * 1 + | 1 1 2 | * + |
2+1*1 | 1 1* 2 + | 1 1 2 | * + |
因而除了较小的操作数先进栈之外,所对应的运算符也应当插入栈中的相应位置
代码规范与复审2——个人博客作业week的更多相关文章
- OO第四次博客作业!
oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...
- IEC2017级_1-2班两次博客作业成绩说明
一.pta作业情况 前两次pta的答题情况,同学们“借鉴”情况突出,在点名公示后,第3次pta有明显好转,请同学们对自己要求更严格些. 二.博客作业情况 大多数同学能够按要求完成.第0次博客作业,个别 ...
- [BUAA软工]第一次博客作业---阅读《构建之法》
[BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...
- [BUAA OO]第三次博客作业
OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...
- OO第三次博客作业——规格
OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...
- BUAA_OO_博客作业四
BUAA_OO_博客作业四 1 第四单元两次作业的架构设计 1.1 第13次作业 类图 作业要求:通过实现UmlInteraction这个官方提供的接口,来实现自己的UmlInteraction解 ...
- C语言|博客作业10
问题 回答 C语言 博客作业10 这个作业要求在哪里 作业要求 我在这个课程的目标是 熟练循环语句的用法 这个作业在哪个具体方面帮助我实现目标 pta作业 参考文献 <C语言程序设计> 1 ...
- C博客作业01——分支,顺序结构
C博客作业01--分支,顺序结构 0.展示PTA总分 1本章学习内容 1.1学习内容总结 1)格式化输出函数printf(),scanf(). 它是什么? 对于初学者而言,一开始了解接触它们,只是被硬 ...
- C语言|博客作业12
一.我学到的内容(整理本课程所学,[用思维导图的方式] 二.我的收获(包括我完成的所有作业的链接+收获)不能只有作业链接,没有收获 作业链接 收获 https://edu.cnblogs.com/ca ...
随机推荐
- Win10更换电脑,又不想重装系统的解决方法
问题描述: 在公司因为两年前用的i3的电脑很卡,然后想换i5的电脑,但是又不想重装系统,因为安装的东西太多了,重装很麻烦 Windows to go介绍: Windows To Go是Windows ...
- Head First Android --- Intent
How to create the intentYou create an intent that specifies an action using the following syntax:whe ...
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
今天的总结 ubuntu上彻底卸载MySQL或重新安装 https://www.jianshu.com/p/974b33873bca #查看是否存在mysql服务 service mysql stat ...
- PHP 截取字符串乱码的解决方案
今天遇到一个坑,左右调试坑的我一脸懵逼,当我们对一条字符串进行截取的时候,通常第一个想到的就是substr()函数了,但是如果是中文+数字的字符串的话,这时候使用substr进行截取就会出现乱码的问题 ...
- MySql/Oracle和SQL Server的分页查
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: 1 SELECT 2 * 3 ...
- HTML元素 - input type=hidden
定义 传输关于客户/服务器交互的状态信息. Transmits state information about client/server interaction. 注释 这种输入类型用户无法控制,但 ...
- redis缓存设计
1:缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...
- Lock和Condition在JDK中ArrayBlockingQueue的应用
ArrayBlockingQueue的实现思路简单描述,ArrayBlockingQueue的底对于互斥访问使用的一个锁.细节参考源码take和put方法: import java.util.conc ...
- Yii2.0页面提示消息
适用情况:比如提交一个表单,提交完成之后在页面展示一条提示消息. 控制器里面这样写: 单条消息: \Yii::$app->getSession()->setFlash('error', ' ...
- springcloud单个服务内存使用详情
查看单个进程的服务占用率 [root@insure dev]# ps -aux|grep claimoauth root ? Sl Dec27 : java -jar /opt/dev/claimoa ...