实验三 软件工程结对项目
项目 | 内容 |
课程班级博客 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
课程学习目标 | 练习结对编程(Pair programming),掌握Github协作开发程序的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 在团队合作、代码编写方面 |
结对方学号-姓名 | 201771010112-罗松 |
结对方本次博客链接 | https://www.cnblogs.com/xuezhiqian/p/12590206.html |
项目的Github仓库链接 | https://github.com/Jcczits/yq-jxc-ls.git |
1、实验目的与要求
(1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
(2)掌握Github协作开发程序的操作方法。
2、实验内容和步骤
任务1:
阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
任务2:
两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
由于结对方上次没有提交博文,所以无法进行评论。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
由于结对方上次上传项目刀GitHub,所以无法进行测试。这里评价我自己的代码。
代码复审:
1、概要部分
- 代码能符合需求和规格说明么?
答:部分不符合- 代码设计是否有周全考虑?
答:考虑的不太全面- 代码可读性如何?
答:符合规范,可读性高- 代码容易维护么?
答:容易- 代码的每一行都执行并检查过了吗?
答:已检查2、设计规范部分
- 设计是否遵从已知的设计模式或项目中常用的模式?
答:否。- 有没有硬编码或字符串/数字等存在?
答:没有。- 代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)
答:没有。- 开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:可以实现,不存在。- 有没有无用的代码可以清除?
答:已将无用代码清除。3、代码规范部分
- 修改的部分符合代码标准和风格么(详细条文略)?
答:符合。4、具体代码部分
- 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:有对错误进行处理,并对调用的外部函数,检查了返回值且处理了异常。- 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:应该无错误,字符串的长度是字节的长度,以0开始计数。- 边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环?
答:不会出现死循环。- 有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
答:没有。- 对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
答:可能会导致资源泄漏,有可能优化。- 数据结构中是否有无用的元素?
答:没有。5、效能
- 代码的效能(Performance)如何?最坏的情况是怎样的?
答:程序运行正常。- 代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
答:有可优化的部分,能力有限,正在尝试修改。- 对于系统和网络调用是否会超时?如何处理?
答:不会超时。6、可读性
- 代码可读性如何?有没有足够的注释?
答:代码可读性较高,有。7、可测试性
- 代码是否需要更新或创建新的单元测试?还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
答:不需要。
任务3:
采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
能力有限,可视化功能和导出查询列表的EXCEL文件功能没有实现。
需求分析
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
功能实现
- 系统可采集学生疫情有效信息;
- 学生可以提交信息到管理员端;
- 负责人可登录系统,可查看学生填报的所有汇总数据
- 负责人可根据学生的姓名,学院,地址查找相关信息
- 负责人可直接添加学生的信息
- 负责人也可将填写有误的学生信息进行修改及删除
设计实现
数据库设计
部分运行截图:
部分代码:
package yiqingshangbao; import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Window { public static void main(String[] args){ JFrame jframe = new JFrame("疫情上报管理系统") ; //window Dimension d = new Dimension(700,300); Point p = new Point (250,350); jframe.setSize(d); jframe.setLocation(p); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button1 = new JButton("上报疫情信息"); JButton button2 = new JButton("修改疫情填报信息"); JButton button3 = new JButton("查询疫情填报信息"); JButton button4 = new JButton("浏览疫情填报信息"); FlowLayout flow = new FlowLayout(FlowLayout.LEFT,10,10); JPanel panel = new JPanel(flow); panel.add(button1); panel.add(button2); panel.add(button3); panel.add(button4); jframe.add(panel); jframe.setVisible(true); button1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Add add = new Add(); } }); button2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Change change = new Change(); } }); button3.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Ask ask = new Ask(); } }); button4.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ Look look = new Look(); } }); } }
//数据库连接 Connection conn = null; Statement stat = null; PreparedStatement ps=null; String sql = "INSERT INTO student(number,name,deparment,fanxiao,yisi,quezhen) " + "values(?,?,?,?,?,?)"; try{ Class.forName("com.mysql.jdbc.Driver"); System.out.println("JBDC 加载成功!"); }catch(Exception a){ System.out.println("JBDC 狗带!"); a.printStackTrace(); } try{ conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root","555320lll"); ps=conn.prepareStatement(sql); ps.setString(1,jtnumber.getText()); ps.setString(2,jtname.getText()); ps.setString(3,jtdeparment.getText()); ps.setString(4,jtfanxiao.getText()); ps.setString(5,jtyisi.getText()); ps.setString(6,jtquezhen.getText()); ps.executeUpdate(); //System.out.println("MySQL 连接成功!"); //stat = conn.createStatement(); //stat.executeUpdate(sql); //System.out.println("插入数据成功!"); }catch (SQLException b){ b.printStackTrace(); }finally{ try{ conn.close(); System.out.println("MySQL 关闭成功"); }catch (SQLException c){ System.out.println("MySQL 关闭失败 "); c.printStackTrace(); } } }} );
结对讨论:
PSP
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间 |
Planning | 估计这个任务需要多少时间,并规划大致工作步骤 | 15 | 15 |
Deveploment | 开发 | 1000 | 1500 |
Analysis | 需求分析 (包括学习新技术) | 30 | 100 |
Design Spec | 生成设计文档 | / | / |
Design Review | 设计复审 | / | / |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 150 | 210 |
Coding | 具体编码 | 600 | 1000 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 120 |
Reporting | 报告 | 100 | 120 |
Test Report | 测试报告 | 40 | 40 |
Size Measurement | 计算工作量 | 15 | 20 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 30 | 30 |
总结:
小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,我确实发现了结对编程的作用,我们分工合作,互相讨论,相互学习,不断复审,弥补对方的不足。但是初次合作同样也出现了很多问题,我俩基础都不好,能力有限,更多的时间还是在自学,然后试错,没人起到一个领航员的作用,另外还会因为我们不在一个地方一起学习,出现时间对接不好等等的矛盾。但总的来说,收获不少,这是一次新奇的体验,初次磨合,相信以后会更好。