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:完成结对项目报告博文作业

  1. 需求分析陈述。

    • 完成实验二的任务三;

    • 将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. 软件设计说明。
    (1)数据结构初始化               
    (2)种群初始化工作
    (3)选择操作
    (4)计算适应度函数功能
    (5)交叉操作
    (6)变异操作
    (7)产生随机数功能
    (8)最优解记录功能,将进化的每一个种群的最大值与之前产生的最优解进行比较,更大则替换之,否则不替换。

  2. 软件实现及核心功能代码展示

连接数据库代码如下所示:

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进行导入,导入后查询模块存在如下所示:


  • 运行程序,数据库是否能连接成功,若链接成功则返回信息“连接成功!”:

  • 连接成功的返回界面如下所示:


  1. 描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。
    在本次项目中由于两个人都是女生,比较方便在宿舍一起讨论。比如在输入数据库的数据时内容比较大,因此,两个人可以一个读一个输入,加快了效率。

  2. 提供此次结对作业的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+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。

    我感觉两人合作真的能够带来1+1>2的效果。因为在一组中每个人他都有自己的短板,自己再去挑战这些短板即浪费时间有耗费精力,而另一个人刚好是你的互补,加快了我们的操作效率。并且结对方的思路可以启发自己,两人互相交流想法,加快了项目的完成度,对问题的思考更加完善。其次,对于一个项目一个人完成项目无论是从时间还是从完成度,两个人的效果是大于一个人的。

posted @ 2021-04-14 09:24  winds~  阅读(68)  评论(2编辑  收藏  举报