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中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。

(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的网站技术做出的的需求分析:

  1. 后台要能够从给定的文件中读取出正确的数据并保存到数据库

  2. java后端给前端传递正确的数据,前端根据后端传的数据绘制散点图

  3. java后端实现对自定义数据类型的列表的排序(实现Comparator接口),并向前端传数据

  4. 实现java后台解决D{0-1}背包问题的动态规划和回溯算法

  5. 后台将求解后的数据写入文件并保存,前端展示文件下载阅览

  6. 后台接收用户发送的算法文件并运行,将运行结果保存到文件然后返回前端

  7. 后台编写遗传算法求解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、在结对过程我也看到了自己能力上的缺陷,以前学习的时候重视理论课而疏于实践课,导致和别人在动手实践上面的差距,需要及时的弥补自己。同时算法方面我真是欠缺太多,在面对这样的问题时缺乏思路,因此今后我需要补习算法方面的知识,加强软件课程的学习,在遇到任何问题时都能有一个正确的思路。

原文地址:https://www.cnblogs.com/xiaobeike/p/14630491.html