实验二《西北师范大学学生疫情上报系统》项目报告
项目 | 内容 |
---|---|
课程班级博客 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)。(2)掌握Github协作开发程序的操作方法。 |
本次在哪些方面帮助我实现学习目标 | 软件开发流程中的结对编程和运用学习工具的方面 |
结对方学号-姓名 | 201771010113-李婷华 |
结对方本次博客作业链接 | https://www.cnblogs.com/litinghua/p/12534838.html |
项目的Github仓库链接 | https://github.com/wyq1998/System-second |
2、实验内容和步骤
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
- 代码的风格规范。代码风格的原则是:简明,易读,无二义性。主要表现在以下几个方面:
- 缩进
- 行宽
- 括号
- 断行与空白的行
- 分行
- 命名
- 下划线
- 大小写
- 注释
- 代码设计规范
- 函数
- goto
- 错误处理
- 如何处理C++类
- 代码复审
- 是软件开发过程中,非常重要的环节
- 结对编程
- 分为驾驶员和领航员的角色
- 如果运用得当,结对编程可以取得更高的投入产出比
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。 项目的开发者:李婷华 项目的复审者:王颖奇
1、概要部分
(1)代码符合需求和规格说明么? 代码符合需求 代码也是符合规范说明的
(2)代码设计是否考虑周全? 考虑周全
(3)代码可读性如何? 可以顺利读下去
(4)代码容易维护么? 比较容易维护
(5)代码的每一行都执行并检查过了吗? 是的,都可以执行
2.设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式? 遵从
(2)有没有硬编码或字符串/数字等存在? 没有
(3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)? 没有,不会影响移植,任何平台都可以
(4)开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现? 可以用 存在,有些代码是可以调用的
(5)有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码) 基本清除完毕了
3.代码规范部分
修改的部分符合代码标准和风格么? 符合,全都按照代码标准修改的
4.具体代码部分
(1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 对错误都进行了处理,没有异常
(2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数? 无错误 本项目中不涉及字符串
(3)边界条件是如何处理的?switch语句的default分支是如何处理的?循环有没有可能出现死循环? switch语句的default分支返回false,没有出现死循环
(4)有没有使用断言(Assert)来保证我们认为不变的条件真的得到满足? 有
(5)对资源的利用是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有优化的空间? 在对数据库进行操作之前申请数据库连接资源,操作完毕之后释放申请的资源 不会导致资源泄露 可以优化使用断言来保证我们认为不变的条件
(6)数据结构中有没有用不到的元素? 没有
5.效能
(1)代码的效能(Performance)如何?最坏的情况如何? 达到了具体任务的要求
(2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)? 没有,已经比较优化了
(3)对于系统和网络调用是否会超时?如何处理? 目前没有出现超时的现象。假如出现了我们会杀毒;整理系统,减少运行的进程,释放内存、cpu,释放c盘空间;
6.可读性
代码可读性如何?有没有足够的注释? 可以顺利读取 代码有足够的注释让我们读懂
7.可测试性
代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。 可以继续开发,摆脱传统的命令行方式,更为实用
总结:项目可以正常运行,需求基本实现,效能也不错;代码符合设计规范,可读性强(虽然注释可能有点少,但是包,类,方法和函数等,分的比较清晰,读起来还是很容易的),也容易维护,看了看github仓库的READ.md部分,对项目的功能,开发工具和代码规范,有清楚的介绍(啊啊啊!我没弄READ.md,需要虚心学习)。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。 Fork操作:
Pull request操作: 我感觉代码没什么要改的,就改了一下描述文件,详细了功能描述的部分:
Merge pull request操作: 已经完成了修改项目的合并
任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
需求分析
2019年12月以来,湖北省武汉市持续开展流感及相关疾病监测,发现多起病毒性肺炎病例,均诊断为病毒性肺炎/肺部感染,并造成了大规模的疫情。后经研究发现,这次的病毒性肺炎疫情是由2019新型冠状病毒(2019-nCoV)引起的。为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施:2020年1月23日10时起对武汉“封城”,全国31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。 此次疫情中,许多互联网企业相继投入到了疫情的防控工作当中,开发了很多与防疫相关的软件,为政府的防疫工作减少了许多的麻烦,有效地降低了疫情在某些生活方面的传播可能。这也放映出了软件产品对于遏制疫情发展起到了重要的作用。同时,虽然已经有很多的软件产品已经投入到了疫情的遏制工作当中,但是这个量还是远远不够的,需求仍然很大,并且仍然有很多领域未涉及到,需要我们不断地探索。
软件设计说明
实现的功能: (1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)GUI人机交互界面界面;
(5)可以设置闹钟,进行定时填报提醒;
软件实现及核心功能代码展示
表的设计: ES表:存放Sno学号(职工号),Sname姓名,Es感染情况,Province学院,Phone联系方式,Utype人员类型(1,2,5:学生,二级防疫部门成员,教职工;3:二级防疫部门负责人;4:防疫办负责人)
users表:存放Uname用户名,Password登录密码和Utype人员类型
- login类
- 登录界面
- 判断登录人员的类型
- 定时提醒
- GetConnection类
- 连接数据库
- Users,CheckUsers类
- 获取用户名,密码和用户类型,并存储到数据集中备用
- DormitoryInfo类
- 功能实现
逻辑结构: 根据(1)(2)(3): 二级防疫部门的成员,学生和教职工只能进行疫情上报 二级防疫部门的负责人可以查看自己部门的疫情上报情况,并进行相应操作 防控办的负责人可以查看上述所有人的情况,并进行相应操作
核心代码:
登录部分,判断人员类型的逻辑代码:
public void actionPerformed(ActionEvent e) {
boolean flag = false;// 用来标志用户是否正确
if (e.getSource() == loginButton) {
ArrayList list = new CheckUsers().getUsers();// 获得所有用户信息
for (int i = 0; i < list.size(); i++) {// 遍历所有用户信息,以此来判断输入的信息是否正确
users = list.get(i);
String passwordStr = new String(passwordField.getPassword());
if (username.getText().equals(users.getName()) && passwordStr.equals(users.getPassword())) {
if (users.getType() == 1) {// 学生
type = users.getType();
JOptionPane.showMessageDialog(null, "欢迎登录(学生)", "疫情信息管理系统", JOptionPane.PLAIN_MESSAGE);
}
if (users.getType() == 5) {// 教职工
type = users.getType();
JOptionPane.showMessageDialog(null, "欢迎登录(教职工)", "疫情信息管理系统", JOptionPane.PLAIN_MESSAGE);
}
if (users.getType() == 2) {// 二级防疫部门
type = users.getType();
JOptionPane.showMessageDialog(null, "欢迎登录(二级防疫部门)", "疫情信息管理系统", JOptionPane.PLAIN_MESSAGE);
}
if (users.getType() == 3) {// 二级防疫部门负责人
type = users.getType();
System.out.println(type);
JOptionPane.showMessageDialog(null, "欢迎登录(二级防疫部门负责人)", "疫情信息管理系统", JOptionPane.PLAIN_MESSAGE);
}
if (users.getType() == 4) {// 防疫办负责人
type = users.getType();
System.out.println(type);
JOptionPane.showMessageDialog(null, "欢迎登录(防控办)", "疫情信息管理系统", JOptionPane.PLAIN_MESSAGE);
}
flag = true;
break;// 如果信息正确就退出遍历,提高效率
}
}
if (!flag) {// 信息不正确,重新输入
JOptionPane.showMessageDialog(null, "请输入正确的用户名或密码", "警告", JOptionPane.WARNING_MESSAGE);
username.setText("");
passwordField.setText("");
} else {
// 当输入的信息正确时,就开始加载选项卡界面,并把选项卡界面加入到卡片布局器中
DormitoryInfo dormitoryInfo = new DormitoryInfo(users, type);// 宿舍信息
cardPanel = new JPanel();
jTabbedPane = new JTabbedPane(JTabbedPane.LEFT);
jTabbedPane.add("宿舍信息", dormitoryInfo);
cardPanel.add(jTabbedPane);
card.add(cardPanel, "info");
cardLayout.show(card, "info");// 输入信息正确就显示操作界面,否则重新输入正确信息
}
}
}
测试运行:
采集页面(此页面是学生的采集页面,教职工和二级防疫部门成员的页面也是一样的,只能进行信息提交)
二级防疫部门负责人和防控办负责人的界面见(2)(3)
#####(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能; 只能查看自己部门的成员,并实现实现增删改功能: 高级查询功能: 工号查询: 姓名模糊查询: 时间准确查询: 感染情况查询: 多属性组合查询:例如查询某人某天情况* 可视化统计功能: #####(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件; 主界面(基本的增删改) 【高级查询】可进行数据组合筛选: 先筛选学生,再查那个人: 以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况: 也可以生成饼状图:
【导出】查询列表的EXCEL文件: 扩展功能: 虽然利用java mail发送邮件来提醒的方法挺好的,但是邮件可能会被当成垃圾邮件不说,而且像腾讯提供的端口,发送的邮件达到一定数量后,就不给你发送了(别问我怎么知道的,我自己做信息安全应用的课设,就用的java mail发邮件,结果两天发了50多封,就被当成垃圾邮件,不给发了);另外,就算有邮件,QQ和微信也不一定会立即提醒。除此之外,还有发短信的方法,比较复杂,还可能要收费。因此,上述方法我觉得都不靠谱,我这里还是利用闹钟的方法,最简单也最有效。 进系统的时候会提醒你设置闹钟: 因为定时提醒这个功能我用的是响铃的方法,所以我也没法截图,我就把代码放这儿吧! 实现原理:
- 作为客户端,肯定是可以放在后台运行的。
- 只要程序一直在后台运行,就会一直用线程定时获取电脑的系统时间(每一秒获取一次)。
- 如果电脑的系统时间到了你设定的响铃时间,就会播放一段音乐,提醒你应该填报。
// 播放铃声
static void playMusic() {// 背景音乐播放
try {
java.net.URL cb;
File f = new File("src/images/Taylor+Swift+-+Ours.wav"); // 引号里面的是音乐文件所在的路径
cb = f.toURL();
AudioClip aau;
aau = Applet.newAudioClip(cb);
aau.play();
aau.loop();// 循环播放
System.out.println("可以播放");
// 循环播放 aau.play()
// 单曲 aau.stop()停止播放
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new login();
String z = JOptionPane.showInputDialog("闹钟:");
Runnable runnable = new Runnable() {
// 创建 run 方法
public void run() {
// 获取电脑时间
java.util.Date utildate = new java.util.Date();
str = DateFormat.getTimeInstance().format(utildate);
System.out.println(str);
System.out.println("Hello!");
b = str.compareTo(z);
if (b == 0) {
System.out.println("1!");
playMusic();
}
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
// 10:秒 1:秒
// 第一次执行的时间为10秒,然后每隔一秒执行一次
service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS);
}
结对讨论:
讨论和细化: 商量怎么实现 因为我们两个都不擅长写前台,所以商议用GUI实现图形用户化界面:
PSP
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 估计这个任务需要多少时间,并规划大致工作步骤 | 15 | 15 |
Development | 开发 | 540 | 960 |
· Analysis | 需求分析 (包括学习新技术) | 30 | 60 |
· Design Spec | · 生成设计文档 | 15 | 15 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 60 | 120 |
· Coding | · 具体编码 | 300 | 600 |
· Code Review | · 代码复审 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 75 | 195 |
· Test Report | · 测试报告 | 30 | 120 |
· Size Measurement | · 计算工作量 | 15 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 30 | 60 |
小结感受
通过这次实验的结对编程,我觉得两人合作真的能够带来1+1>2的效果。首先,在软件开发的过程中,结对编程可以提高软件开发效率的;其次,它还可以减少软件中的错误与漏洞。另外,在测试过程中,我和结对伙伴可以分饰两角:软件工程师和客户,可以更好的去改进项目,提高软件项目的人机交互体验。