项目 | 内容 |
---|---|
课程班级博客链接☛ | 班级博客 |
这个作业要求链接☛ | 作业要求 |
我的课程学习目标☛ | 1. 体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
2. 掌握Github协作开发程序的操作方法。 3. 编程练习。 4. 学习遗传算法 5. 数据库的连接 |
这个作业在哪些方面帮助我实现学习目标☛ | 1. 练习了结对编程,两人合作的过程
2.学习了新的算法-遗传算法 3. 使用python进行GUI界面的设计 |
结对方学号-姓名☛ | 201871030113-贾荣娟 |
结对方本次博客作业链接☛ | 贾荣娟-实验三 |
本项目Github的仓库链接地址☛ | 仓库地址 |
实验内容
任务1:
任务要求:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。
任务完成情况:
《现代软件工程—构建之法》的第3章写的是软件工程师的成长,主要内容包括个人能力的衡量与发展,软件工程师的职业发展以及技能的反面。第4章写的是两人合作,主要内容包括代码规范,代码风格规范,代码复审,结对编程以及两人合作的不同阶段和技巧。
代码规范可以分为代码风格规范和代码设计规范两部分。代码风格规范主要是文字上的规定,看似表面文章,实际上非常重要。它的原则是:简明,易读,无二义性。提示:这里谈的风格是一家之言, 如遇争执,关键是要本着“保持简明,让代码更容易读”的原则,看看争执中的代 码规范能否让程序员们更好地理解和维护程序。代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关 系、设计模式等方方面面,这里又有不少内容与具体程序设计语言息息相关(如 C、C++、Java、C#),但是也有通用的原则,这里主要讨论通用的原则。如果只想为了“爽”而写程序,那么可以忽略下面的原则;如果写的程序会被很多人使用,并且还得加班调试自己的程序。
代码复审的正确定义:看代码是否在“代码规范”的框架内正确地解决了问题。
在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并 排坐在一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工 作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做单元测试, 一起做集成测试,一起写文档等。结对编程不是程序开发者独到的发明。
任务2:
任务要求:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价。
任务完成情况:
(1)贾荣娟-实验二
(2)贾荣娟-项目仓库
(3)评论如下:
(4)核查表如下:
A.概要部分:
a.代码符合需求和规格说明么?
答:代码符合需求和规格说明。
b.代码设计是否考虑周全
答:代码设计考虑周全。
c.代码可读性如何?
答:代码可读性较好
d.代码容易维护么?
答:代码容易维护。
e.代码的每一行都执行并检查过了吗?
答:代码的每一行都执行并检查过了。
B.设计规范部分:
a.设计是否遵从已知的设计模式或项目中常用的模式?
答:设计遵从已知的设计模式或项目中常用的模式。
b.有没有硬编码或字符串/数字等存在?
答:存在硬编码
c.代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
答:代码实在win64上进行的编码,不太清楚在win32上能否运行,未进行测试。
d.有没有无用的代码可以清除?
答:基本上没有需要清除的代码。
C.代码规范部分:
答:修改的部分符合代码标准和风格。
D.具体代码部分:
a.有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了 异常?
答:对错误进行了处理,对于调用的外部函数,检查了返回值或处理了异常。
b.数据结构中有没有用不到的元素?
答:数据结构中没有用不到的元素。
D.效能:
a.代码中,特别是循环中是否有明显可优化的部分?
答:代码中,特别是循环中没有明显可优化的部分。
E.可读性:
答:代码没有足够的注释,注释很少,代码可读性较好。
F.可测试性:
答:代码是不需要更新或创建新的单元测试。
(5)结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据:
Fork:
将结对方的项目复制过来,相当于一个分支;项目复制到自己的github中,于是本地就有了和结对方相同命名的仓库。
Clone:
从自己的github上把fork过来的复制到本地,这样本地就有了结对方的项目。
Push:
在本地项目进行修改开发后,最后同步到我的github上的仓库中。
Pull request:
把自己github中的已经修改的内容申请同步到最初那个开发者的项目中并作出比较。由于在push阶段对结对方的代码未作出修改(个人觉得结对方代码无需修改),所以比较结果是两个项目并无差异
任务3:
任务要求:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台。
任务完成情况:
(1)需求分析陈述。
- D{0-1}KP问题可以采用动态规划算法,回溯算法以及遗传算法等多种算法来解决,每一种算法解决D{0-1}KP问题所消耗的时间和空间都有所不同,为了方便用户快速的选择某种算法来解决D{0-1}KP问题并且比较每一种算法执行时所消耗的时间和空间,所以我们试图开发一个D{0-1}KP实例数据集算法实验平台,以便用户能够快速的选择某种算法来解决D{0-1}KP问题并且比较出哪种算法更高效。
(2)软件设计说明。
-
在实验二-个人项目的基础上进行开发;
-
人机交互界面通过python来编写GUI界面;
-
将D{0-1}KP实例数据集存储在数据库,在GUI界面可进行数据的查询;
-
输入需要绘制散点图或者需要排序的数据集以及数据项后进行散点图的绘制或者数据的排序;
-
平台动态嵌入有效的D{0-1}KP实例求解算法,并且可以保存算法实验日志数据;
-
添加遗传算法。在原来个人项目的基础上添加遗传算法,在GUI界面上添加遗传算法的选择按钮。
(3)软件实现及核心功能代码展示。
- 连接数据库
list2=[]#存放重量
list3=[]#存放价值
for i in message1:
str1=i[:-2].split(‘,’)
list1=[]
for j in str1:
list1.append(int(j))
list2.append(list1)
for i in message2:
str1=i[:-2].split(‘,’)
list1=[]
for j in str1:
list1.append(int(j))
list3.append(list1)
for i in range(len(list2)):
for j in range(len(list2[i])):
c.execute('insert into bp (weight,value) values (?,?)',(list2[i][j],list3[i][j]))
ok=0
for i in range(p):
xx1=10(i+1)
ok=3*xx1+ok
xx1=10(p+1)
ok1=3*xx1
c.execute(‘select * from bp limit ?,?’,(ok,ok1))
result=c.fetchall()
list11=[]
list22=[]
for i in range(len(result)):
list11.append(result[i][0])
list22.append(result[i][1])
- 使用数据库进行查询
def find(result=[]):
win1 = tkinter.Toplevel()
win1.title(‘查询数据’)
win1.geometry(‘500×300’)
sw = win1.winfo_screenwidth()
sh = win1.winfo_screenheight()
win1.geometry(‘+%d+%d’ % ((sw – 500) / 2, (sh – 300) / 2))
tkinter.messagebox.showinfo("结果如下",result)
win1.destroy()
- 散点图绘制
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(‘500×300’)
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()
- 算法
for i in range(n+1):
x.append(0)
for i in range(n+1):
f.append([])
for i in range(n+1):
for j in range(c1+1):
f[i].append(0)for i in range(1,n+1):
for j in range(1,c1+1):
if j<int(list11[i]):
f[i][j]=f[i-1][j]
else:
f[i][j]=max(f[i-1][j],f[i-1][j-int(list11[i])]+int(list22[i]));
(4)程序运行。
查询:
排序:
算法:
图:
(5)结对过程(非摆拍)。
(6)此次作业的PSP。
psp2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 60 | 40 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 60 | 40 |
Development | 开发 | 600 | 685 |
Analysis | 需求分析 (包括学习新技术) | 60 | 70 |
Design Spec | 生成设计文档 | 45 | 30 |
Design Review | 设计复审 (和同事审核设计文档) | 15 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 60 | 60 |
Coding | 具体编码 | 300 | 400 |
Code Review | 代码复审 | 60 | 45 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 120 | 105 |
Test Report | 测试报告 | 40 | 40 |
Size Measurement | 计算工作量 | 30 | 20 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 50 | 45 |
(7)小结感受:
通过此次实验,练习了结对编程,体验了两人合作编程的过程。结对编程中最怕的就是两个人各执己见,在我们两个人合作的过程中,两人的意见难免会有不统一的时候,当意见不统一的时候,我们尽量避免各执己见,而是通过商量来达到统一的意见,有时候也会去尝试两个人的想法,比较出谁的想法更优就来采取谁的。事实上,我的结对队友在开发上比我更有经验,在代码编写上我俩各写一部分,她负责数据库的连接,我负责的是GUI界面的编写,GUI的编写相对于数据库的连接来说比较简单,所以我负责的是这部分。对于遗传算法,我们也进行了了解和学习,由于能力有限以及时间关系,关于遗传算法的部分还未做出来。
任务4:
博文已完成。