201871010102-常龙龙 实验三 结对项目一《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST?filter=all |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的课程学习目标 | 1. 熟悉github操作 2. 熟悉springboot+vue网站开发的技术 3.加深对D{0-1}问题的解法的理解 4.熟悉java语言开发程序的一般流程 5.掌握程序设计的模块化开发 6.熟悉PSP流程 7.体验软件项目开发中的两人合作,练习(结对编程) 8.掌握Github协作开发程序的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 1. 更加熟练git的相关操作 2. 熟练markdown编辑器的使用方法 3.温习使用前后端分离技术开发网站的过程 4.学会算法设计的思想 5.学会GitHub协作开发的操作 6.体验到了结对编程的好处 |
结对方学号-姓名 | 201871010111-刘佳华 |
结对方本次博客作业链接 | https://www.cnblogs.com/JerryLau-213/p/14652158.html |
项目Github的仓库链接地址 | 1.后台数据接口: https://github.com/beike666/bag_serve_better 2.前台页面:https://github.com/beike666/bag_client |
博客正文
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念
- 代码风格规范:就是代码格式的一些要求。主要有以下几个方面:
- 缩进
- 行宽
- 括号
- 断行与空白的{}行
- 分行
- 命名
- 下划线
- 大小写
- 注释
- 缩进
代码风格规范的原则是简明、易读、无二异性。
- 代码设计规范:不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面。主要体现在以下几个方面:
-
函数
-
goto
-
错误处理
- 参数处理
- 断言
- 参数处理
-
如何处理C++中的类
- 类
- class vs.struct
- 公共/保护/私有成员(public、protected和private)
- 数据成员
- 虚函数
- 构造函数
- 折构函数
- new和delete
- 运算符(Operators)
- 异常(Exceptions)
- 类型继承(Class Inheritance)
- 类
-
- 代码复审:查看代码是否符合代码规范,找出软件开发过程中的错误,降低软件开发后期维护的难度,提高软件的质量和可靠性。
-
结对编程:结对编程中有两个角色:领航员和驾驶员。在个人编写的过程中,很多人喜欢根据个人喜好来规定代码规范,而且存在的bug自己难以发现,因此,在结对编程时,我们可以互换角色,在开始写代码之前,规定两个人都认可的一套代码规范,并且不间断地进行复审,以减少软件中存在的问题,修复bug,提高软件质量。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
-
结对方博客链接
https://www.cnblogs.com/JerryLau-213/p/14587753.html -
结对方Github项目仓库链接
https://github.com/jerryLau-hua/D-0-1-Problem -
符合(1)要求的博客评论
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
- 克隆结对方项目源码
- 测试运行代码
- 符合(2)要求的代码核查表
项目的开发者:刘佳华
项目的复审者:常龙龙
复审原则 | 内容 |
---|---|
概要部分 | |
代码符合需求和规格说明么? | 代码符合需求 缺少相应的规范说明,参照《码出高效—阿里巴巴开发手册》的代码规范来看,代码是符合规范说明的 |
代码设计是否考虑周全? | 考虑周全 |
代码可读性如何? | 可以顺利读下去 |
代码容易维护么? | 比较容易维护 |
代码的每一行都执行并检查过了吗? | 是的,都可以执行 |
设计规范部分 | |
设计是否遵从已知的设计模式或项目中常用的模式? | 遵从 |
有没有硬编码或字符串/数字等存在? | 没有 |
代码有没有依赖于某一平台,是否会影响将来的移植? | 没有,不会影响移植,任何平台都可以 |
开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现? | 可以用 存在,有些代码是可以调用的 |
有没有无用的代码可以清除? | 没有 |
代码规范部分 | |
修改的部分符合代码标准和风格吗? | 符合,全都按照代码标准修改的 |
具体代码部分 | |
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 使用回溯求解大数据时会出现内存溢出的异常 |
参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度是以0开始计数还是以1开始计数? | 没有 |
边界条件是如何处理的? switch语句的default分支是如何处理的?循环有没有可能出现死循环? | 没有出现死循环 |
有没有使用断言( Assert)来保证我们认为不变的条件真的得到满足? | 没有 |
数据结构中有没有用不到的元素? | 没有 |
效能 | |
代码的效能(Performance)如何?最坏的情况是怎样的? | 达到了具体任务的要求 |
代码中,特别是循环中是否有明显可优化的部分(string的操作是否能用StringBuilder来优化)? | 没有,已经比较优化了 |
对于系统和网络的调用是否会超时?如何处理? | 目前没有出现超时的现象。假如出现了我们会杀毒;整理系统,减少运行的进程,释放内存、cpu,释放c盘空间; |
可读性 | |
代码可读性如何?有没有足够的注释? | 可以顺利阅读 有足够的注释 |
可测试性 | |
代码是否需要更新或创建新的单元测试? | 可以继续开发,测试数据库的复杂性操作 |
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
-
我对结对队友的实验二项目进行了克隆
-
fork:fork是复制、打分支仓库的意思
要Fork一个人的代码仓库,fork操作会复制一份目标仓库(包括文件,提交历史,issues,和其余一些东西),复制后的仓库在你自己的GitHub帐号下,这个操作是在github服务器上完成的,和本地计算机的仓库没有关系。 -
push:将本地仓库中的项目推送到云端
-
Pull request:请求别人pull自己的仓库。
任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:
一、需求分析
在上次实验项目的基础上进行改进,以下是我基于springboot+vue的网站技术做出的的需求分析:
- 后台要能够从给定的文件中读取出正确的数据并保存到数据库
- java后端给前端传递正确的数据,前端根据后端传的数据绘制散点图
- java后端实现对自定义数据类型的列表的排序(实现Comparator接口),并向前端传数据
- 实现java后台解决D{0-1}背包问题的动态规划和回溯算法
- 后台将求解后的数据写入文件并保存,前端展示文件下载阅览
- 后台接收用户发送的算法文件并运行,将运行结果保存到文件然后返回前端
- 后台编写遗传算法求解D{0-1}KP
开发环境
名称 | 版本 |
---|---|
jdk | 1.8.0 |
vue-cli | 3.12.1 |
node.js | 14.15.0 |
git | 2.29.1.windows.1 |
二、功能设计
- D{0-1}KP数据可以保存到数据库,也可以从数据库中清除
- 平台可绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图
- 平台可对任意一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
- 在平台上,用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)
- 在平台上,任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件
- 平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据
- 平台可使用遗传算法求解D{0-1}KP
三、设计实现
1. 主要类
2. 数据库中表的设计
file_data表
volume表
3.关键方法代码
代码测试功能模块中,后台调用命令行运行java代码
//run.bat文件的目录
String publicFilePath=System.getProperty("user.dir")+System.getProperty("file.separator")
+"code";
String batFilePath=publicFilePath+System.getProperty("file.separator")+"run.bat";
//调用cmd窗口的命令
String command = "cmd.exe /c start /b "+batFilePath;
//run.bat文件对象
File file1 = new File(publicFilePath);
Process p;
try {
//执行命令
p = Runtime.getRuntime().exec(command,null,file1);
endTime=System.currentTimeMillis();
//取得命令结果的输出流
InputStream fis=p.getInputStream();
//用一个读输出流类去读
InputStreamReader isr=new InputStreamReader(fis);
//用缓冲器读行
BufferedReader br=new BufferedReader(isr);
String line=null;
//直到读完为止
while((line=br.readLine())!=null) {
//取出运行结果
Judge judge = new Judge();
boolean bool = judge.isNumeric(line);
if(bool){
currentAnswer=line;
break;
}
}
br.close();
isr.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
将数据保存到数据库的代码
for (String profit : result.getProfits()) {
//创建一个数据表对应的类对象
FileData fileData = new FileData();
fileData.setData(profit);
fileData.setType(1);
fileData.setTeam(result.getProfits().indexOf(profit)+1);
fileData.setFile(result.getFileName());
//执行数据库保存操作
fileDataService.save(fileData);
}
四、程序运行
1. 数据存储和数据清空
- 数据库存储
- 数据表的状态
- 数据库清空
- 数据表的状态
2. 散点图绘制
3. 数据排序
4.算法求解
- 动态规划算法
- 回溯算法
5.结果文件存储
- 保存为txt文件
- 查看txt文件
- 保存为execl文件
- 查看execl文件
6.代码测试
- 提交本地算法代码
- 选择数据进行测试
- 查看保存的实验日志数据
- 查看平台提供的示例代码
7.下载遗传算法代码文件,去6进行测试
- 下载遗传算法代码
- 查看下载的遗传算法
- 上传代码进行测试
- 查看测试结果
五、结对编程
-
结对过程描述
1、项目刚开始我们在讨论是使用哪种人机交互界面,最终出于页面效果和开发时间进度方面我们选择javaWeb页面,并且使用Springboot+vue的开发方式(因为在上次项目我就使用的网站开发,这次只需要在上次的基础上进行功能扩展);
2、在项目的具体开展过程中,我们各司其职,我负责网站开发,,刘佳华负责算法设计,网站开发完毕后,刘佳华将项目克隆下来,将算法嵌入到后台代码中,再push上去等等。最终在我们两个人的合作之下,完成了本次项目开发
-
结对编程讨论照片(部分截图)
六、本次项目的PSP
PSP | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
·Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 0.5 | 1 |
Development | 开发 | 36.8 | 38.4 |
·Analysis | 需求分析 (包括学习新技术) | 1 | 1 |
·Design Spec | 生成设计文档和思路 | 1 | 2 |
·Design Review | 设计复审 | 0.5 | 0.6 |
·Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0.3 | 0.3 |
·Design | 具体设计 | 1 | 1 |
·Coding | 具体编码 | 30 | 30 |
·Code Review | 代码复审 | 2 | 2 |
·Test | 测试(自我测试,修改代码,提交修改) | 1 | 1.5 |
Reporting | 博客 | 4 | 8 |
七、GitHub推送记录
- 后台推送
- 前台推送
八、小结感受
1、结对编程有利有弊,但是总的来说是利大于弊的,1+1的效果>2。
2、结对编程也是一次互相学习的过程,在结对的过程中,我们可以互相帮助,分享学习资源,出现问题也可以一起讨论解决,大大加快了项目的开展进度。而且我们分工明确,我负责编写网站,我的结对队友(刘佳华)负责编写算法,我们各司其职,互相交流,一起合作,最终很好的完成了本次项目。
3、在项目开展过程中,我们也会遇到很多的问题,例如网络质量不佳,GitHub官网进不去,克隆项目也会出现网络超时的情况,我们只能下载zip包,在本地运行项目;还有遗传算法求解D{0-1}KP,我们经过查阅资料,最终只做出了遗传算法求解0-1问题,项目在这方面还有所欠缺。
4、在结对过程我也看到了自己能力上的缺陷,以前学习的时候重视理论课而疏于实践课,导致和别人在动手实践上面的差距,需要及时的弥补自己。同时算法方面我真是欠缺太多,在面对这样的问题时缺乏思路,因此今后我需要补习算法方面的知识,加强软件课程的学习,在遇到任何问题时都能有一个正确的思路。