项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2019nwnucs |
这个作业要求链接 | https://edu.cnblogs.com/campus/xbsf/2019nwnucs/homework/12560 |
我的课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)。(2)掌握Github协作开发软件的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 掌握软件项目结对开发流程(以实验二实战训练) |
结对同学 | 201971010233-潘晴 |
项目Github的仓库链接地址 | https://github.com/MJJBQ/software |
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。
- 代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。代码风格的原则是:简明,易读,无二义性
- 代码设计规范:牵扯到程序设计、模块之间的关系、设计模式等。比如针对函数,他的最重要的原则就是:只做一件事,并且要做好。
- 代码复审:看代码是否在代码规范的框架内正确地解决了问题。代码复审的三种形式:自我复审、同伴复审、团队复审。目的是找出代码错误、发现逻辑错误、发现算法错误、发现潜在的错误和回归性错误、发现可能需要改进的地方、传授经验;代码复审后把记录整理出来:更正明显的错误、记录无法很快更正的错误、把所有的错误记在自己的一个“我常犯的错误”表中,作为以后自我复审的第一步。
- 结对编程是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。在结对编程模式下,两个人肩并肩地、平等地、互补地进行开发工作。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
- 对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
- 克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
克隆结对方项目源码到本地机器
代码复审的核查表
项目 | 内容 | |
---|---|---|
概要部分 | 代码符合需求和规格说明么? | 符合 |
代码设计是否考虑周全? | 是 | |
代码可读性如何? | 可读性好 | |
代码容易维护么? | 容易维护 | |
代码的每一行都执行并检查过了吗? | 是 | |
设计规范部分 | 设计是否遵从已知的设计模式或项目中常用的模式? | 是 |
有没有硬编码或字符串/数字等存在? | 否 | |
代码有没有依赖于某一平台,是否会影响将来的移植? | 否 | |
开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以通过调用而不用全部重新实现? | 否 | |
有没有无用的代码可以清除? | 无 | |
代码规范部分 | 修改的部分符合代码标准和风格么? | 符合 |
具体代码部分 | 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 无错误 |
参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 | 无 | |
边界条件是如何处理的?switch语句和default分支是如何处理的?循环有没有可能出现死循环? | 无 | |
有没有使用断言来保证我们认为不变的条件真的得到满足? | 无 | |
对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄露?有没有优化的空间? | 无 | |
数据结构中有没有用不到的元素? | 无 | |
效能 | 代码的效能如何?最坏的情况是怎么样的? | 效能较好 |
代码的效能如何?最坏的情况是怎么样的? | 无 | |
对于系统和网络的调用是否会超时?如何处理? | 否 | |
可读性 | 代码可读性如何?有没有足够的注释? | 可读性较好;有 |
可测试性 | 代码是否需要更新或创建新的单元测试? | 否 |
- 依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
fork:从别人发布的项目上复制一个过来,相当于一个分支;项目复制到自己的个github中,于是本地就有了一个仓库,假设名字为A;
clone: 从自己的github上把fork过来的复制到本地,这样本地就有了一个项目A1;
push:当你在A1中进行修改进行开发后,最后同步到你的github上的仓库中;
pull request:你把自己github中的已经修改的内容申请同步到最初那个开发者的项目中;
对方代码不用修改。
任务3:采用两人结对编程方式,设计开发一款{0-1}KP 实例数据集算法实验平台
3.1需求分析陈述
本项目要求设计开发一款{0-1}KP 实例数据集算法实验平台,该平台具有实例数据读写、示例数据排序、使用不同算法求解0-1背包问题、以及日志记录等功能。除此之外,该平台还必须具备以下要求。
(1){0-1}KP 实例数据集需存储在数据库;
(2)平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据;
(3)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
(4)查阅资料,设计遗传算法求解{0-1}KP,并利用此算法测试要求;
(5)附加功能:除(1)-(4)外的任意有效平台功能实现。
3.2软件设计说明。
本系统采用B/S结构实现,前端采用Web界面实现,后端使用Springboot实现。前端部分由欢迎界面和主界面两个界面构成,主界面由数据展示、散点图绘制、算法求解和日志记录四个部分组成。后盾由控制层、服务层以及Dao经典MVC三层结构组成。
3.3软件实现及核心功能代码展示:
系统前端项目如下图所示,一共包含index.html和home.html两个文件,index.html是欢迎界面文件,页面中主要功能是初始化,当用户点击进入系统按键时,可以访问后端,实现数据初始化操作。home.html是主界面文件,该界面核心代码就是散点图的绘制,实验二中散点图是通过java实现,本次界面的前端是Web界面,所以散点图需要在Web界面绘制,这里使用d3框架实现,核心代码如下:
点击查看代码
function draw() {
var calculateElement = document.getElementById("calculate");
var width = 500;
var height = 490;
var padding = {
left: 30,
right: 30,
top: 30,
bottom: 30
};
var svg = d3.select("#part")
.append("svg")
.attr("width", width)
.attr("height", height);
var xScale = d3.scale.linear()
.domain([0, 1.2 * d3.max(dataset, function(d) {
return d[0];
})])
.range([0, width - padding.left - padding.right]);
var yScale = d3.scale.linear()
.domain([0, 1.2 * d3.max(dataset, function(d) {
return d[1];
})])
.range([height - padding.top - padding.bottom, 0]);
var circle = svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("fill", "black")
.attr("cx", function(d) {
return padding.left + xScale(d[0]); //设置圆心x坐标
})
.attr("cy", function(d) {
console.log(yScale(d[1]));
return yScale(d[1]) + padding.bottom;
//调节y的值 调了好久
//需要与设置的y轴的坐标相对应
})
.attr("r", 5); //半径
//定义x轴
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom"); //坐标轴方向
//定义Y轴
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
//添加X轴
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")")
.call(xAxis);
//添加y轴
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + padding.left + "," + padding.top + ")")
// .attr("transform","translate("+padding.left+(height-padding.bottom-yAxisWidth)+")")
.call(yAxis);
}
系统后端项目如下图所示,后端部分由Demo3Controller、ProduceRepository、ProduceService、Produce、Demo3Utils、DataBean、ResultBean以及SoftwareProjectApplication八个类构成。SoftwareProjectApplication是Springboot项目的启动类,Demo3Controller、ProduceRepository、ProduceService三个类是MVC三层架构的类,Produce是实例数据的实体封装类,DataBean、ResultBean是返回结果的封装类。Demo3Utils是0-1背包问题的求解算法封装类,它里面包含DP、Greedy、Back、GA2以及FileBean五个静态内部类,分别封装动态规划、贪心、回溯、遗传算法和文件读写的业务逻辑功能。除遗传算法,其余功能核心代码上一个实验已经展示过,这里只展示遗传算法核心代码,如下所示:
点击查看代码
public void solve() {
init();
int i;
int k;
// 初始化种群
initGroup();
// 计算初始化种群适应度,Fitness[max]
for (k = 0; k < scale; k++) {
fitness[k] = evaluate(oldPopulation[k]);
// System.out.println(fitness[k]);
}
// 计算初始化种群中各个个体的累积概率,Pi[max]
countRate();
for (t = 0; t < MAX_GEN; t++) {
evolution();
// 将新种群newGroup复制到旧种群oldGroup中,准备下一代进化
for (k = 0; k < scale; k++) {
for (i = 0; i < LL; i++) {
oldPopulation[k][i] = newPopulation[k][i];
}
}
// 计算种群适应度
for (k = 0; k < scale; k++) {
fitness[k] = evaluate(oldPopulation[k]);
}
// 计算种群中各个个体的累积概率
countRate();
}
}
3.4程序运行:
欢迎截面图
主界面
数据展示功能
散点图绘制功能
问题求解和日志记录功能
数据库存储
3.5描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。
提供此次结对作业的PSP。
PSP2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|---|
Planning | 计划 | 1 | 0.5 |
- Estimate | - 估计这个任务需要多少时间,并规划大致工作步骤 | 1 | 0.5 |
Development | 开发 | 30 | 60 |
- Analysis | - 需求分析(包括学习新技术) | 10 | 11 |
- Design Spec | - 生产设计文档 | 1 | 0.5 |
- Design Review | - 设计复审(和同事审核设计文档) | 1 | 2 |
- Coding Standard | 代码规范 | 1 | 1 |
- Design | - 具体设计 | 2 | 5 |
- Coding | - 具体编码 | 8 | 20 |
- Code Review | 代码复审 | 3 | 3 |
- Test | - 测试(自我测试,修改代码,提交修改) | 5 | 8 |
Reporting | 报告 | 3 | 2 |
- Test Report | - 测试报告 | 2 | 1 |
- Size Measurement | - 计算工作量 | 1 | 0.5 |
- Postmortem & Process Improvement Plan | - 事后总结 ,并提出过程改进计划 | 0.5 | 1 |
小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
两人合作能够带来1+1>2的效果。通过本次结对编程作业,我感受到两人结对开发如果制定一个良好的计划,就可以极大的提高开发效率,反之,如果没有计划好,事先没有商议,则会为开发带来极大的困难,另外,交流和讨论时可以采取线上交流的方式,线上交流成本要低很多,而且更加灵活,在本次开发过程中,我们就是因为事先通过在线交流等,明确了每个人的任务以及代码规范,才使得互相看代码时不至于看不懂,还有前后端数据交互的格式的提前制定,也使得前后端对接相对得心应手。