项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班 |
这个作业要求链接 | 实验三 软件工程结对项目 |
我的课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程 (2)掌握Github协作开发软件的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | (1)通过{0-1}KP问题这一项目,对软件项目结对开发流程进行实战 (2)通过将完成的{0-1}KP问题项目上传至Github,对协作开发软件的操作方法进行掌握 |
结对方学号-姓名 | 201971010110-高杨 |
结对方本次博客作业链接 | |
本项目Github的仓库链接地址 | EX3 |
1.代码风格规范:代码风格的原则是:简明,易读,无二义性。代码风格规范主要涉及以下几个方面的内容:缩进,行宽,括号,断行与空白的{}行,分行,命名,下划线,大小写,以及注释。
2.代码设计规范:函数,goto,错误处理以及如何处理C++中的类。
3.代码复审:看代码是否在“代码规范”的框架内正确地解决了问题。主要有自我复审,团队复审以及同伴复审三种方式。
4.结对编程:两人结对编程,一对程序员肩并肩,平等地,互补地进行开发工作。
项目 | 内容 |
---|---|
结对方 | 高杨(201971010110) |
结对方博客链接 | 201971010110-高杨 实验二 软件工程项目 《0-1背包问题》 |
结对方Github项目仓库链接 | 0-1- |
- 博文结构:
整体结构较为简练,条目清晰,但在排版上存在一定的欠缺。- 博文内容:
总体上完成了要求的内容,以各任务为中心构成行文路线。但对于项目描述的详细程度有所不足,在“模块化”等方面也有一定欠缺。- 博文结构与PSP中“任务内容”列的关系:
博文结构与“内容任务”列并非完全对应。博文结构主要应用“从面至点”的思路,由整体开发思路到详细编码内容。- PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究:
实际完成需要的时间比计划共完成需要的时间更长,作者提到其自身编码能力有所不足,且项目开发过程中换用了一种编程语言,导致了实际时间的增加。
克隆项目,阅读并测试
代码核查表
项目 | 内容 |
---|---|
概要部分 | |
代码符合需求和规格说明么? | 否,并未完成全部功能 |
代码设计是否考虑周全? | 否 |
代码可读性如何? | 较好 |
代码容易维护么? | 易维护 |
代码的每一行都执行并检查过了吗? | 是 |
设计规范部分 | |
设计是否遵从已知的设计模式或项目中常用的模式? | 是 |
有没有硬编码或字符串/数字等存在? | 有 |
代码有没有依赖于某一平台,是否会影响将来的移植? | 对移植影响较小 |
开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以通过调用而不用全部重新实现? | 是,代码中使用了Matplotlib库 |
有没有无用的代码可以清除? | 有 |
代码规范部分 | |
修改的部分符合代码标准和风格么? | 符合 |
具体代码部分 | |
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 已处理 |
参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 | 无错误;字符的长度;从0开始 |
边界条件是如何处理的?switch语句和default分支是如何处理的?循环有没有可能出现死循环? | 前提分析推导边界条件;可能 |
有没有使用断言来保证我们认为不变的条件真的得到满足? | 否 |
对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄露?有没有优化的空间? | 有对应的申请、释放语句;不存在;有 |
数据结构中有没有用不到的元素? | 有 |
效能 | |
代码的效能如何?最坏的情况是怎么样的? | 效能一般;最坏情况下回溯算法将在极长的一段时间无法给出结果 |
代码中,特别是循环中是否有明显可优化的部分? | 有,如动态规划可优化为一维 |
对于系统和网络的调用是否会超时?如何处理? | 否 |
可读性 | |
代码可读性如何?有没有足够的注释? | 没有足够的注释,但代码较为清晰,故可读性较好 |
可测试性 | |
代码是否需要更新或创建新的单元测试? | 是 |
Commits数据:如图所示,帮助结对方完成了散点图绘制的功能。
Forks数据:如图所示,对结对方的项目进行了Fork操作。
项目背景:
{0-1}背包问题:有N件物品和一个容量为M的背包。第i件物品所占空间是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大,对于每件物品,仅有取与不取两个状态。
需求分析:
通过对需求文档进行分析,得到系统有如下模块:
功能设计:
根据需求分析,我绘制了如下的功能设计图(点击以查看大图)。
系统概述:
详细设计及代码展示:
@RequestMapping()
这一标签映射相应的URL。@RequestMapping("/scotPicture/{FileName}") public String SelectAndDraw(@PathVariable String FileName) throws SQLException { JSONArray JObj=new JSONArray(); //以JSON格式返回数据 Connection Conn=JDBCUtil.getConnection(); //连接数据库 Statement Stat=Conn.createStatement(); //获取数据库状态 String Query="SELECT * FROM `knapsack` WHERE `filename`='"+FileName+"'"; ResultSet Res=Stat.executeQuery(Query); //执行查询语句 if (Res.next()) { String[] WeightList=Res.getString("weight").split(" "); //获取数据库对应“weight”列的数据 String[] ValueList=Res.getString("value").split(" "); //获取数据库对应“value”列的数据 for (int i=0;i<WeightList.length;i++) { JSONObject Group = new JSONObject(); Group.put("weight", WeightList[i]); Group.put("value", ValueList[i]); JObj.put(Group); } } JDBCUtil.release(Res,Stat,Conn); //释放 JDBCUtil.recordJournal("选择以绘图","查询操作"); //记录日志 return JObj.toString(); }
\(PageRoute\) 类:
用于映射各前端页面,同样的,使用@RequestMapping()
这一标签映射相应的URL。同时,将进入各页面的信息写入数据库的日志信息。
\(FileUtil\) 类:
用于读取文件内的信息,并将其写入数据库中。该类需要由\(OperateRoute\) 类中的\(Files()\) 函数调用,即用户在上传文件时,该类被调用,将文件存入。详细流程如下图所示。
\(AlgorithmUtil\) 类:
该类包含了动态规划算法、贪心算法以及回溯算法。
\(GeneticUtil\) 类:
该类即遗传算法的实现。
private void RunGenetic() { InitGroup(); //初始化种群 for (int i=0;i<Scale;i++) { Fit[i]=Evaluate(OldPop[i]); //计算初始化种群适应度 } CountProb(); //计算初始化种群中各个个体累计概率 for (int i=0;i<Gen;i++) { Evo(); //选取,交叉,变异 for (int k=0;k<Scale;k++) { for (int j=0;j<CLength;j++) { OldPop[k][j]=NewPop[k][j]; //复制种群,准备下一代进化 } } for (int k=0;k<Scale;k++) { Fit[k]=Evaluate(OldPop[k]); //计算种群适应度 } CountProb(); //计算种群中各个个体累计概率 } }
测试运行:
结对过程记录:
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 8 |
- Estimate | - 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 8 |
Development | 开发 | 783 | 749 |
- Analysis | - 需求分析(包括学习新技术) | 40 | 30 |
- Design Spec | - 生产设计文档 | 20 | 18 |
- Design Review | - 设计复审 | 8 | 6 |
- Coding Standard | - 代码规范 | 15 | 10 |
- Design | - 具体设计 | 40 | 45 |
- Coding | - 具体编码 | 500 | 480 |
- Code Review | - 代码复审 | 40 | 30 |
- Test | - 测试(自我测试,修改代码,提交修改) | 120 | 130 |
Reporting | 报告 | 60 | 58 |
- Test Report | - 测试报告 | 30 | 25 |
- Size Measurement | - 计算工作量 | 10 | 13 |
- Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 30 | 30 |