201771010113-李婷华 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告

项目 内容
班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12521474.html
我的课程学习目标 (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming);(2)掌握Github协作开发程序的操作方法。
这个作业在哪些方面帮助我实现学习目标 结对编程、和同伴如何分工以及与同伴如何更好的交流
结对方学号-姓名 201771010129-王颖奇
结对方本次博客作业链接 https://www.cnblogs.com/1556889081wyq/p/12546166.html
本项目Github的仓库链接地址 https://github.com/wyq1998/System-second

任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;

已完成

  • 代码风格规范:就是代码格式的一些要求。主要有以下几个方面:
    • 缩进
    • 行宽
    • 括号
    • 断行与空白的{}行
    • 分行
    • 命名
    • 下划线
    • 大小写
    • 注释

代码风格规范的原则是简明、易读、无二异性。

  • 代码设计规范:不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面。主要体现在以下几个方面:
    • 函数
    • goto
    • 错误处理
      • 参数处理
      • 断言
    • 如何处理C++中的类
      • class vs.struct
      • 公共/保护/私有成员(public、protected和private)
      • 数据成员
      • 虚函数
      • 构造函数
      • 折构函数
      • new和delete
      • 运算符(Operators)
      • 异常(Exceptions)
      • 类型继承(Class Inheritance)
  • 代码复审:查看代码是否符合代码规范,找出软件开发过程中的错误,降低软件开发后期维护的难度,提高软件的质量和可靠性。
  • 结对编程:结对编程中有两个角色:领航员和驾驶员。在个人编写的过程中,很多人喜欢根据个人喜好来规定代码规范,而且存在的bug自己难以发现,因此,在结对编程时,我们可以互换角色,在开始写代码之前,规定两个人都认可的一套代码规范,并且不间断地进行复审,以减少软件中存在的问题,修复bug,提高软件质量。

任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:

(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。

(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。

(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。

项目的开发者:王颖奇
项目的复审者:李婷华

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.可测试性

代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。
可以继续开发,摆脱传统的命令行方式,更为实用

  • 结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据
    已完成。Fork、Push、Pull request、Merge pull request等日志数据可从结对方github中查看,我就只列出Clone的数据

任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:

1、可采集全校各类师生员工疫情信息;

2、各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;

3、学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;

4、人机交互界面要求GUI界面(WEB页面、APP页面都可);

5、附加分功能:定时填报提醒

1、需求分析陈述。

(1)学生、教职工可以进入系统填写自己的疫情信息;
(2)二级防疫部门负责人可查看自己部门人员的疫情信息;
(3)防控办负责人可查看所有人员的疫情信息并查看各类情况的统计数据。

2、软件设计说明。

  • 登录模块设置5类人员,分别是学生、教职工、二级防疫部门人员、二级防疫部门负责人、学校防控办人员。建立的数据表如下:

(1)users表

users表用来存储各级用户的登录信息,其中Uname是这五类人员的用户名,Upassword是这五类用户的登录密码,Utype代表了这五类用户的身份,Utype=1代表学生,Utype=2代表二级防疫部门人员,Utype=3代表二级防疫部门负责人,Utype=4代表学校防控办人员,Utype=5代表教职工。
(2)ES表

ES表用来存储各级用户的填报信息,其中Sno代表学生的学号或者教职工的工号,Sname代表学生的学号或者教职工的姓名,Es代表学生的学号或者教职工的感染情况,Province代表了各级用户所属的部门,Scheckin代表学生的学号或者教职工的填报日期,Utype表示属于哪一类用户。

  • 主要的功能:
    (1)师生可登录系统进行疫情信息的填报;
    (2)二级防疫部门人员可进行疫情信息的填报;
    (3)二级防疫部门负责人可对本部门人员的信息进行增删改查,可根据姓名进行模糊查询,根据学号、填报日期、感染情况进行准确查询,可查看感染情况的统计数据(用柱状图来表示),这里的感染情况查询是查看具体的某一天。
    (4)学校防控办人员可以进行增删改查等功能,可以按照学号、时间、感染情况等进行准确查询,按照姓名进行模糊查询,可查看感染情况和填报情况的统计数据,可以查看学生和教职工统计信息的汇总。

3、软件实现及核心功能代码展示:软件包括哪些类,这些类分别负责什么功能,他们之间的关系怎样?类内有哪些重要的方法,关键的方法是否需要画出流程图?

  • 软件包括login类、GetConnection类、Users类、CheckUsers类、DormitoryInfo类。
    • login类用来做登录界面,根据用户类型进行登录,另外,提醒用户打卡的功能也封装在该类中。
    • GetConnection类主要用来连接数据库。
    • Users用户类,声明私有变量name(用户名),password(用户密码),type(用户类型)。类内有封装各自属性的方法:set(),get()。
    • CheckUsers类将从数据库中获取的数据存储到数据集中备用。
    • DormitoryInfo类负责主要功能的实现。
  • DormitoryInfo类负责login里面每类用户对应的功能的实现,在实现功能时会调用GetConnection类、CheckUsers类。
  • DormitoryInfo类里面有生成柱状图和饼状图及Excel导出的方法。还有对学生、教职工信息的增删改查等的方法。

4、程序运行:程序运行时每个功能界面截图。扩展功能实现可得附加分5分。

(1)学生登录系统

  • 登录界面

  • 学生登录系统进行信息的填写

(2)二级防疫部门人员登录

  • 登录界面

  • 二级防疫部门人员进行信息填写

(3)二级防疫部门负责人登录

  • 登录界面

  • 二级防疫部门负责人添加人员信息

    • 添加前

    • 添加后

  • 二级防疫部门负责人删除人员信息

  • 二级防疫部门负责人修改人员信息

    • 修改前

    • 修改后

  • 二级防疫部门负责人根据学号进行查询

  • 二级防疫部门负责人根据姓名模糊查询

  • 二级防疫部门负责人根据时间准确查询

  • 二级防疫部门负责人根据感染情况进行查询

  • 二级防疫部门负责人查看感染情况统计图

(4)防控办人员登录

  • 登录界面

  • 添加人员信息功能:可以添加学生、学校二级防疫部门成员、学校二级防疫部门负责人、学校防控办等人员的信息,这里以添加学生信息为例

    • 添加前

    • 添加后

  • 删除人员信息

    • 修改前

    • 修改后

  • 根据学号准确查询

  • 根据姓名模糊查询

  • 根据时间准确查询

  • 根据感染情况查询

  • 查看某天的感染情况统计图

生成的饼状图

  • 查看某人某天情况

  • 查看填报情况统计图

    • 先填入总人数

    • 弹出填报人数统计图

    • 导出excel表

  • 查看学生统计信息汇总

  • 查看教职工统计信息汇总

(5)教职工登录系统

  • 登录界面

  • 进行信息填报

(6)打卡提醒功能
这个功能的实现,我们经过讨论之后,决定设置一个闹钟来实现,在登录系统之前,用户可以设置一个闹钟,当设置的闹钟与系统获取到的时间相同时,就会播放一段音乐,来提醒你该打卡了。

由于音乐片段无法截图来展示,就展示一下这个功能实现的代码。
实现的代码如下:

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();
				}
			}
		};

5、描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图(截图要完整,能够显示结对双方姓名)

  • 先是讨论具体页面用什么方式实现,由于学艺不精,做一个优美的Web界面目前还存在问题,我们就决定做一个GUI的界面。

  • 实验二我们都做的是命令行方式的系统,所以导出Excel部分需要商讨一下如何实现,其他功能的实现起来比较简单一点,就没怎么细细讨论。

6、提供此次结对作业的PSP。

PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 15 15
·Estimate · 估计这个任务需要多少时间,并规划大致工作步骤 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

7、小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。

   我感觉两个人合作的效率还是比较高的,在合作的过程中,结对的伙伴之间可以相互学习,共同进步。在问题的解决上可以,不同的人会有不同的方法,结对编程时可以两个人交流,互相学习,最终会找到一个行之有效的高效解决方案。在项目完成方面,结对编程还是会带来1+1>2的效果。而且两个人可以互换角色,更好的改进程序,此外自己编写程序时,有些bug自己发现不了,在结对编程时,同伴可以帮你更好的处理这些问题。但是每个人的性格,做事方式还是会有一定的差异,在结对编程的过程中,需要通过正确的方法来沟通,以保证团队工作的顺利进行。

原文地址:https://www.cnblogs.com/litinghua/p/12534838.html