项目 | 内容 |
---|---|
课程班级博客要求 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程。 (2)掌握Github协作开发程序的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)练习结对编程,对任务合理划分。 (2)强化了自己在GUI方面的编程技术,并进一步掌握了Github的使用。 |
结对方学号-姓名 | 201771030109-李佩杉 |
结对方本次博客作业链接 | https://www.cnblogs.com/lipeishan/p/12551997.html |
项目GitHub的仓库链接地址 | https://github.com/lipeishan82/EPS |
任务一:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念
-
代码风格规范: 主要是文字上的规定,看似表面文章,实际上很重要。代码风格的原则是:简明,易读,无二义性。代码风格规范主要涉及以下几个方面的内容:缩进,行宽,括号,断行与空白的{}行,分行,命名,下划线,大小写,以及注释。
-
代码设计规范:代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计,模块之间的关系,设计模式等方方面面。具体为以下几个方面:函数,goto,错误处理以及如何处理C++中的类。
-
代码复审:代码复审的正确定义是看代码是否在“代码规范”的框架内正确地解决了问题。主要有自我复审,团队复审以及同伴复审三种方式。代码复审的主要目的:在项目开发时,不管多厉害的开发者都会或多或少地犯一些错误,有欠考虑的地方。而且越是项目后期发现的问题,修复的代价就越大,代码复审正是要在早期发现并修复这些问题,另外,在代码复审时的提问与回应能帮助团队成员相互了解。
-
结对编程:结对编程是指两人结对编程,一对程序员肩并肩,平等地,互补地进行开发工作。
任务二:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
对方博客链接:https://www.cnblogs.com/lipeishan/p/12464106.html#4525293
对方Github项目仓库链接:https://github.com/lipeishan82/-.git
2.1 博客评论:
2.2 代码核查表:
- 概要部分
(1)代码能符合需求和规格说明么?
答:基本符合,就是有些代码可能是因为平台的问题,有些语句显示时有一点问题。
(2)代码设计是否有周全的考虑?
答:在switch语句使用时没有运用Default。
(3)代码可读性如何?
答:可读性很好。对类,方法还有变量都做了相关注释。
(4)代码容易维护么?
答:比较容易 。
(5)代码的每一行都执行并检查过了吗?
答:是的,检查过。
- 设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式?
答:是。
(2)有没有硬编码或字符串/数字等存在?
答:有一部分。
(3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)
答:没有依赖
(4)开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:可以实现,不存在
(5)有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
答:没有。
- 代码规范部分
(1)修改的部分符合代码标准和风格么(详细条文略)?
答:符合代码标准和风格。
- 具体代码部分
(1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:有错误处理,并且处理了异常。
(2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:无错误,字符串的长度是字节的长度,以0开始计数。
(3)边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
答:针对需要的操作进行Switch,在目前代码中没有发现Default。经测试代码不会出现死循环。
(4)有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
答:没有。
(5)对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
答:资源都是在类中申请,在类中释放,对资源都有一定的控制,不会导致资源泄露。
(6)数据结构中是否有无用的元素?
答:没有。
- 效能
(1)代码的效能(Performance)如何?最坏的情况是怎样的?
答:经检查,代码正确,并且功能都已实现,暂无错误。
(2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
答:循环中暂无,但在柱状图的设置部分需要优化。
(3)对于系统和网络调用是否会超时?如何处理?
答:不会超时。
- 可读性
代码可读性如何?有没有足够的注释?
答:代码可读性较好,对类,方法和变量都进行了注释。
- 可测试性
代码是否需要更新或创建新的单元测试?还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
答:希望用较多的数据对代码进行测试。
2.3 依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改
(1)Fork对方仓库到自己的仓库
(2)Clone对方仓库
(3)Pull request(对方已merge)
(4)Merge pull request(合并对方的request)
任务三:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
3.1 需求分析概述
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。在此基础上提供了高级查询,相对的可视化功能,定时功能以及导出到excel表中的功能。
3.2 软件设计说明
- 基本功能:
(1)可以对老师/学生的信息进行采集
(2)二级部门可对所属人员信息进行查看,并支持高级查询,同时还有防疫关键信息的柱状图显示功能
(3)学校防控办指定负责人登录系统,浏览所有人员信息,并且利用高级查询可进行数据组合筛选。在数据可视化的设计上,一方面以扇形图的方式展示各学院已填报和未填报学生统计情况,另一方面以柱状图的形式显示关键疫情数据统计情况,同时也可以根据搜索结果导出查询数据到EXCEL文件
- 扩展功能:
(1)可以实现定时填报提醒,我们将时间设为每天早上9:55提醒,如果超过十点将无法进行信息填报
3.3 软件实现及核心功能代码展示
- 数据存储:
我们根据实际情况设计了如下的四张表:
(1)学生/教师信息表(存放学生/老师填报的信息)
(2)学生/教师登录表(用于存放学生教师的账号以及密码)
(3)二级防控办登录表(也即各个学院的负责人的账号,密码以及所属学院)
(5)防控办登录表(防控办人员的登录账号以及密码)
- 类的设计:
(1)Dbutil:数据库连接类。
(2)FloatUtil、IntUtil、StringUtil:分别用来测试实型数据,整型数据和字符串数据是否为空。
(3)用户类以及用户信息类
Admin:获取防控办的登录账号和密码。
College:获取二级部门的登录账号,密码以及学院,获取学院的目的是判断二级部门属于哪个学院,并为其显示相关信息。
User:获取学生/老师的登录账号和密码。
UserMes:声明关于用户信息的变量,包括姓名(userName),性别(userSex),学院(userCollege),省份(userPro),城市(userCity),当日体温(userTemperature),是否返校(userSrrive),是否疑似(userSympotom),是否确诊(userCheck),填报时间(date),还有num变量来统计人数,status变量来获取填报状态。
(4)进行数据库操作的类:
LogOnDao:登录界面的控制,判断是否登录成功,并且根据登录身份进入相应的界面。
UserDao:实现高级查询,数据录入功能
(5)具体功能实现的类:
PieChart:用饼状图显示各学院填报与未填报情况。
DBtoExcel:将查询数据导入到Excel。
TimeTrigger:在定时提醒功能实现时显示提示信息。
(6)界面相关的类:
LogOn:登录的主界面
Main_user:师生信息采集界面
Main_college:二级防控办界面
Main_admin:防控办登录界面
- 类之间的关系:
在登录界面中调用类LogOnDao中的方法判断是否登录成功,如果登录成功就会根据用户类型转到相关界面;同时也调用了TimeTrigger中的方法实现定时提醒功能,我们将时间设置为每天早上的9:55,如果学生/老师的填报时间超过了早上10点,则无法进入系统。在老师、学生填报疫情信息时将调用UserDao中的相关方法实现,并且在二级部门和防控办实现高级查询时也将会调用UserDao中的方法来实现。在二级部门和防控办实现数据可视化时将会调用ChartTest中的方法来显示柱状图,调用PieChart中的方法显示饼状图,最后防控办实现查询数据导出到Excel文件时将调用DBtoExcel中的方法实现。
- 重要方法:
(1)数据库连接类:与数据库连接的getCon()方法
(2)用户类以及数据库操作类:封装用户属性的get(),set()方法,实现数据添加的userAdd()方法等
(3)具体功能实现类:导出Excel,实现柱状图和饼状图的方法
(4)界面类:从界面部分获取输入并传输到后台进行数据处理的方法
主要代码:
/**
*导出Excel表
*
*@param rs 数据库结果集
*@param filePath 要保存的路径
*@param sheetName 工作簿名称 工作簿名称
*@param columnName 列名,类型为Vector
*/
public void WriteExcel(ResultSet rs, String filePath, String sheetName, Vector columnName) {
WritableWorkbook workbook = null;
WritableSheet sheet = null;
int rowNum = 1; // 从第一行开始写入
try {
// 创建Excel文件
workbook = Workbook.createWorkbook(new File(filePath));
sheet = workbook.createSheet(sheetName, 0);
// 首先将列名写入
this.writeCol(sheet, columnName, 0);
// 将结果集写入
while (rs.next()) {
Vector col = new Vector(); // 用以保存一行数据
for (int i = 1; i <= columnName.size(); i++) {
col.add(rs.getString(i));
}
// 写入Excel
this.writeCol(sheet, col, rowNum++);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭
workbook.write();
workbook.close();
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/***
* 将数组写入工作簿
*
* @param sheet 要写入的工作簿
* @param col 要写入的数据数组
* @param rowNum 要写入哪一行
* @throws WriteException
* @throws RowsExceededException
*/
private void writeCol(WritableSheet sheet, Vector col, int rowNum) throws RowsExceededException, WriteException {
int size = col.size();
for (int i = 0; i < size; i++) {
Label label = new Label(i, rowNum, (String) col.get(i));
sheet.addCell(label);
}
}
3.4 程序运行
(1)登录界面:可根据不同身份进行选择,如果老师/学生超过10点则无法进入并会显示错过打卡时间
提示信息:
(2)用户界面:进行用户信息填报,在每天早上9:55会提醒上报
填报定时提醒:
(3)二级部门:若二级部门登录成功。则会判读改操作者的所在学院,并向其展示该学院的所有填报信息
以计算机学院为例:
简单查询:
高级查询:
关键疫情统计:
若按性别查询,将会出现当前信息中的确诊与未确诊人数的统计情况
若按省份,城市以及其他情况查询将会统计当前确诊的男生和女生的人数
(4)防控办:查看所有疫情信息并进行高级查询
简单查询:
高级查询:
数据导出到Excel:
学院填报情况:
关键疫情统计:
若按性别查询,将会出现当前信息中的确诊与未确诊人数的统计情况
若按省份,城市以及其他情况查询将会统计当前确诊的男生和女生的人数
代码上传到github:
代码交互过程:
3.5 结对过程
在结对编程过程中,由于不能面对面交流,所以我们通过微信和qq来进行交流。
3.6 PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 80 | 120 |
·Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 80 | 120 |
Development | 开发 | 1330 | 1920 |
·Analysis | 需求分析 (包括学习新技术) | 150 | 200 |
·Design Spec | 生成设计文档 | 90 | 130 |
·Design Review | 设计复审 (和同事审核设计文档) | 100 | 160 |
·Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 100 | 120 |
·Design | 具体设计 | 120 | 150 |
·Coding | 具体编码 | 500 | 700 |
·Code Review | 代码复审 | 150 | 210 |
·Test | 测试(自我测试,修改代码,提交修改) | 120 | 250 |
Reporting | 报告 | 100 | 160 |
·Test Report | 测试报告 | 50 | 90 |
·Size Measurement | 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 30 |
3.7 项目总结
在这次项目实现中我们体验了结对编程的方法,对于问题“两人合作真的能够带来1+1>2的效果吗?”,我想说可以。在这次结对编程中,我们对任务进行了明确的划分,首先各自负责自己的部分,随后在交接任务的时候又会对对方的任务进行一个简单的评价。在任务实施过程中,当我们遇到问题时都会及时交流,相互交换想法和经验,并且在双方交换代码后能够及时发现存在的错误并改正,对很多小细节也能做到及时细化,提高了项目的质量和效率。但由于不能面对面交流,有时候会对一些问题产生误解,从而影响任务的完成效果,而且通过结对编程也能看到自己的不足,能够促使自己去学习相关知识来避免项目进度的拖延。在PSP中可以看出我们在编码阶段花费了较多时间,但跟上一次的个人项目相比,这次的项目在质量上提高了很多。总之,通过这次的项目实践,可以深刻的感受到两人合作真的能够带来1+1>2的效果。