个人博客作业Week2(代码规范,代码复审)
Q:是否需要有代码规范
- 首先我们来搞清楚什么是“代码规范”,它和“代码风格”又有什么关系。依据个人的审美角度,我可能更喜欢在函数与函数之间空出一行,可能在命名习惯和代码注释上更加的international,可能在编码的时候我会一直对齐对齐对齐,我可能通过正确的使用空格让整个程序瞬间干净整洁外加利落,而你可能运算符之间没有空格,函数和变量的命名莫名其妙,就连Tab也乱七八糟,这就叫做代码风格。我不喜欢你的不拘小节,你也反感我的斤斤计较,但是你我又不能单方面决定对方的对错,因为两种不同的习惯,两种不同的审美。
- “代码规范”包含“代码风格”,但又不仅仅是“代码风格”。一个函数的返回类型int or bool?一个函数的输出是要通过传入引用的参数,还是通过返回的方式?这些都是在代码格式化之外,又包含于代码规范的其他规范。
- 这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率, 浪费时间的东西?如果你这么想,那么你就大错特错了。在你走入社会之后,你所面对的工程,你需要去实现的软件有多大的几率是自己一个人完成的?团队才是一个工程建设所需要的强有力的基础,对于团队而言,今天由我来编写这段代码,明天就可能需要由你来进行维护,如果我按照自己的风格和规范洋洋洒洒写了1000+行,你在面对这毫无头绪的1000+行时心中难道没有过这样的疑问,“这函数到底是干什么用的?”“这常量怎么用的是小写啊?”……但是如果我们在团队中统一要求对规范进行了规定,知道常量要全大写,那么看到一个全大写的名称时,你第一时间就能反应过来这是个常量。那么你觉得在编程的时候稍微注意一下编程的规范在之后的代码维护中更加轻松和编程时随意在代码维护时却一而再再而三的碰壁,哪一个更浪费时间呢?
- 我是个艺术家,手艺人,我有自己的规范和原则?首先,你把自己称为艺术家、手艺人,这点是非常值得赞扬的,因为你认识到自己辛苦努力换来的成果应该是要当艺术品来看待的可见你对编程工作的认真态度。其次,你有你自己的规范和原则也是无可厚非的,若是没了这些恐怕是要糟糕透顶了。但是,如果你在团队工作中坚持这样的想法,那么这是不可取的。一个团队的工程是属于团队的,团队应该要放在第一位,要时刻顾全大局。如果你在团队中坚持这样的观念,那么你显得格格不入,给人感觉你在宣誓自己的“地盘”一样。若是整个团队中每个人都这样想,一个工程的代码很快就能被分隔出来,队员与队员之间的矛盾就会渐渐展现,这就不能称作一个“团队”。所以,在团队中应该学会忍痛割爱,暂时放一放自己的规范和原则。
- 规范不能强求一律,应该允许很多例外?我赞同这一观点。代码规范不是科学定理,它不是1+1必须等于2,也不是每天太阳东升西落,他是我们自己主观制定的,这就意味着,它更具有灵活性。若你真要拿定义变量时应该用空格对齐这种要求来强制规范,那又有什么必要呢?不对齐的话真的会对我们的理解产生影响吗?所以尽量不要在没有意义的细节上强制要求,只要我们达成共识,例外还是应该有的。
- 我擅长制定编码规范,你们听我的就好了?非常不赞同,这是一种专制的思想,应该极力摒弃。如果有人这样对你说,你肯定会问“凭什么?”。对啊,凭什么,我们都听你一个人的,也不问问我们的意见和想法?这不是专制这是什么?我们一直强调团队的重要性,每个成员的想法不管有用没用,都是极其宝贵的,我们被给予的发表意见的权利是不能被剥夺的,而且团队的编码规范就是应该要最大范围地覆盖全体成员的编码规范,这样才能做到共赢。所以,如果你擅长制定编码规范,那么应该在我们集体讨论之下,由你来做出一个让我们大家都满意的一个共同的规范。
Q:代码复审
- 在代码复审之前,我要表达一下欣慰之情。首先,因为我能和我认识的小伙伴结对做作业,省去了尴尬、认识、熟悉这些阶段,能够快速的开始任务。其次,在我看了结对伙伴的代码之后,除了发现我俩的编程风格相似之外,我俩的结构设计也很像,所以我认为在读对方的代码时应该完全没有问题。以下是我给结对伙伴的代码复审表。
-
General
Does the code work? Does it perform its intended function, the logic is correct etc.
程序正常工作,查重功能没有实现,其他功能都完整实现
Is all the code easily understood?
代码清晰完整,容易理解,个别地方冗余,可以进一步地优化
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?
有一些地方可以简化一下
Is the code as modular as possible?
Generate和Compute两个函数很大,处理了很多过程,这两个函数还可以在模块化一些
Can any global variables be replaced?
全局变量少,一些用来传递的参数可以设置为全局的
Is there any commented out code?
有10行左右被注释掉的代码,应该被删除
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?
是的
Where third-party utilities are used, are returning errors being caught?
在对输入指令进行解析的时候做了catch exception
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?
所有的function都有注释
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?
程序中没有包含unit tests,需要人工测试
Are arrays checked for ‘out-of-bound’ errors?
数据结构多使用Queue,使用中没有遇到out-of-bound问题
Could any test code be replaced with the use of an existing API?
程序中没有包含test code
- 总体来说,我的结对伙伴的程序完成了主要功能,代码清晰易读易理解,还可以进一步的优化。