201871030122-牛建疆 实验三 结对项目——《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客链接 |
作业要求链接 | 作业要求链接 |
我的课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)。 (2)掌握Github协作开发程序的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)对于算法设计能够再一次学习熟知 (2)对Github的使用更加熟练。 (3)采用两人合作结对编程的方式,提高了学习效率,两人合作学习能力加强。 |
结对方学号-姓名 | 201871030126-王会娟 |
结对方本次博客作业链接 | https://www.cnblogs.com/wanghuijuan815/p/14609588.html |
项目Github的仓库链接地址 | 项目Github的仓库 |
博客正文
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
1.代码风格规范:
- 代码风格的原则是:简明,易读,无二异性。
- 缩进:4个空格
- 行宽:需要限制,可为100字符
- 括号:在复杂的条件表达式中,用括号表示逻辑优先级
- 分行:多行语句需要分行
- 命名:“匈牙利命名法”,能方便程序员看到变量的类型。
- 下划线问题:用来分割变量名字中的作用域标注和变量的语义。
- 大小写问题:变量名由多个单词组成时,为方便区分,可使用大小写区分。
- 注释:解释程序
2.代码设计规范
包括程序设计、模块之间的关系、设计模式等
- 函数:原则是,只做一件事,但是要做好。
- goto:使函数有单一的出口,有助于程序逻辑的清晰体现。
- 错误处理:对已发生和可能发生的错误处理。
- 参数处理:在DeBug版本中,所有参数验证其正确性。在正式版本中,从外部传递过来的参数要验证其正确性。
- 断言:验证正确性
3.代码复审
-
代码复审的定义:看代码是否在“代码规范”的框架内正确地解决了问题。
-
复审的形式:
-
自我复审:自己vs自己。
-
同伴复审:复审中vs开发者(软件工程中最基本的复审方法)。
-
团队复审:团队vs开发者。
-
4.结对编程
-
在结对编程模式下,一对程序员肩并肩地、平等地、互补地进行开发工作。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起写文档等。
-
结对编程中的两个角色:
- 驾驶员:控制键盘输入的人。
- 领航员:起到领航、提醒的作用。
-
结对编程的好处:
-
在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
-
对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
-
在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
-
在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
-
结对编程让两个人所写的代码不断地处于“复审”的过程,可以避免牛仔式的编程。同时,结对编程避免了“我的代码”还是“他的代码”的问题,使得代码的责任不属于某个人,而是属于两个人,进而属于整个团队,这样能够帮助建立集体拥有代码的意识,在一定程度上避免了个人英雄主义。
总之,如果运用得当,结对编程能得到更高的投入产出比。
-
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
具体实现
1、博客评论:
结对方博客:https://www.cnblogs.com/wanghuijuan815/p/14597008.html
结对方Git仓库连接:https://github.com/wang815-hui/jfm
2、代码核查
- 概要部分:
概要部分 | 完成情况 |
---|---|
代码是否符合需求和规格说明 | 代码完成了部分需求,代码比较规范 |
代码设计是否有周全的考虑 | 设计是周全的 |
代码的可读性 | 简单易读 |
代码是否容易维护 | 不易维护 |
代码的每一行是否都执行并检查过 | 是 |
- 设计规范部分:
设计规范部分 | 完成情况 |
---|---|
设计是否遵从已知的设计模式或项目中常用的模式 | 是 |
是否有硬编码或字符串/数字等存在 | 否 |
代码有没有依赖于某一平台,是否会影响将来的移植 | 否 |
开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现 在本项目中是否存在类似的功能可以调用而不用全部重新实现 |
否 |
是否有无用的代码可以清除 | 否 |
- 代码规范部分:
修改的部分符合代码标准和风格
- 具体代码部分:
- 代码可读性:可读性较好。
- 是否有足够的注释:注释较少。
- 代码是否需要更新或创建新的单元测试:不需要,克隆后即可运行。
任务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)外的任意有效平台功能实现。
1.需求分析陈述
在现实生活中,有一类问题需要设计得出最优解,我们通常使用态规划算法、回溯算法求解D{0-1}背包问题来解决这类问题。背包问题是NP Complete问题,它是一个组合优化问题,而D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。在这次作业中,我们在对于背包问题的求解有更近一步的掌握的基础上,对于D{0-1}KP 实例数据集的存储借助了数据库,有利于数据持久化、完整的管理系统统一管理,易于查询,集中管理控制冗余。对于用户方面,采用Web界面设计。
2.软件实现及核心功能代码展示:
import MySQLdb
class MysqlSearch(object):
def __init__(self):
self.get_conn()
# 获取连接
def get_conn(self):
try:
self.conn = MySQLdb.connect(
host='123',
user='root',
passwd='',
db='personnelmanagement',
charset='utf8'
)
except MySQLdb.Error as e:
print('Error: %s' % e)
# 关闭连接
def close_conn(self):
try:
if self.conn:
self.conn.close()
except MySQLdb.Error as e:
print('Error: %s' % e)
#用户界面
def login(self): # 登录事件
username = self.entry01.get()
pwd = self.entry02.get()
if username == '123' and pwd == '123456':
messagebox.showinfo('登录系统', '登录成功')
root1 = Tk()
root1.geometry('400x200+300+400')
root1.title('实验测试')
table = login1(master=root1)
root1.mainloop()
3.程序运行:
4.结对过程
5.此次结对作业的PSP
PSP2.1 | 任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|---|
Planning | 计划 | 30 | 40 |
Estimate | 估计这个任务需要的时间,并规划大致步骤 | 20 | 35 |
Development | 开发 | 735 | |
Analysis | 需求分析 | 20 | 60 |
Design Spec | 生产设计文档 | 15 | 20 |
Design Review | 复审设计文档 | 10 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 50 | 40 |
Design | 代码设计 | 50 | 80 |
Coding | 具体编码 | 500 | 600 |
PSP2.1 | 任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|---|
Coding Review | 代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交代码) | 30 | 40 |
Write | 写博客 | 120 | 180 |
Postmortem | 总结 | 10 | 20 |
小结感受
这次作业在上次作业的基础上难度提升较大,但采用了结对编程的模式,在一定的程度上缓解了压力。我们在完成本次项目的过程中,遇到了很多困难,比如需要重新学习数据库知识、Web技术,以及需要适应结对编程模式,由于我和小伙伴能力原因,未能完成全部实验要求,但在解决上述困难的过程中,也收获了很多知识,在高强度的压力之下,刺激了我们的学习能力。总体来说,结对编程给了我很多信心,体验感良好。我们打算,对于未完成的部分,我们后续将继续努力!