项目 | 内容 |
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE/ |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming); (2)掌握Github协作开发程序的操作方法。
|
帮助我实现学习目标的方面 | (1)熟悉、掌握GitHub的各种操作和使用; (2)尝试结对编程,了解合作的意义 |
结对方学号-姓名 | 201771030125-王英雪 |
结对方本次博客作业链接 | https://www.cnblogs.com/-wyx/p/12546836.html |
本项目GitHub的仓库链接地址 | https://github.com/RM-xx/report |
实验内容
任务1 阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
- 代码风格规范: 主要是文字上的规定。其原则是:简明,易读,无二义性。代码风格规范主要涉及的内容有:缩进,行宽,括号,断行与空白的{}行,分行,命名,下划线,大小写,以及注释等。
- 代码设计规范:代码设计规范有程序书写的格式问题,还牵涉到程序设计,模块之间的关系,设计模式等方面。
- 代码复审:看代码是否在代码规范的框架内正确的解决了问题。代码复审的形式有:自我复审、同伴复审、团队复审。
- 结对编程:结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
任务2 两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
对方博客链接:https://www.cnblogs.com/-wyx/p/12465501.html
对方GitHub项目仓库链接:https://github.com/wyx-candy/test4
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
代码复审核查表:
- 概要部分:
(1)代码能符合需求和规格说明么? 能,各查询功能都已实现
(2)代码设计是否有周全的考虑? 否 ,会继续完善的
(3)代码容易维护么? 相对容易
- 设计规范:
(1)设计是否遵从已知的设计模式或项目中常用的模式? 是的,因为相对熟悉一点
(2)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)? 这个还没有核实因为都使用Win64的系统
(3)开发者新写的代码能否用已有的SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现? 可以,有些代码是可以调用的
(4)有没有无用的代码可以清除? 没有,都是必要的代码
- 代码规范:
(1)修改的部分符合代码标准和风格么? 相对符合
- 具体代码:
(1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 有,但不是很全有待进一步完善
(2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度? 是字节的长度
(3)数据结构中有没有用不到的元素? 没有
- 效能:
(1)代码的效能(Performance)如何? 达到了具体任务要求的程度
(2)对于系统和网络调用是否会超时? 目前没有出现超时的现象
- 可读性:
(1)代码可读性如何? 注释清晰,可读性比较好
- 可测试性:
(1)代码是否需要更新或创建新的单元测试? 暂时不需要
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
Fork、Pull request操作:
Clone操作:
Merge pull request操作:
任务3 采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统
项目开发要求:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
需求分析:
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。在此基础上提供了高级查询,相对的可视化功能,定时功能以及导出到excel表中的功能。
软件实现
数据库包含三张表,分别是:t_user 存储系统登录这的登录名和密码;illness 存储上报疫情信息人员的基本信息;person 存储上报的疫情信息
代码设计部分总共有8个Java类,4个jsp文件:DbUtil.java用于实现mysql数据库的链接;user.java、ill.java、person.java是三个实体类,对应于数据库中的三张表;Dao.java中包含各种的操作函数,实现登录、注册、提交等操作;LoginServlet.java、RegisterServlet.java、SubmitServlet.java分别是各操作的服务类。
代码展示:
Dao.java中的部分操作函数
//登录功能 public user login(Connection con,user user) throws Exception{ user resultUser=null; String sql="select * from t_user where userName=? and password=?"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getPassword()); ResultSet rs=pstmt.executeQuery(); if(rs.next()){ resultUser=new user(); resultUser.setUserName(rs.getString("userName")); resultUser.setPassword(rs.getString("password")); } return resultUser; }
//注册功能 public boolean register(Connection con,user user) throws Exception{ boolean flag=false; PreparedStatement pstmt = null; String sql="INSERT INTO t_user(userName,password)VALUES(?,?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getPassword()); if (pstmt.executeUpdate() > 0){ flag = true; } return flag; }
//提交功能 public boolean submit(Connection con,person person) throws Exception{ boolean flag=false; PreparedStatement pstmt = null; String sql="INSERT INTO person(id,name,zhiye,sex,college,hubei,wuhan)VALUES(?,?)"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, person.getId()); pstmt.setString(2, person.getName()); pstmt.setString(1, person.getZhiye()); pstmt.setString(2, person.getSex()); pstmt.setString(1, person.getCollege()); pstmt.setString(2, person.getHubei()); pstmt.setString(2, person.getWuhan()); if (pstmt.executeUpdate() > 0){ flag = true; } return flag; } public boolean submit(Connection con,ill ill) throws Exception{ boolean flag=false; PreparedStatement pstmt = null; String sql="INSERT INTO illness(id,contact,confirm,date)VALUES(?,?)"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, ill.getId()); pstmt.setString(2, ill.getContact()); pstmt.setString(1, ill.getConfirm()); pstmt.setDate(2, (java.sql.Date) ill.getDate()); if (pstmt.executeUpdate() > 0){ flag = true; } return flag; }
LoginServlet.java、RegisterServlet.java、SubmitServlet.java相差不大,这里只展示RegisterServlet.java代码
public class RegisterServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ /** * 接收前台传来的值 账号和密码 */ String userName=req.getParameter("userName"); String password=req.getParameter("password"); DbUtil db= new DbUtil(); user user=new user(userName,password); Dao dao=new Dao(); try{ //数据库链接 Connection con=db.getCon(); if(dao.register(con,user)){ resp.sendRedirect("login.jsp"); }else{ resp.sendRedirect("register.jsp"); } }catch (Exception e){ e.printStackTrace(); } } }
程序运行:
登录界面中用户登录身份为三种:普通用户、部门负责人、学校负责人
登录失败则跳转至注册界面
以普通用户身份登录成功之后跳转至信息提交页面
部门负责人和学校负责人登录成功后跳转至相应的疫情信息显示界面
后续功能由于能力不足没有成功实现。
结对过程:
因为觉得语音交流更方便一点,所以我们俩基本都是直接通话进行交流的。
PSP展示:
PSP2.1 | 任务内容 | 计划共完成需要的时间 (min) |
实际完成需要的时间 (min) |
Planning | 计划 | 60 | 55 |
Estimate | 估计这个任务需要多少时间 | 60 | 75 |
Development | 开发 | 1700 | 2500 |
Analysis | 需求分析(包括学习新技术) | 60 | 70 |
Design Spec | 生成设计文档 | 30 | 35 |
Ddsign Review | 设计复审(和同事审核设计文档) | 30 | 35 |
Coding Standard | 代码规范(为目前的开发指定合适的范围) | 20 | 25 |
Design | 具体设计 | 100 | 130 |
Coding | 具体编程 | 1200 | 1500 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | 200 | 240 |
Test Report | 测试报告 | 40 | 60 |
Size Measurmen | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan |
事后总结,并提出过程改进计划 | 60 | 80 |
总结:
这次的试验项目相比上次的项目难度提升了好多好多,经过十天左右的奋战与煎熬,我们还是没有完成此次试验要求实现的所有操作,虽然没有完成,但是通过完成实现的那部分我还是收获了很多,相比较以前的什么都不知道进步了很多。两个人一起合作的过程感觉有好有坏:好处是两个人去共同作业比一个人轻松了很多,项目很小且简单的时候一个人没有太大的问题,就比如上一次试验的项目,但是当项目的难度提高、功能扩大的时候一个人的力量就不足了;当然我觉得不好的地方也是有的,每个人的思维方式都是不一样的,我和我的同伴在讨论的时候就时常会错意,还是需要多一些合作,在合作中不断的磨合和改善自己。