个人作业week3——代码复审

1.     软件工程师的成长

  • 感想

    看了这么多博客,收获颇丰。一方面是对大牛们的计算机之路有了一定的了解,另一方面还是态度最重要,或者说用不用功最重要。这些博客里好些都是九几年或者零几年就开始学习编程了。当时还没有我们现在这么方便的网络环境和计算机环境,他们中大多数人采取的方式都是刷刷刷。有的是刷了几本语言书籍,有的是刷了一本离散数学,还是态度决定一切啊,在这个喧嚣的年代,很少有这样的人了。回想自己的大学生活,大一和大二基本就是混过来的,每天应付应付作业,打打游戏,然后考前突击一下,最后分数一般。虽说专业课的分数还可以,但是这两年我的空闲时间几乎没有学什么东西,写的代码太少了,更是没有钻研的精神。到了大三,软工课要用C++、C#,我都是现学的,这样感觉写出的代码过于匆忙,质量很差。学习方面希望从现在做起吧,在不影响课程的情况下,尽量利用时间多学一些技术。看着大牛们的博客真是觉得无地自容!

  • 计算机之路

    我当时报考计算机的初衷其实主要是因为高中的时候爱打游戏,希望自己以后能从事设计游戏的工作,然后改改程序给自己弄点好装备(羞耻)。

    上了大学之后发现编程和自己想象的还是有一些差距,不过我高中的时候用电脑比较多,用的时候出现一些问题也喜欢自己上网搜然后鼓捣,有时候经常鼓捣一晚上也没弄好。所以对计算机我还是比较了解的,我觉得这也算是自己对计算机的小小热爱吧!于是抱着这份热情,我对编程有关的课还是很感兴趣的,尤其喜欢动手实践(可惜有时候游戏冲昏了我的头脑= =)。

    技术道路的话之前只跟着课程学过C和Java,这学期打算学习C++和C#,写写UI,做做Windows程序和Android程序,如果有可能,想学习写网页。然后在学习的过程中看看自己对什么最感兴趣,未来可以着重发展。

    职业道路和社会道路:我是打算毕业以后先考研,未来先去一家大公司做程序员,然后工作中学习充实自己,可能的话跳个槽,去个自己喜欢的小公司,和它一起成长,我也觉得这种感觉特别好。

2.     代码复审

  • 复审对象

    由于我们组比较特殊,是三人结对编程。所以复审采取循环方式,我复审的是陈彦吉同学的代码。

  • 阅读代码

    陈彦吉同学的代码较短,只有400余行。结构比较清晰,只有四个函数。很快读完后,我对代码进行了初步分析。如下表:

函数

功能

初步审查结果

void setTransPortWeight(string start, string end, int weight,   vector<Station> all)

设置同一个换乘站之间的距离,以此来完成-b或-c的功能,另外起始站点和目标站点换乘站之间距离为0

我觉得这一块的代码耗时太多,做了一个大概的测试,此函数耗时占整个程序的一多半。这里应该可以简化代码。

void cmdhandle(int argc, char *argv[], vector<Station> all)

主要功能一方面是处理命令行参数,调用相关函数。
  另一方面是命令行参数处理完之后,程序会循环等待用户输入,继续完成功能。

对各种错误情况都做了处理,没什么大问题。

void dijkstra(string start, string end, vector<Station> all)

用dijkstra算法求最短路径,将最短路径保存在Station对象中的LastStation属性中,之后调用print()函数

做了错误处理,且考虑了起始站点和目标站点一样的情况,没什么问题。

void print(int destination, int origin, vector<Station> all)

根据起始站点和目标站点以及上一步保存的LastStation,输出最短路径

对循环终止条件判断没问题,之后在输出时对换乘也分情况考虑了。

  • 初步测试

    我对其程序正确性进行了测试。测试数据如下图。经过和百度地图等比对后,程序功能性基本正确。   

      

  • CheckList

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.

1.代码风格基本一致,只是我有时候不用大括号换行,被审人都是大括号换行,不过都可以接受。
  2.变量和函数命名都是匈牙利命名法,行首都是4个空格缩进,被审人的代码格式很漂亮,值得我学习。有一点不同的是我的代码中不同的符号间一般都有空格分隔,被审人只有一部分有。
  3.Line391的注释过长,一行的长度达到了203,需改进。
  4.我与被审人的代码注释习惯不同,我的一般在函数头部,及函数中每一功能块的头部,被审人总体来看注释略少。

Is there any redundant or duplicate code?

我觉得设置换乘站间长度的函数可以被优化,如将所有换乘站保存起来,这样每次修改的时候就不用扫描300+ *   300+了。

Is the code as modular as possible?

模块化做得比较好,如果能将读入地图也模块化就更好了。

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?

正确和错误的输入(包括长度、格式和范围)都可以处理。

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?

暂时不太了解。

  • 结论
  1. 总体来说,陈彦吉同学的代码结构清晰,数据结构简单,算法十分简易,对错误情况的处理也十分全面,值得我好好学习。
  2. 但代码中还是有一些可以优化的地方。下面就一一列出。

    a)setTransPortWeight()函数可以优化,将换乘站点存起来就不需要每次O(n2)的扫描了。

    b)读入地图的部分如果也模块化,main函数就会更为精简,整个程序的可读性也会上升许多。

    c)代码习惯方面,一行最好不要太长,还有就是每个函数或模块前最好写上注释,可读性更强。

  3. 希望我们在结对编程中能互相帮助,共同进步~

posted @ 2016-09-28 20:11  qingchanghan  阅读(163)  评论(0编辑  收藏  举报