个人作业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.代码风格基本一致,只是我有时候不用大括号换行,被审人都是大括号换行,不过都可以接受。 |
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? |
暂时不太了解。 |
- 结论
- 总体来说,陈彦吉同学的代码结构清晰,数据结构简单,算法十分简易,对错误情况的处理也十分全面,值得我好好学习。
- 但代码中还是有一些可以优化的地方。下面就一一列出。
a)setTransPortWeight()函数可以优化,将换乘站点存起来就不需要每次O(n2)的扫描了。
b)读入地图的部分如果也模块化,main函数就会更为精简,整个程序的可读性也会上升许多。
c)代码习惯方面,一行最好不要太长,还有就是每个函数或模块前最好写上注释,可读性更强。
3. 希望我们在结对编程中能互相帮助,共同进步~