项目 |
内容 |
课程班级博客链接 |
https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
这个作业要求链接 |
https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的课程学习目标 |
进一步熟悉github的使用;体会结对编程的优缺点 |
这个作业在哪些方面帮助我实现学习目标 |
软件开发能力、合作能力以及学习工具的使用能力等方面 |
结对方学号-姓名 |
201771010128-王玉兰 |
结对方本次博客作业链接 |
https://www.cnblogs.com/wang963/p/12573855.html |
本项目Github的仓库链接地址 |
https://github.com/JAVAWY/MyDemo |
- 任务一:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
(1)代码风格规范
代码风格规范有三个原则:简明、易读以及无二义性。主要是指在编写代码时,要注意缩进、行宽、括号以及命名等方面,有时候看似简单的一个数字甚至下划线,可能会在代码中产生别的意思甚至造成程序产生错误等情况。
(2)代码设计规范
代码设计规范牵涉到程序设计、模块之前的关系、设计模式等的方方面面,是指在编写程序时,要遵循一定的规则,尽量避免程序被多人使用时产生的错误。
(3)代码复审
代码复审不是单纯的把代码拿给别人看看就可以,而是要去看这个代码是否在规范的框架内正确的解决了问题。代码复审有三种形式:自我复审、同伴复审以及团队复审。而软件工程中最基本的复审手段,就是同伴复审。通过代码复审,可以发现我们在编写程序的过程中自己没有发现的错误,同时也可以让更多的成员熟悉各个部分的代码以及和应用领域相关的实际知识。
(4)结对编程
结对编程是指一对程序员一起进行分析设计,一起编码,一起做单元测试、集成测试以及一起写文档等。结对编程中的两个人分别扮演驾驶员和领航员两种角色,但这两种角色可以互换。通过结对编程,可以使得项目的质量得到一定程度的提升,使两人在 互相交流经验和分享知识的过程中,提出更多的创意,提升自己的水平。
- 任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价;
1.对结对方博文作业进行阅读评论
结对方博客链接。
评论截图:
2.克隆结对方项目源码到本地机器,阅读并测试运行代码
结对方仓库链接。
总结:通过运行结对方的项目可以看出,此项目基本实现了基础需求,界面设计也是比较不错的;代码符合设计规范,编程语句比较基础,稍微难一些的地方也都做了注释,可读性强;此外也容易维护,没有出现异常进行处理等问题。
代码复审:
- 概要部分:
(1)代码符合需求和规格说明么?
答:项目代码基本符合需求与规格。
(2)代码设计是否有周全考虑?
答:比较周全,部分功能与设计相比进行了多次修改。
(3)代码可读性如何?
答:易读。
(4)代码容易维护么?
答:不太容易。
(5)代码的每一行都执行并检查过了吗?
答:基本全部进行了检查。
- 设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式?
答:部分遵从。
(2)有没有硬编码或字符串/数字等存在?
答:存在部分。
(3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)
答:没有依赖,不会影响。
(4)开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:可以实现,不存在。
(5)有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
答:有,已进行清除。
- 代码规范部分
(1)修改的部分符合代码标准和风格么(详细条文略)?
答:部分符合,不符合的已基本进行修改。
- 具体代码部分
(1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:使用抛出异常对错误进行了处理。
(2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:部分存在错误。字符串的长度是字节的长度,以0开始计数。
(3)边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
答:实现了部分功能,基本没有涉及循环。
(4)有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
答:没有。
(5)对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
答:不会导致资源泄漏。
(6)数据结构中是否有无用的元素?
答:有,已进行删除。
- 效能
(1)代码的效能(Performance)如何?最坏的情况是怎样的?
答:程序相对比较简单,可以正常运行。
(2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
答:有。
(3)对于系统和网络调用是否会超时?如何处理?
答:没有实现在线填报,没有网络调用超时的情况。。
- 可读性
代码可读性如何?有没有足够的注释?
答:代码相对比较简单,稍微复杂一些的地方都有详细的注释,基本都能读懂。
- 可测试性
代码是否需要更新或创建新的单元测试?还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
答:不需要。
3.依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
(1)使用Clone将对方源码下载到本地:
(2)使用Fork功能将对方仓库建立在自己的仓库中以及进行多次commit。
(3)代码复审:使用pull request命令修改实验二内容
- 任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
- 需求分析陈述。
2019年12月以来,湖北省武汉市持续开展流感及相关疾病监测,发现多起病毒性肺炎病例,均诊断为病毒性肺炎/肺部感染,并造成了大规模的疫情。后经研究发现,这次的病毒性肺炎疫情是由2019新型冠状病毒(2019-nCoV)引起的。为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施:2020年1月23日10时起对武汉“封城”,全国31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。随着新型冠状病毒感染的肺炎疫情不断蔓延,放假在家的学生健康状况变成了老师们关心的大问题。为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成,可以对全校师生员工的疫情信息进行采集以及执行相关操作。
- 软件设计说明。
实现的功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)GUI人机交互界面界面;
(5)可以发送QQ邮箱进行定时填报提醒;
- 软件实现及核心功能代码展示:软件包括哪些类,这些类分别负责什么功能,他们之间的关系怎样?类内有哪些重要的方法,关键的方法是否需要画出流程图?
- 软件的实现:
1.数据库:主要包括学生疫情信息表、教职工疫情信息表、登录人员信息表以及各个学院疫情信息表。
表的设计:
(1)user表:录入登录人员信息。id是人员编号;username是姓名;password是工号/学号;is_admin:是否管理员。
(2)student表:学生疫情信息表。id为编号;name是学生姓名;num是学号;phone是联系电话;acde是所在学院;touch:是否接触疫区人员;health:是否有疑似状况;locate:目前所在地;other:备注
(3)teacher表:教职工疫情信息统计表
(4)各学院疫情信息表(例如:计算机学院)
其中,student表是全校学生疫情信息,该表包含各学院疫情信息表中的数据。
2.代码结构:
其中:
-
- excel包下主要实现数据导出到excel文件中
- hiai.dao包下写入学生以及教职工等实体
- hiai.model包下声明各个实体的私有变量
- hiai.util包下实现数据库的连接以及各二级部门浏览所有信息
- hiai.view包下主要是登录界面,以及信息录入,修改,查询等
- mail包下实现定时发送QQ邮箱提醒填报信息
- 流程图
- 核心功能代码展示:
由于上次的实验中只实现了读入excel数据,而在此次试验中实现了导出到excel,才发现其实比较简单,可能上次多点耐心在研究一下也就实现这个功能了。因此贴上这段代码。
// 创建工作表 WritableSheet ws = wwb.createSheet("Test Shee 1", 0); //查询数据库中所有的数据 Listlist= 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();
- 程序运行:程序运行时每个功能界面截图。扩展功能实现可得附加分5分。
程序运行:
-
- 主界面:
-
- 疫情信息填报
已录入到数据库:
-
- 各二级部门浏览本部门人员情况(以计算机学院和外国语学院为例)
计算机学院:
外国语学院:
-
- 查询某人信息
-
- 修改信息
如修改小明的居住地为陇南:
点击修改后,小明的居住地被修改为陇南。如图:
-
- 删除信息
如删除李鑫的信息:
点击删除后,李鑫的信息已被删除。如图:
- 查看目前统计情况
填报人数统计:
感染人数统计:
- 数据导出到excel中
-
- 通过QQ邮箱发送信息提醒进行填报
- 描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图(截图要完整,能够显示结对双方姓名)
由于暂未开学,此次结对在线上进行。首先我们讨论了本项目中需要实现的基本功能和附加功能,有了大致方向后,明确了一下分工,开始了各自的工作。中间过程在经过讨论后,基本完成了此次项目,最后合作进行代码复审。
- 实验三项目提交以及commit记录:
- 提供此次结对作业的PSP。
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
30 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
30 |
Development |
开发 |
1620 |
2180 |
Analysis |
需求分析 (包括学习新技术) |
120 |
120 |
Design Spec |
生成设计文档 |
30 |
35 |
Design Review |
设计复审 (和同事审核设计文档) |
150 |
130 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
60 |
50 |
Design |
具体设计 |
150 |
130 |
Coding |
具体编码 |
1000 |
1600 |
Code Review |
代码复审 |
80 |
80 |
Test |
测试(自我测试,修改代码,提交修改) |
30 |
40 |
Reporting |
报告 |
110 |
210 |
Test Report |
测试报告 |
50 |
130 |
Size Measurement |
计算工作量 |
30 |
30 |
Postmortem & Process Improvement Plan |
事后总结 ,并提出过程改进计划 |
30 |
50 |
- 小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
大二时java课上就进行过两人结对编程的学习方式,当时就感觉会比一个人变成好很多。通过这次实验项目的结对编程,我觉得两人合作确实能够带来1+1>2的效果。首先,我们的编程能力都比较基础,一个人完成这种相对比较大的项目有一定的压力,但是合作完成时,通过两个人互相交流解决问题,明显提高了效率,每个人在编程中做的工作相对减少一些,但是都基本弄明白了自己原本不太懂的地方。在进行代码复审的过程中,对方可以更好地指出自己的问题,而这些问题大多都是自己发现不了的。总之呢,通过这次项目,我觉得相比我独立完成,项目的质量肯定是有了很大程度的提升;我和结对小伙伴在互相交流和讨论的过程中,也有了更多的见解,也在一定程度上提升了自己的水平。