项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE/ |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的课程学习目标 | 进一步完善疫情填报系统,学会githup操作 |
这个作业在哪些方面帮助我实现学习目标 | 在结对过程中对于合作部分得开发 |
结对方学号-姓名 | 201771010127—王艳 |
结对方本次博客作业链接 | https://www.cnblogs.com/JAVA-729/p/12554359.html |
本项目Github的仓库链接地址 | https://github.com/JAVAWY/MyDemo |
1、实验目的与要求
(1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
(2)掌握Github协作开发程序的操作方法。
2、实验内容和步骤
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
a.代码风格规范
代码风格规范:主要是对文字上的规定,看似表面文章,实际上非常重要。代码风格的原则是:简明,易懂,五无二义性。代码规范能够让程序员更好地理解和维护程序:比如缩进、行宽、括号、断行与空白的{}行、分行、命名、下划线问题、大小写问题、注释等的规范。
b.代码设计规范
代码设计规范:牵扯到程序设计、模块之间的关系,设计模式等方方面面,有不少与具体程序设计语言息息相关的内容(如C/C++/Java/C#),但是也有通用的原则,主要讨论通用的原则。有函数、goto、错误处理、如何使用C++中的类等等上的具体规范。
c.代码复审
代码复审:看代码是否在代码规范的框架内正确地解决了问题。代码复审地形式有:自我复审、同伴复审、团队复审。
d.结对编程
结对编程是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。 在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。 结对编程是极端编程的组成部分。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
结对方Github项目仓库链接
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
结对方博客链接
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
结对方Github项目仓库链接
总结:通过运行结对方的项目可以看出,此项目基本实现了基础需求,代码符合设计规范,编程语句比较基础,稍微难一些的地方也都做了注释,可读性强;此外也容易维护,没有出现异常进行处理等问题。
1.概要部分
- 代码能符合需求和规格说明么?
答:能符合需求与规格说明 - 代码设计是否有周全的考虑?
答:不怎么周全,每次有新的想法时就会不断改进。 - 代码可读性如何?
答:代码有注释,简单容易理解。 - 代码容易维护么?
答:比较容易。 - 代码的每一行都执行并检查过了吗?
答:已检查。
2设计规范部分
- 设计是否遵从已知的设计模式或项目中常用的模式?
答:是。 - 有没有硬编码或字符串/数字等存在?
答:部分中有。 - 代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
答:没有依赖。 - 不会影响开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:可以实现,不存在。 - 有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
答:有一些没用的代码,可以清除。
3代码规范部分
- 修改的部分符合代码标准和风格么(详细条文略)?
答:符合代码标准和风格。
4具体代码部分
- 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:根据自己的能力,对对错部分进行了处理,检查了返回值。 - 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:基本没有错误,字符串的长度是字节的长度,以0开始计数。 - 边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
答:通过检查代码和讨论,循环不会出现死循环。 - 有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
答:没有使用。 - 对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
答:基本不会导致资源泄露,没有优化 - 数据结构中是否有无用的元素?
答:检查过后没有
5效能
- 代码的效能(Performance)如何?最坏的情况是怎样的?
答:代码正确,程序运行正常,数据很大时会有一点慢 - 代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
答:有可优化部分,可以正常运行 - 对于系统和网络调用是否会超时?如何处理?
答:没有实现在线填报,没有网络调用超时的情况。
6可读性
- 代码可读性如何?有没有足够的注释?
答:代码可读性较强,重要部分都加了注释
7可测试性
- 码是否需要更新或创建新的单元测试? 还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
答:不需要
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
使用Clone将对方源码下载到本地:
使用Fork功能将对方仓库建立在自己的仓库中以及进行多次commit。
代码复审:使用pull request命令修改实验二内容
任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
1需求分析
武汉发生新型冠状病毒(2019-nCoV)疫情,被证实存在人传人现象后,为组织疫情进一步蔓延,中国政府于2020 年 1 月 23 日对武汉采取了隔离措施,包括北京、上海等 31个省市也相继实施了严格的防控措施,国际国内社会高度关注中国政府采取的高强度防控疫情举措。1 月 30 日晚,世界卫生组织宣布,将新型冠状病毒疫情列为“国际关注的突发公共卫生事件”。中国各地的医疗机构在中央政府的统一调配下,全国各地卫生工作人员正迅速分批次赶往武汉,支援当地卫生系统。大到国家小到个体,在疫情面前我们要做到同心协力,共同抗击病毒。
中国的互联网企业在这次应对疫情当中充分的发挥了互联网在社会治理方面的作用。以腾讯为例,围绕应对疫情的方方面面开发了十一款产品;滴滴还在武汉专门组建了车队,服务于医护人员的通勤;此外,还有互联网公司开发了新型肺炎确诊患者同行程查询工具;抖音有专门的页面,可向用户介绍冠状病毒及其当前状态。该应用程序还添加了特殊的视频效果 ,以为武汉的医务人员和与该病毒作斗争的患者提供支持;中国最受欢迎的即时通讯应用程序微信拥有一个特殊的“发烧诊所”地图,百度在其应用程序上有专门的抗肺炎页面,该页面会实时更新与冠状病毒相关的新闻。中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
我看到支付宝、微信、百度等都可以查看每天疫情的动态数据,还有我们学校要求师生在企业微信上每天上报疫情情况表等,体验到互联网带给了我们的便利,同时也可以看到这些界面的变化,就比如支付宝而言最初只是显示确诊病例,死亡人数,疑似病例和治愈人数,而现在又加了每个省份的现有确以及国外具体情况等等,我们可以体会到系统越来越完善,因此对于每日学生疫情有效信息上报系统也需要完善,所以本次尽自己所能开发一款疫情防控情况每日上报表系统,方便大家使用。
2软件设计说明。
实现的功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)GUI人机交互界面界面;
(5)可以设置闹钟,进行定时填报提醒;
在数据库中创建的三个表 stu_user表 student表 teacher表
3软件实现及核心功能代码展示
其中:
excel包下主要实现数据导出到excel文件中
hiai.dao包下写入学生以及教职工等实体
hiai.model包下声明各个实体的私有变量
hiai.util包下实现数据库的连接以及各二级部门浏览所有信息
hiai.view包下主要是登录界面,以及信息录入,修改,查询等
mail包下实现定时发送QQ邮箱提醒填报信息
view视图层(系统的每个界面的层次)登录LogOnFrm是登录界面,MainFrm是系统主界面 StuTypeFrm是学生界面,stuManageFrm是高级查询删除修改界面、TeacherFrm是教师填报界面,Util层(连接数据库的)Model层创建的student类、teacher类、user类。
mail包下实现定时发送QQ邮箱提醒填报信息、excel包下主要实现数据导出到excel文件中
view是界面相关的类:LogOnFrm(登录界面),MainFrm(系统主界面) StuTypeFrm(学生界面),stuManageFrm(高级查询删除修改界面)、TeacherFrm(教师填报界面)
Model层定义student类,teacher类和user类,这里使用了Generate Constructor using Files、Generate Getters and Setters等方法。
流程图:
核心功能代码展示:
由于上次的实验中只实现了读入excel数据,而在此次试验中实现了导出到excel,才发现其实比较简单,可能上次多点耐心在研究一下也就实现这个功能了。因此贴上这段代码。
// 创建工作表
WritableSheet ws = wwb.createSheet("Test Shee 1", 0);
//查询数据库中所有的数据
List list= StuService.getAllByDb();
//要插入到的Excel表格的行号,默认从0开始
Label labelId= new Label(0, 0, "id");
Label labelName= new Label(1, 0, "name");
Label labelnum= new Label(2, 0, "num");
Label labelphone= new Label(3, 0, "phone");
Label labelacde= new Label(4, 0, "acde");
Label labeltouch= new Label(5, 0, "touch");
Label labelhealth= new Label(6, 0, "health");
Label labellocate= new Label(7, 0, "locate");
Label labelother= new Label(8, 0, "other");
ws.addCell(labelId);
ws.addCell(labelName);
ws.addCell(labelnum);
ws.addCell(labelphone);
ws.addCell(labelacde);
ws.addCell(labeltouch);
ws.addCell(labelhealth);
ws.addCell(labellocate);
ws.addCell(labelother);
for (int i = 0; i < list.size(); i++) {
Label labelId_i= new Label(0, i+1, list.get(i).getId()+"");
Label labelName_i= new Label(1, i+1, list.get(i).getName());
Label labelnum_i= new Label(2, i+1, list.get(i).getnum());
Label labelphone_i= new Label(3, i+1, list.get(i).getphone()+"");
Label labelacde_i= new Label(4, i+1, list.get(i).getacde());
Label labeltouch_i= new Label(5, i+1, list.get(i).gettouch());
Label labelhealth_i= new Label(6, i+1, list.get(i).gethealth());
Label labellocate_i= new Label(7, i+1, list.get(i).getlocate());
Label labelother_i= new Label(8, i+1, list.get(i).getother());
ws.addCell(labelId_i);
ws.addCell(labelName_i);
ws.addCell(labelnum_i);
ws.addCell(labelphone_i);
ws.addCell(labelacde_i);
ws.addCell(labeltouch_i);
ws.addCell(labelhealth_i);
ws.addCell(labellocate_i);
ws.addCell(labelother_i);
}
//写进文档
wwb.write();
// 关闭Excel工作簿对象
System.out.println("数据导出成功!");
wwb.close();
4程序运行:程序运行时每个功能界面截图。
输入基本信息,登录
登录成功跳转主系统界面
学生填报,提交成功
后台数据库中查看
在疫情管理信息里就是二级人员可以进行管理的,可根据最右边的上下移动可以浏览所有人的填报的情况
按照学号可进行查看学生的填报情况
如果有需要修改的可以进行修改,修改之后可以相应的查看修改的情况。比如之前是小名,学院也只写了算。
将小名修改为小明,学院修改为计工院,其他的也可相应改变
删除操作,由于之前我自己的信息输入教多,现将我的信息删除掉,保留一个,删除前。
删除后,查询后下面的信息栏里就删掉了
还弄了疫情填报指南,里面的内容提醒大家做好个人防护
查看目前统计情况
填报人数统计:
感染人数统计:
数据导出到excel中
通过QQ邮箱发送信息提醒进行填报
5描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图
6提供此次结对作业的PSP。
PSP | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间 |
---|---|---|---|
Planning | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 30 |
Deveploment | 开发 | 1620 | 1620 |
Analysis | 需求分析 (包括学习新技术) | 60 | 90 |
Design Spec | 生成设计文档 | 30 | 35 |
Design Review | 设计复审 | 150 | 130 |
Coding Standard | 代码规范(和同事审核设计文档) | 20 | 20 |
Design | 具体设计 | 150 | 130 |
Coding | 具体编码 | 1000 | 1600 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 80 | 100 |
Reporting | 报告 | 110 | 210 |
Test Report | 测试报告 | 30 | 40 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 35 | 35 |
7小结感受:
通过这次结对合作,就我个人来说,确实是两人合作真的能够带来1+1>2的效果,因为两个人的讨论探究可以进一步完善之前的项目,一个人做的话,不仅时间长而且还效率低。我们这次是分工,然后一起探讨着做的,我不足的地方是我结对方帮我解决问题,我们两相互学习,互相分享自己的想法和讨论如何做才能更好的完成本次项目。不得不承认,每个人在各自独立设计中,不免要犯各种错误,在结对项目过程中,因为随时的探讨和交流,每个人都有强项,恰恰与木桶效应相反,最后的结果是各方面两个人的最高水平,这样错误减少了,效率也就提高了。相比上次一个人的项目,本次结对项目就节省了很多时间,也学到了结对方的一些擅长的部分,从而有所进步。