简易地铁路线规划项目
作业描述
课程 | https://edu.cnblogs.com/campus/gdgy/cse2021/homework/12288 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/cse2021/homework/12288 |
作业目标 | 设计并实现一个论文查重算法,学会使用PSP表格规划任务事件,学会测试代码,学会反思总结,基本掌握一个软件的开发流程 |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 10 | 30 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 120 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
· Design | · 具体设计 | 20 | 60 |
· Coding | · 具体编码 | 720 | 1580 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 60 | 120 |
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
· 合计 | 1135 | 2160 |
二、配置环境
- 使用工具:vscode
- 代码运行环境:node.js(由于学习前端)
三、项目结构
主要执行文件为planning.js
,接口函数文件为func.js
,单元测试文件为argTest.js
、contentTest.js
和finalRoutineTest.js
,性能测试文件为programTest.js
四、地铁路线文件存储说明
地铁路线采取txt
文件存储,一条路线独占一行,有利于js读入文件后通过换行符将文件内容划分为一个数组,数组里是一条条路线,单条路线开头为路线名,开头、站点与站点之间用-
连接,若某站可以换乘,则在其后面添加@所换乘的线路
,之所以不采用文字叙述可换乘是考虑到路线文件要简洁明了,地铁路线文件如下:
- txt文件中路线不能独占一行是受记事本限制,上图中可以看到在vscode中每条路线都独占一行,因此不会出错
五、计算模块接口的设计与实现过程
- 接口有以下五个:
- 把文件内容中的@替换为
*可换乘
:通过replace
方法和正则表达式
进行替换——handleText()
- 查询路线——
searchWay()
- 对通过
BFS
算法得到的最短路径进行处理得到最终的利于查看的路径——finalRoutine()
Station类
,保存一个站点的信息——站点名和所在路线名Graph类
,构造地铁路线无向图,包含广度优先搜索算法BFS
(核心算法)
- 借助工具:
fs
读取文件包
- 实现过程:
依靠planning.js
文件执行,在该文件中调用func.js
中的接口
- 需求1:从命令行中读取地铁文件名参数后通过
handleText()
接口函数得到所有路线(将@替换后的内容) - 需求2:从命令行中读取路线名后通过
searchWay()
接口函数得到所查询路线上的所有站点,并写入从命令行中读取的写入文件名中 - 需求3:从命令行中读取起始终末站点后通过
Station类
以及Graph类
构造地铁路线无向图
最后通过finalRoutine()
处理BFS
得到的最短路径从而得到最终的路径
- 核心算法的实现与分析:
- 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域
- 实现原理:
- 总的来说,
BFS
算法对出发结点的相邻结点开始探索,逐层探索,直至找到那条最短的路径
核心算法代码:
六、性能改进
- 运行正常
- 由于
node.js
偏前端语言,无法采用VS 2017/JProfiler
工具进行性能分析,故采用node.js自身的mocha
框架 进行分析,有关mocha的安装与使用:https://blog.csdn.net/fenger_c/article/details/108107492
- 测试原理:使用
node.js
中的assert
模块,该模块是node.js
的内置模块,主要用于断言。如果表达式不符合预期,就会抛出一个错误,mocha
框架中包含该模块
测试结果如下:
七、单元测试
测试需求1:
测试需求2:
测试需求3:
单元测试环节中测试了以下三个环节:
- 读取命令行参数并进行异常情况处理
- 读取文件并将内容中的换乘信息去除,只显示站点
- 测对
BFS
算法得到的路径的处理
第一个环节测试代码和结果:
第二个环节测试代码和结果:
第三个环节测试部分代码和结果:
八、异常处理说明
- 输入参数个数不正确:
- 输入参数格式不正确:文件后缀不能省略
九、总结
经过这次项目的实践,我更深入地了解了一个软件开发的基本流程,在此过程中也复习巩固了node.js前端知识和es6知识,并且将它用在了实践当中,也学习了BFS
算法,希望做团队项目时在前端页面方面自己能竭尽自己所能,不拖团队后腿