201871030123-癿盼盼 实验三 软件工程结对项目
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的课程学习目标 | 1、理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。 2、学习结对方项目的设计思路。 3、再次练习使用Github的各项部件。 |
这个作业在哪些方面帮助我实现学习目标 | 1、学习结对方的设计思路,并检查自己的不足。 2、再次学习遗传算法求解D{0-1}KP。 3、练习使用数据库。 |
结对方学号-姓名 | 201870020103-崔梦涛 |
结对方本次博客作业链接 | https://www.cnblogs.com/cuimengtao/p/14649866.html |
本项目Github的仓库链接地址 | https://github.com/piepanpan/shiiyan |
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
在第三章中我们知道了代码风格的原则是:简明,易读,无二义性。对于缩进是4个空格,行宽目前是可为100字符。分行时注意不要把多行语句放在一行上。其中对于复杂的注释应该放在函数头,很多函数头的注释都是解释参数的类型等的,如果程序正文已经能够说明参数的类型in/out等,就不要重复!注释也要随着程序的修改而不断更新,一个误导的(Misleading)注释往往比没有注释更糟糕。另外,注释(包括所有源代码)应只用ASCII字符,不要用中文或其他特殊字符。要学习如何去处理处理C++中的类。代码复审的正确定义:看代码是否在“代码规范”的框架内正确地解决了问题。软件工程中最基本的复审手段,就是同伴复审。学习结对编程,结对编程中的角色中有两个角色:
(a)驾驶员(Driver)是控制键盘输入的人。
(b)领航员(Navigator)起到领航、提醒的作用。
- 如何结对编程?
(1)驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
(2)领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖程度;是否需要和如何重构;帮助驾驶员解决具体的技术问题。
(3)驾驶员和领航员不断轮换角色,不宜连续工作超过一小时。领航员要控制时间。
(4)主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。没有“我的代码”、“你的代码”或“她的代码”,只有“我们的代码”。
(5)只有水平上的差距,没有级别上的差异。尽管可能大家的级别资历不同,但不管在分析、设计或编码上,双方都拥有平等的决策权利。
在第四章中我们学习到了各种的团队模式,例如社区模式 (Community Model)、交响乐团模式 (Orchestra)、功能团队模式 (feature team)等。还有敏捷的方法,包括酒后的敏捷,敏捷宣言,敏捷原则。
敏捷开发的原则:
- 尽早并持续地交付有价值的软件以满足顾客需求。
- 敏捷流程欢迎需求的变化, 并利用这种变化来提高用户的竞争优势。
- 经常发布可用的软件,发布间隔可以从几周到几个月,能短则短。
- 业务人员和开发人员在项目开发过程中应该每天共同工作。
- 以有进取心的人为项目核心,充分支持信任他们。
- 无论团队内外,面对面的交流始终是最有效的沟通方式。
- 可用的软件是衡量项目进展的主要指标。
- 敏捷流程应能保持可持续的发展。 领导, 团队和用户应该能按照目前步调持续合作下去。
- 只有不断关注技术和设计才能越来越敏捷。
- 保持简明 - 尽可能简化工作量的技艺 - 极为重要。英文说 maximizing the amount of work not done. 我的理解是 - 任何还没有明确的工作都会花不可知的时间,因此要 maximize, 不要把那些还没有做的工作和正在做的工作混起来。
- 只有能自我管理的团队才能创造优秀的架构, 需求和设计。
- 时时总结如何提高团队效率, 并付诸行动。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
201870020103-崔梦涛
https://www.cnblogs.com/cuimengtao/p/14572133.html
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
- 可正确读入实验数据文件的有效D{0-1}KP数据;
- 将上面的数据写入代码中,得到了如下图所示的散点图,红色代表的是第二组数据——second set of data,蓝色代表的是第一组数据——first set of data
1.概要部分
(1)代码能符合需求和规格说明么?
答:代码符合读出文件中的具体数据和画出散列图。
(2)代码可读性如何?
答:代码可读较还行,可以看懂。
(3)代码容易维护么?
答:代码容易维护。
(4)代码的每一行都执行并检查过了吗?
答:每一行都执行并检查过了,没有出现错误。
2.设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式?
答:设计大部分内容遵从已知的设计模式,但有一小部分还没有见过。
(2)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
答:对于Win32到Win64这部分是没有影响的。
(3)开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:绝大部分可以实现,但是有一部分因为自己电脑的没有导入相应的包,运行时会报错,当导入成功后就可以成功运行了。
(4)有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
答:没有无用的代码可以清除。
3.代码规范部分
(1)修改的部分符合代码标准和风格么(详细条文略)?
答:符合代码标准和规范。
4.具体代码部分
(1)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:参数传递无错误,字符串的长度是以0开始计数的。
(2)边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
答:没有出现switch语句。
(3)有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
答:没有使用断言(Assert)。
(4)数据结构中是否有无用的元素?
答:数据结构中没有无用的元素。
5.效能
(1)代码的效能(Performance)如何?最坏的情况是怎样的?
答:代码的效能较好。
(2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
答:代码中没有有明显可优化的部分。
(3)对于系统和网络调用是否会超时?如何处理?
答:系统和网络调用不会超时。
6.可读性
代码可读性如何?有没有足够的注释?
答:代码的可读性较好,有足够多的注释。
7.可测试性
代码是否需要更新或创建新的单元测试?
答:代码不需要更新或创建新的单元测试。
任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:
(1)平台基础功能:实验二 任务3;
(2)D{0-1}KP 实例数据集需存储在数据库;
(3)平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
(5)查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
(6)附加功能:除(1)-(5)外的任意有效平台功能实现。
任务4:完成结对项目报告博文作业
-
需求分析陈述。
-
完成实验二的任务三;
-
将D{0-1}KP 实例数据集需存储在数据库;
-
设计的平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
-
设计人机交互界面,要求为GUI界面(WEB页面、APP页面都可);
-
设计遗传算法求解D{0-1}KP,并利用此算法测试要求;
-
- 遗传算法介绍
- 1:编码:问题可以表示为一个n位的二进制码,第i位表示物品i,数值为0表示物品没有选中,1表示选中物品。
- 2:种群:种群是个体的集合
- 3:适应度:适应度在0-1背包问题中表示的是背包中的总价值的大小,总价值越大个体的适应度越大。
- 4:选择:从种群中选出部分个体之后进行重组或交叉,产生的新个体依据适应度函数进行优胜劣汰,选出优良个体。
- 5:交叉:同的个体之间随机的进行杂交,其基因进行再次重组。其后产生新的具有不同适应度的新个体。
- 6:变异:变异指单个个体的基因按照小概率进行变化的方法。本题中采用的变异方法随机产生变异点,并进行了以下两种变异类型。
(1)变异点进行0和1的状态翻转。此方法趋于常规,但无甚缺点。
(2) 变异点变为1,如果超出背包容积,则变为0。此方法更易产生较大的解,但如若初始种群产生的不好,则随后的变异绝不会产生最优解。
-
软件设计说明。
(1)数据结构初始化
(2)种群初始化工作
(3)选择操作
(4)计算适应度函数功能
(5)交叉操作
(6)变异操作
(7)产生随机数功能
(8)最优解记录功能,将进化的每一个种群的最大值与之前产生的最优解进行比较,更大则替换之,否则不替换。 -
软件实现及核心功能代码展示
连接数据库代码如下所示:
import pymssql
connect = pymssql.connect('DESKTOP-2MRTG5S', '', '', 'SCT') #建立连接
if connect:
print("连接成功!")
cursor = connect.cursor() #创建一个游标对象,python里的sql语句都要通过cursor来执行
利用linecache模块进行文件相关内容读取并算出价格:重量比:
profit_weight3
import linecache
the_profit=linecache.getline('idkp1-10.txt',6)#读入价值
the_weight=linecache.getline('idkp1-10.txt',8)#读入重量
the_profit1=the_profit.split(',')
the_weight1=the_weight.split(',')
the_profit1.remove('\n')
the_weight1.remove('\n')
the_profit2=list(map(int,the_profit1))
the_weight2=list(map(int,the_weight1))
profit_weight=[a/b for a,b in zip(the_weight2,the_profit2)]#价格:重量比
profit_weight3=[]
for i in profit_weight:
j=round(i,3)#保留三位小数
profit_weight3.append(j)
print("价值/重量(保留三位小数)排序结果为:")
print(str(profit_weight3)+"\n")
遗传算法重点代码展示:
## 计算比率
def rate(x):
p = [0] * len(x)
s = 0
for i in x:
s += i
for i in range(len(x)):
p[i] = x[i] / s
return p
## 选择
def chose(p, X, m, n):
X1 = X
r = np.random.rand(m)
for i in range(m):
k = 0
for j in range(n):
k = k + p[j]
if r[i] <= k:
X1[i] = X[j]
break
return X1
4. 程序运行:程序运行时每个功能界面截图。
-
平台设计
-
数据库的建立
-
数据插入数据库
-
python与sql server连接需要导入模板pymssql,使用语句:pip install pymssql进行导入,导入后查询模块存在如下所示:
-
运行程序,数据库是否能连接成功,若链接成功则返回信息“连接成功!”:
-
连接成功的返回界面如下所示:
-
描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。
在本次项目中由于两个人都是女生,比较方便在宿舍一起讨论。比如在输入数据库的数据时内容比较大,因此,两个人可以一个读一个输入,加快了效率。
-
提供此次结对作业的PSP。
PSP2.1 | 任务内容 | 计划完成需要 的时间(min) |
实际完成需要 的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少 时间,并规划大致工作步骤 |
10 | 20 |
Development | 开发 | 750 | 1050 |
·· Analysis | 需求分析 (包括学习新技术) | 100 | 40 |
· Design Spec | · 生成设计文档 | 50 | 120 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 50 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 50 |
· Design | 具体设计 | 100 | 120 |
· Coding | 具体编码 | 300 | 500 |
· Code Review | · 代码复审 | 60 | 50 |
· ~~~ Test | · 测试(自我测试,修改代码,提交修改) | 100 | 120 |
Reporting | 报告 | 120 | 150 |
·· Test Report | · 测试报告 | 50 | 60 |
· Size Measurement | 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 | 40 | 50 |
-
小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
我感觉两人合作真的能够带来1+1>2的效果。因为在一组中每个人他都有自己的短板,自己再去挑战这些短板即浪费时间有耗费精力,而另一个人刚好是你的互补,加快了我们的操作效率。并且结对方的思路可以启发自己,两人互相交流想法,加快了项目的完成度,对问题的思考更加完善。其次,对于一个项目一个人完成项目无论是从时间还是从完成度,两个人的效果是大于一个人的。