第一次个人项目-地铁出行路线规划程序
源代码地址:https://github.com/qingchanghan/Software-engineering
1)开始实现程序之前,使用下列PSP表格估计将在程序的各个模块的开发上耗费的时间。
PSP 2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
26.5h |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
5h |
· Design Spec |
· 生成设计文档 |
1h |
· Design Review |
· 设计复审 (和同事审核设计文档) |
1h |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
1h |
· Design |
· 具体设计 |
5h |
· Coding |
· 具体编码 |
8h |
· Code Review |
· 代码复审 |
2h |
· Test |
· 测试(自我测试,修改代码,提交修改) |
2h |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
1h |
· Size Measurement |
· 计算工作量 |
0.5h |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
1h |
合计 |
26.5h |
2)实现完程序之后,使用下列PSP表格记录在各个模块上实际花费的时间。
PSP 2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
|
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
4h |
· Design Spec |
· 生成设计文档 |
1h |
· Design Review |
· 设计复审 (和同事审核设计文档) |
1h |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
4h |
· Design |
· 具体设计 |
6h |
· Coding |
· 具体编码 |
12h |
· Code Review |
· 代码复审 |
3h |
· Test |
· 测试(自我测试,修改代码,提交修改) |
3h |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
1h |
· Size Measurement |
· 计算工作量 |
0.5h |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
1h |
合计 |
36.5h |
3)先贴一张性能分析图。
从这张图上可以看出,热路径中transfer2()函数占了85.14%,其中调用transfer3()函数占了80.09%,transfer3()调用自己又占了68.93%。为什么占了这么多呢?原因就是它是一个递归函数。
简单介绍一下我的算法吧,换乘最少的最短路线的算法。设起始点为sta1,目标点为sta2,首先求出sta1可直接到达的站点(即不经过换乘,下面不再重复),计算出sta2可直接到达的站点,看二者有没有交集。若没有,求出sta1必须换乘一次才能到达的站点,再看看有没有交集,重复此过程,直到有交集为止。但是有了交集以后,由于我们要求的是换乘最少的最短路径,所以要从终点回溯,这也就是这个递归函数的由来。正因为有了这个递归函数,程序执行相对较慢。一般换乘2-3次还可以无延迟出结果,4次就得等个几秒钟。
想过改进这个算法,但是一是时间比较紧张,二是也没有想出来好的办法,所以无奈就这样了。
其他的一些地方倒是改进了一点,主要是代码复用来减少了代码量。
4)测试用例
地铁四号线
地铁十号线
地铁机场线
-c 张郭庄 善各庄
-b 张郭庄 善各庄
-c 知春路 东直门
-b 知春路 东直门
-c 沙河 土桥
-b 沙河 土桥
-c 苏庄 俸伯
-b 苏庄 俸伯
-c 安河桥北 亦庄火车站
-b 安河桥北 亦庄火车站
-c 沙河 南锣鼓巷
-b 沙河 南锣鼓巷
这些用例涵盖了地图的大部分线路,也涵盖了几种要求,且结果都和百度地图的结果比对过,应该是正确的。
5)这次项目是第一次,老师当堂布置的任务。当时一看作业要求,必须用C++或C#,整个人都有点懵。好在C++的语法和C几乎一样,陆续花了几个小时,补充了C++的知识。
以前的OO和别的程序,我都是先想一点写一点,然后边写边想边修改。以前这样的方法还好,但是这次完成起来就显得尤为吃力。
所以我觉得以后在写代码之前,一定要认真完成分析和设计的工作,然后再动手写代码,这样的效率才更高。