项目 内容
课程班级博客链接 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章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。

  1. 代码风格规范。主要是文字上的规定,看似表面文章,实际上非常重要。代码风格的原则是:简明,易读,无二义性
  2. 代码设计规范:牵扯到程序设计、模块之间的关系、设计模式等。比如针对函数,他的最重要的原则就是:只做一件事,并且要做好。
  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的效果。通过本次结对编程作业,我感受到两人结对开发如果制定一个良好的计划,就可以极大的提高开发效率,反之,如果没有计划好,事先没有商议,则会为开发带来极大的困难,另外,交流和讨论时可以采取线上交流的方式,线上交流成本要低很多,而且更加灵活,在本次开发过程中,我们就是因为事先通过在线交流等,明确了每个人的任务以及代码规范,才使得互相看代码时不至于看不懂,还有前后端数据交互的格式的提前制定,也使得前后端对接相对得心应手。