实验二 软件工程个人项目
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
课程学习目标 | 学习掌握个人项目开发流程及GitHub发布软件的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 对个人项目开发流程的熟悉及了解 |
项目的Github仓库链接 | https://github.com/Melody596/First-test |
任务1:陈述学生疫情每日上报子系统使用体验;
- 系统刚开发出来的时候,可能是因为时间紧张的原因在很多方面都存在多多少少的问题,比如最开始的几天系统不稳定,很容易因为堵塞崩溃,而且每天都需要重新输入信息数据,使用的时候很麻烦。后来经过改善之后崩溃的状态少了很多,而且有记忆功能,不需要每次都重新输入数据。但是界面还是略微简陋,而且没有提醒功能,很容易忘记打卡。
任务2:总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。
-
项目开发背景
-
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
参考文献;
1.中国抗击新型冠状病毒:进展和影响[EB/OL].(2020-02-01)/[2020-03-04].
http://cn.chinadaily.com.cn/a/202002/01/WS5e358d1fa3107bb6b579c92b.html -
需求分析
(1)有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息。
(2)设计一个命令行程序, 支持查询某人在某一天的疫情情况,
(3)查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。 -
功能设计
- 第一类开发要求
有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,请设计一个命令行程序, 支持查询某人在某一天的疫情情况, 查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。 - 第二类开发要求
1、系统可采集学生疫情有效信息;
2、系统支持用户在线使用;
3、每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
4、各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
5、学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
- 第一类开发要求
我选择了第一类开发
基本功能
- 存储学校学生/教职工的基本信息
- 查询某人的全部信息
- 修改某人的全部信息
- 将查询数据用柱状图显示
拓展功能
- 将全部数据存入.txt备份文件
- 支持按编号、登记日期排序
设计实现&测试运行
-
(1)存储信息
选择了excel表格进行数据的存储,这个数据表中包括编号,姓名,有无发热症状,是否在武汉,有无与患者接触,登记日期
-
(2)主页面
按实验要求运行程序后显示了命令行程序,支持添加功能,按编号查询,按编号排序,按登记日期排序,生成柱状图功能。
-
(3)录入信息
-
(4)显示全部信息
-
(5)修改人员信息
将人员信息重新录入一遍,有重叠信息系统会提示是否覆盖原本数据。
-
(6)按姓名查找
-
(7)按查询症状排序
- 将所有有发热症状的病人排在前
- 按登记日期将所有病人排序
- 将所有有发热症状的病人排在前
-
(8)生成柱状图
-
(9)存入txt文件备份
-
关键代码片段
try {
InputStream is = new FileInputStream("C://Users//Administrator//Desktop//疫情数据.xls");
Workbook rwb = Workbook.getWorkbook(is);
Sheet rs = rwb.getSheet(0);
rsRows = rs.getRows();
rsCols = rs.getColumns();
String[][] readfile = new String[rsCols][rsRows];
for (int j = 0; j < rsRows; j++)
for (int i = 0; i < rsCols; i++) {
jxl.Cell cell = rs.getCell(i, j);// (列,行)
String str = ((jxl.Cell) cell).getContents();
readfile[i][j] = str;
}
OutputStream os = new FileOutputStream("C://Users//Administrator//Desktop//疫情数据.xls");
WritableWorkbook wwb = Workbook.createWorkbook(os);
// 创建Excel工作表
WritableSheet sheet = wwb.createSheet("testsheet", 0);
// 原表格中数据重新写入
for (int j = 0; j < rsRows; j++)
for (int i = 0; i < rsCols; i++) {
sheet.addCell(new Label(i, j, readfile[i][j]));
}
for (int j = 0; j < rsRows; j++)
if (ID.equals(readfile[1][j])) {
System.out.println(ID + "已存在,请问要覆盖信息吗?(Y/N)");
String answer = s.next();
if (answer.equalsIgnoreCase("N")) {
System.out.println("插入操作已取消,请重新输入操作符:");
// 写入Excel工作表
wwb.write();
// 关闭Excel工作薄对象
wwb.close();
return false;
}
if (answer.equalsIgnoreCase("Y"))
rsRows = j;
}
// 添加insert内容
sheet.addCell(new Label(0, rsRows, name));
sheet.addCell(new Label(1, rsRows, ID));
sheet.addCell(new Label(2, rsRows, situation1));
sheet.addCell(new Label(3, rsRows, situation2));
sheet.addCell(new Label(4, rsRows, situation3));
sheet.addCell(new Label(5, rsRows, situation4));
// 写入Excel工作表
wwb.write();
// 关闭Excel工作薄对象
wwb.close();
// 写入.txt文件备份
PrintWriter pw = new PrintWriter(new FileWriter(
"C://Users//Administrator//Desktop//疫情数据备份.txt"));
for (int j = 0; j < rsRows; j++) {
for (int i = 0; i < rsCols; i++)
pw.print(readfile[i][j] + " ");
pw.println();
}
pw.print(name + " ");
pw.print(ID + " ");
pw.print("是否发热" + " ");
pw.print("是否在武汉" + " ");
pw.print("是否与病患有密切接触" + " ");
pw.print("登记" + " ");
pw.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("======完成======");
return true;
}
}
在main()主函数中完成了最开始的起始界面,并设计了按找输入数据跳转到不同的子函数中。。
insert函数中负责了信息的插入和修改,并创建了excel工作表和txt文件簿,将数据写入。当查询到有重复输入时,会询问是否覆盖原先信息。
serach函数中主要负责根据姓名信息查询本人的全部数据。
list函数中主要负责根据其不同的排序需求,将信息按照对应的顺序排列
sortby函数中完成了list函数中的排序工作,并将结果传回给list
设计小结
- 在这种有多个嵌套的程序中很容易发生因为一个数据的改变而导致其他功能发生故障,有效使用“模块化”原则,可以在很大程度上避免这些问题。在设计时划分为不同的模块,可以降低复杂度,使得在后期的维护中提高其可维护性。
在做项目的过程中遇到了很多问题,在功能实现方面还存在许多不足,某种数据的周/月统计情况没有实现,在数据录入上不够,因此在系统速度的测试上不准确,但是20000条数据我自己可能是实在弄不出来。好久没写Java了有些生疏,而且其中用到的很多东西是之前没有用过的,花费了很多时间和精力重新过了一遍。
PSP展示
PSP2.1 | 内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 30 | 60 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 60 |
Development | 开发 | 600 | 1500 |
Analysis | 需求分析 (包括学习新技术) | 120 | 150 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 (和同学审核设计文档) | / | / |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 240 | 300 |
Coding | 具体编码 | 480 | 900 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 120 | 170 |
Reporting | 报告 | 60 | 90 |
Test Report | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 | 20 |
- 在psp中开发阶段耗时最多,尤其在编码阶段和预期的时间安排差距很大。大部分原因是因为自身能力的不足。
任务三:完成任务2项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中。
总结反思
在这次的项目设计中,项目存在的问题还是很多的,并且认识到自己能力的不足,了解了在项目工程中必须的步骤和过程。在psp中开发阶段耗时最多,尤其在编码阶段和预期的时间安排差距很大。大部分原因是因为自身能力的不足。在以后的项目设计中还是应该勤动手,提高自己的实践能力,在过程中学习知识、掌握知识。