个人博客作业week2

是否需要有代码规范

这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率, 浪费时间的东西

提倡代码规范的目的之一应该就是提高编程效率。通过一定的规范,使得代码风格不致过于松散自由,便于自己和他人阅读,方便团团队合作和后期维护。应该会提高而非降低效率。

我是个艺术家,手艺人,我有自己的规范和原则

除非个人的规范和原则可以被大多数人接受。如果艺术家的艺术手笔不能被其他人理解,艺术家不能和有效地他人交流的话,艺术的价值也会大打折扣。

规范不能强求一律,应该允许很多例外

规范的意义之一在于提供快捷有效的交流方式。假如个人的规范在某方面不同于大多数人,但是使得程序更高效、易读,那么应该可以被允许。

我擅长制定编码规范,你们听我的就好了

一个团队的编码规范应该有团队成员一起制定,个人的规范很难满足所有成员。除非这个人严格按照通用的规范来指定团队编码规范。

代码复审

General

Does the code work? Does it perform its intended function, the logic is correct etc.

根据第一次作业要求的两个功能,执行下列两个命令:
Myapp.exe -r 15 -n 3000
Myapp.exe -e exercise.txt -a answer.txt
均能正常运行,并生成对应的文件。初步验证代码可以正常工作

Is all the code easily understood?

这位同学的代码写得非常流畅,可以看出他的个人水平比较高。下面的代码,是从一个表示数值的字符串中把数值读取出来。

if(in.find("'",begin) == -1)
    {
        if(in.find("/",begin) == -1)
        {
            fenzi = atoi(in.c_str());
            fenmu = 1;
        }
        else
        {
            end = in.find("/",begin);
            fenziStr = in.substr(begin,end - begin);
            fenzi = atoi(fenziStr.c_str());
            begin = end + 1;
            fenmuStr = in.substr(begin,in.length() - begin);
            fenmu = atoi(fenmuStr.c_str());
        }
    }  

从中可以看出,这位同学非常熟悉库函数。对于string.find(),atoi(),string.substr()等处理字符串的函数使用的频率相当高,也使得程序简洁易读。(不要说这些函数太low,至少我不会用= =#)

然而,当我读到下面这段代码的时候,我彻底崩溃了。

class Formula{
int model,op[3],ui[3],fenshu[3];
public:
void creatFormula(int r){
    int i,a,b;
    model = (int)rand()%3;
    a = (int)rand()%(r+1);
    b = (int)rand()%(r+1);
    while(a == b||b == 0){
        a = (int)rand()%(r+1);
        b = (int)rand()%(r+1);
    }
    fenshu[0] = a/b;
    fenshu[1] = a%b;
    fenshu[2] = b;
    a = fenshu[1];
    b = fenshu[2];
    while(a){
        i = b%a;
        b = a;
        a = i;
    }
    fenshu[1] /= b;
    fenshu[2] /= b;
    for(i = 0;i < 3;i++){
        op[i] = (int)rand()%4;
        ui[i] = (int)rand()%(r+1);
    }
    for(i = 0;i < 2;i++){
        if(op[i] == 1){
            if(ui[i] < ui[i+1])
                op[i] = 0;
        }
        else if(op[i] == 3){
            if(ui[i+1] == 0)
                op[i] = 2;
        }
    }
    if(op[3] == 1)
        if((double)ui[2] > (double)(fenshu[0]+(double)fenshu[1]/fenshu[2]))
            op[3] = 0;
}

(此处省略几百行)对于类中频繁操作的变量model,op[3],ui[3],fenshu[3],定义它们的时候并没有注释表明它们的含义。导致我很难读懂后面的代码。

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.

这位同学的代码排布风格和我很相似。比如:大括号写在旧行的末尾而非新添一行;变量和函数的命名使用驼峰命名法;若英文单词较复杂,则用汉语拼音命名;用tab缩进。
如果能改进的话,希望在函数和循环体之前加一些注释。

Is there any redundant or duplicate code?

该同学有效地避免的代码重复。比如一些常用的功能:从字符串中读取数值,分数的约分,数值间的运算等等。这些都定义了相关函数,通过调用函数,降低了冗余。

Is the code as modular as possible?

是的。 这是除了Main以外所有的函数和类

string zhongToHou(string in); //将中缀表达式转为后缀表达式 
string calculate(string in);//计算后缀表达式的结果
void getGrade(string a,string b); //用a文件中的标准答案判断b文件中算式答案的正误
class Fenshu;//存储一个数值,可以是整数、真分数、带分数。内部包含了数值运算的相关函数
class Formula;

Can any global variables be replaced?

这里没有全局变量……

Is there any commented out code?

也没有……

Do loops have a set length and correct termination conditions?

是的,取下面两个循环为例:

for(i = 0;i < n;i++)
    ……

while(getline(exTxt,stra) && getline(anTxt,strb))
    ……

第一个循环用于生成n个算式,n来自命令行参数;
第二个循环用于判断所给答案的正误。getline从文件中读取一行字符串并存到string变量中。若读到文件为则返回Null。
所以两个循环都有固定长度并能正常地终止。

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?

如果-r后的参数要求大于1,-n后的参数要求大于0小于10000,否则会报错。
如果-e -a后的文件名对应的文件不存在,则会报错。

Where third-party utilities are used, are returning errors being caught?

本次作业没有用到第三方程序

Are output values checked and encoded?

进行了校验。
如果能改进的话,希望在输出随机算式的时候,每行的题号和题目之间加一个空格。

Are invalid parameter values handled?

该同学对命令行参数的处理中,只能识别题目规定的的参数。也就是说,非法的参数得到了有效处理。

Document

关于文档的使用……相信大多数同学都没有做,所以这里不一一回答。

Are all functions commented?

该同学的注释比较详尽,对于主要的函数,基本上都进行了功能描述

Testing

和上面的情况相似,这里并没有提供单元测试。

总结

  这次作业的难度虽高,但尚可接受,所以这位同学的代码质量比较高,程序的功能得到了良好的实现。然而从代码复审中可以看出很多同学的没有写文档和测试代码的习惯。
  我在编写程序之前写了开发文档,通过这种方式能初步确定设计方案,提高编写代码的速度和质量。
  在阅读别人的代码时,注释的作用不可忽视。无论是为了团队效率还是为了后期的维护和修改,我们都有必要在编写代码时添加注释。

你可能感兴趣的:(个人博客作业week2)