个人作业2——代码规范和代码复审
1.是否需要有代码规范
首先先来解释一下“代码规范”的含义,其可以分为两个部分:代码风格规范和代码设计规范。
代码风格规范是对程序书写上格式的一些规定,如行宽设置为多少,缩进几个空格等,代码风格的原则是:简明,易读,无二义性。
代码设计规范主要涉及到程序设计、模块之间的关系、设计模式等方方面面的通用原则,比如像一个函数应该只做一件事情且最好有单一的出口,用断言来测试程序的正确性等通用的原则。
(1)这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率, 浪费时间的东西。
不赞同。如果你开发的项目完全由你一人来设计编写,那么规范对你来说确实可以是可有可无的。但是这种几率少之又少,我们在进行项目开发时,更多的是作为一个团队中的一员去参与软件的开发,你编写的代码要给其他人审查或者以后别人来维护,倘若按照自己的规范来写程序,数千行的代码在别人眼中有如天书可读性极差,出现诸如“这个变量定义在这里有什么意义?”,“怎么连个注释都没有?”等问题,这其实是拉低了整个团队的开发效率,浪费了大量时间在读懂别人的代码上。所以,制定统一的代码规范就是为了使你编写的代码对于别人来说变得易读易懂,提高团队的开发效率,节省更多的时间。
(2)我是个艺术家,手艺人,我有自己的规范和原则。
不赞同。每个人都可能会有自己的规范和原则,这无可厚非,但是在一个团队中,为了项目的正常进行和团队间合作的高效,你应该有所取舍。如果你独具一帜的代码规范,使别人在看你代码时一头雾水,难以理解的话,你所坚持的风格又有什么意义?再说仅仅把注意性放在代码风格的标新立异上,是不是显得很肤浅呢?
(3)规范不能强求一律,应该允许很多例外。
不赞同。规范即标准,如果可以有很多例外的话,规范的约束作用会被大大削弱,其作用也会大大降低。试想,为了团队的工作效率,我们制定了统一的代码规范,倘若又因为每个人不同的代码习惯而做了种种例外的情况,每个人都有每个人的例外,看别人代码的时候岂不是又变得费事费力了吗?所以我觉得,例外可以有,但是数量绝不能多,而且应该是代码设计规范层面上的,对于代码风格规范,自己克服一下就好了,并不会有多大的影响。
(4)我擅长制定编码规范,你们听我的就好了。
首先,制定的编码规范是一个团队共同遵守的,如果由一人制定可能会出现不认同的情况。其次不能最大程度的包容大家的编程习惯,比如其他人喜欢‘{’,‘}’各占一行,你却喜欢另一种格式,这时是不是应该选择更多人的喜好倾向,因为我们制定的规范就是为了让别人能够易懂你的代码。所以编码规范可以由一个人制定,但之后必须大家一起讨论做出修改或增加,制定出一套适合团队每一个人的规范。
2.代码复审
这次我结对编程的小伙伴是我美若良辰的室友赖彦谕(名字真难打)。下面是我对他个人项目程序的代码复审表:
General |
|
Does the code work? Does it perform its intended function, the logic is correct etc. |
代码能够正常运行,能够在指定的范围内生成指定数量的表达式;查重功能没有实现,根据指定的txt文件进行正误统计功能没有实现。 |
Is all the code easily understood? |
代码结构清晰,在一些必要的位置添加了注释,但是定义的变量名过于随意,如s,ss,sss,使得在理解某些变量的含义上带来了困难。 |
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. |
除了变量的命名应该体现其本身含义这一点和我自己的规范不同外,其余都符合自己的代码规范。 |
Is there any redundant or duplicate code? |
1.在进行中缀表达式计算值的部分,设置了大量if,elseif分支,逻辑过于复杂。修改方案,可以是按照状态机的原理,如读到一个数字后,下一个一定是一个运算符,这种逻辑可以减少if分支的数量。 2.在用于进行分数运算的函数中代码过于繁琐,可以单独封装一个用于求最大公约数的函数gcd,对每次执行的结果执行一次gcd来化简。 |
Is the code as modular as possible? |
只写了一个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? |
输入数据没有检查格式,对于错误输入如-n 1000 -r 0,-n 0.程序正常结束,但是输出的结果txt是错误的。 |
Where third-party utilities are used, are returning errors being caught? |
未使用第三方程序 |
Are output values checked and encoded? |
输出结果的格式正确 |
Are invalid parameter values handled? |
不合法的输入参数未处理,可正常结束,但结果是错的 |
Documentation |
|
Do comments exist and describe the intent of the code? |
没有写文档 |
Are all functions commented? |
没有写文档 |
Is any unusual behavior or edge-case handling described? |
没有写文档 |
Is the use and function of third-party libraries documented? |
没有写文档 |
Are data structures and units of measurement explained? |
没有写文档 |
Is there any incomplete code? If so, should it be removed or flagged with a suitable marker like ‘TODO’? |
没有写文档 |
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. |
代码可以测试。代码的编写是面向过程,所写的每一个函数都可以单独调用进行测试;传入函数的参数值可以进行修改;函数之间没有过多的依赖关系 |
Do tests exist and are they comprehensive? i.e. has at least your agreed on code coverage. |
没有设计测试代码 |
Do unit tests actually test that the code is performing the intended functionality? |
没有设计测试代码 |
Are arrays checked for ‘out-of-bound’ errors? |
没有进行数组越界检查 |
Could any test code be replaced with the use of an existing API? |
没有设计测试代码 |
总结:整体功能并没有完全实现,只实现了随机生成表达式的核心功能部分。程序在中缀表达式计算求值的部分代码量过大,差不多有200行,这部分可以进行一定程度的优化。另外在安全性上,没有对数组越界的情况进行检查和处理,存在一定的风险。