201971010160-谢家俊 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班 |
这个作业要求链接 | 实验三 软件工程结对项目 |
我的课程学习目标 | 1.掌握Github协作开发程序的操作方法; 2.体验软件项目开发中的两人合作,练习结对编程; 3.复习并熟悉PSP流程。 |
这个作业在哪些方面帮助我实现学习目标 | 两人合作练习结对编程、掌握GitHub协作开发程序的操作方法以及运用学习工具 |
结对方学号-姓名 | 201971010101-阿丽米拉 |
结对方本次博客作业链接 | 结对方博客链接 |
项目Github的仓库链接地址 | Github仓库 |
任务一:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。
第3章(软件工程师的成长)的理论和知识点主要有:评价软件工程师水平的主要方法、技能的反面、TSP对个人的要求、软件工程师的思维误区等;第4章(两人合作)的理论和知识点主要有:代码规范、极限编程、两人合作的不同阶段、影响他人的技巧。
- 代码风格规范:
主要是文字上的规定,看似表面文章,实际上非常重要。代码风格的原则是:简明,易读,无二义性。- 缩进:使用4个空格。
- 行宽:可为100字符。
- 括号:在复杂的条件表达式中,用括号清楚地表示逻辑优先级。
- 分行:不要把不同的变量定义在一行上。
- 命名:在变量面前加上有意义的前缀,就可以让程序员一眼看出变量的类型及相应的语义。这就是“匈牙利命名法”的用处。
- 注释:复杂的注释应该放在函数头,注释应只用ASCII字符。
- 下划线问题:下划线用来分隔变量名字中的作用域标注和变量的语义。
- 断行与空白的{ }行: 每个“{”和“}”都独占一行。
- 大小写问题:由多个单词组成的变量名,如果全部都是小写,很不易读,一个简单的解决方案就是用大小写区分它们。
- 代码设计规范:
牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里有不少与具体程序设计语言息息相关的内容(如C/C++/Java/C#),但是也有通用的原则,这里主要讨论通用的原则。- 函数:现代程序设计语言中的绝大部分功能,都在程序的函数(Function, Method)中实现,关于函数最重要的原则是:只做一件事,但是要做好。
- goto:函数最好有单一的出口,为了达到这一目的,可以使用goto。
- 错误处理:
1.参数处理:在DeBug版本中,所有的参数都要验证其正确性。在正式版本中,从外部(用户或别的模块)传递过来的参数要验证其正确性。
2.断言: 如何验证正确性?那就要用Assert(断言)。断言和错误处理是什么关系?当你觉得某事肯定如何,你可以用断言。Assert (p != NULL);然后可以直接使用变量p;如果你认为某事可能会发生,这时就要用错误处理。
- 代码复审:
看代码是否在“代码规范”的框架内正确地解决了问题
名称 | 形式 | 目的 |
---|---|---|
自我复审 | 自己vs.自己 | 用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处 |
同伴复审 | 复审者 vs. 开发者 | 简便易行 |
团队复审 | 团队 vs. 开发者 | 有比较严格的规定和流程,用于关键的代码,以及复审后不再更新的代码。 覆盖率高——有很多双眼睛盯着程序。但是有可能效率不高(全体人员都要到会) |
- 代码复审的目的:
- 找出代码的错误:编码错误,比如一些能碰巧骗过编译器的错误。
- 发现逻辑错误:程序可以编译通过,但是代码的逻辑是错的。
- 发现算法错误:使用的算法不够优化。
- 发现潜在的错误和回归性错误:当前的修改导致以前修复的缺陷又重新出现。
- 发现可能改进的地方。
- 教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。
- 结对编程:
是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作,是极限编程的组成部分。一个人输入代码,称作驾驶员;另一个人负责审查工作,称作观察员(或导航员)。两人常互换角色。在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。
任务二:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
项目 | 内容 |
---|---|
结对方博客链接 | 201971010101-阿丽米拉 |
结对方Github项目仓库链接 | Github |
-
博客评论
从GitHub下载了结对对方的代码:
-
代码核查表
项目部分 | 完成情况 |
---|---|
概要部分 | |
代码能符合需求和规格说明么? | 代码完成了部分需求,代码编写基本规范 |
代码设计是否有周全的考虑? | 否 |
代码的可读性? | 简单易读 |
代码是否容易维护? | 易维护 |
代码的每一行是否都执行并检查过? | 是 |
设计规范部分 | |
设计是否遵从已知的设计模式或项目中常用的模式? | 是 |
有没有硬编码或字符串/数字等存在? | 没有 |
代码有没有依赖于某一平台,是否会影响将来的移植? | 否 |
开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以通过调用而不用全部重新实现? | 否 |
有没有无用的代码可以清除? | 否 |
代码规范部分 | |
修改的部分符合代码标准和风格么? | 符合 |
具体代码部分 | |
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 已处理 |
参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 | 无错误 |
边界条件是如何处理的?switch语句和default分支是如何处理的?循环有没有可能出现死循环? | 没有出现死循环 |
有没有使用断言来保证我们认为不变的条件真的得到满足? | 否 |
数据结构中有没有用不到的元素? | 否 |
效能 | |
代码的效能如何?最坏的情况是怎么样的? | 效能一般 |
代码中,特别是循环中是否有明显可优化的部分? | 有 |
对于系统和网络的调用是否会超时?如何处理? | 否 |
可读性 | |
代码可读性如何?有没有足够的注释? | 代码有较好的可读性,重要代码部分缺少注释 |
可测试性 | |
代码是否需要更新或创建新的单元测试? | 否 |
任务三:采用两人结对编程方式,设计开发一款{0-1}KP 实例数据集算法实验平台,使之具有以下功能
1、平台基础功能:实验二 任务3
- 可正确读入实验数据文件的有效{0-1}KP数据;
- 能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;
- 能够对一组{0-1}KP数据按重量比进行非递增排序;
- 用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
2、{0-1}KP 实例数据集需存储在数据库;
3、平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据;
4、人机交互界面要求为GUI界面(WEB页面、APP页面都可);
5、查阅资料,设计遗传算法求解{0-1}KP,并利用此算法测试要求(3); - 需求分析陈述:
- D{0-1}KP问题可以采用动态规划算法,回溯算法以及遗传算法等多种算法来解决,每一种算法解决D{0-1}KP问题所消耗的时间和空间都有所不同,为了方便用户快速的选择某种算法来解决D{0-1}KP问题并且比较每一种算法执行时所消耗的时间和空间,所以我们试图开发一个D{0-1}KP实例数据集算法实验平台,以便用户能够快速的选择某种算法来解决D{0-1}KP问题并且比较出哪种算法更高效。
- 软件设计说明:
- 在实验二-个人项目的基础上进行开发;
- 人机交互界面通过python来编写GUI界面;
- 将D{0-1}KP实例数据集存储在数据库,在GUI界面可进行数据的查询;
- 输入需要绘制散点图或者需要排序的数据集以及数据项后进行散点图的绘制或者数据的排序;
- 平台动态嵌入有效的{0-1}KP实例求解算法。
- 程序运行:
数据库:
GUI界面:
散点图:(beibao4)
排序:
核心代码展示:
散点图的绘制:
def paint(list11=[],list22=[]):
import numpy as np
import matplotlib.pyplot as plt
plt.scatter(list11,list22)
plt.show()
数据排序:
def sort(list11=[],list22=[]):
win1 = tkinter.Toplevel()
win1.title('数据排序')
win1.geometry('500x300')
sw = win1.winfo_screenwidth()
sh = win1.winfo_screenheight()
win1.geometry('+%d+%d' % ((sw - 500) / 2, (sh - 300) / 2))
list4=[]
for i in range(2,len(list11)+1):
if i%3==0:
list4.append(round(int(list11[i-1])/int(list22[i-1]),3))
list4.sort(reverse=True)
tkinter.messagebox.showinfo("按照性价比的非递增排序",list4)
win1.destroy()
界面的布局:
win = tkinter.Tk()
win.title('D{0-1}背包问题')
win.geometry('500x300')
win.configure(bg='Linen')
sw = win.winfo_screenwidth()
sh = win.winfo_screenheight()
win.geometry('+%d+%d' % ((sw - 500) / 2, (sh - 300) / 2))
l = tkinter.Label(win, text='{0-1}KP实例数据集算法实验平台', font=('华文行楷', 24), fg='black')
l.place(relx=0.5, rely=0.1, anchor='center')
Lname = tkinter.Label(win, text='数据集文件名', font=('华文行楷', 19), fg='black')
Lname.place(relx=0.45, rely=0.3, anchor='center')
nu = tkinter.StringVar()
name = tkinter.Entry(win, textvariable=nu)
name.place(relx=0.51, rely=0.29, width=95)
choose = [('1.进行数据的查询', 1), ('2.绘制数据散点图', 2), ('3.对数据进行排序', 3), ('4.选择算法来求解', 4)]
v = tkinter.IntVar()
v.set(1)
x, y = 0.5, 0.5,
for a, b in choose:
cc = tkinter.Radiobutton(win, text=a, variable=v, value=b, font=('华文行楷', 20), fg='black')
cc.place(relx=x, rely=y, anchor='center')
y += 0.1
b = tkinter.Button(win, text='确定', width=10, height=3, bg='gray', command=secondMain)
b.place(relx=0, rely=1, anchor='sw')
b2 = tkinter.Button(win, text='退出', width=10, height=3, bg='gray', command=win.quit)
b2.place(relx=1, rely=1, anchor='se')
结对过程:
本次作业PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 30 | 25 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 25 |
Development | 开发 | 1120 | 983 |
Analysis | 需求分析 (包括学习新技术) | 310 | 260 |
Design Spec | 生成设计文档 | 90 | 60 |
Design Review | 设计复审 (和同事审核设计文档) | 30 | 25 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 8 |
Design | 具体设计 | 60 | 40 |
Coding | 具体编码 | 500 | 520 |
Code Review | 代码复审 | 60 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 30 |
Reporting | 报告 | 100 | 70 |
Test Report | 测试报告 | 60 | 30 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 30 | 30 |
将项目上传到GitHub上:
总结:
- 通过这次的结对和作完成项目,深切体会到结对的诸多好处,两个人对于问题的分析和理解会更加深入,不会像一个人考虑时那么片面,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。两个人在一起会相互学习,传递经验,取长补短;配合工作能够提高工作效率,结对工作能带来更多的信心。当然在这个过程中当中也遇到了一些问题,有时候两个的时间上会有冲突,这就需要相互协调,也有时候两个人的想法不一致等问题,但是我觉得结对编程利远大于弊。