项目 | 内容 |
---|---|
课程班级博客 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)(2)掌握Github协作开发程序的操作方法 |
本次在哪些方面帮助我实现学习目标 | 软件开发流程的方面和运用学习工具的方面 |
结对方学号-姓名 | 201771010116-马凯军 |
结对方本次博客作业链接 | https://www.cnblogs.com/zero--/p/12587555.html |
项目的Github仓库链接 | https://github.com/1171849616/test3 |
#两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(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开始计数? 无错误;字符串的长度是字符的长度,以0开始计数。
(3)边界条件是如何处理的?switch语句的default分支是如何处理的?循环有没有可能出现死循环? switch语句的default分支输出“输入有误”,然后返回主菜单,没有出现死循环
(4)有没有使用断言(Assert)来保证我们认为不变的条件真的得到满足? 没有。
(5)对资源的利用是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有优化的空间? 在对数据库进行操作之前申请数据库连接资源,操作完毕之后释放申请的资源 不会导致资源泄露;可以优化使用断言来保证我们认为不变的条件
(6)数据结构中有没有用不到的元素? 没有。
5.效能 (1)代码的效能(Performance)如何?最坏的情况如何? 达到了具体任务的要求。
(2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)? 没有。
(3)对于系统和网络调用是否会超时?如何处理? 目前没有出现超时的现象。假如出现了,就关闭没有意义的应用,减少运行的进程,释放内存、cpu,或者清理计算机的垃圾文件。
6.可读性 代码可读性如何?有没有足够的注释? 可以顺利读取,代码有一些注释。
7.可测试性 代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。 可以继续优化更新,传统的命令行方式感觉有点落后了,完全可以超脱项目,在课余时间改为更加新颖的方式,变得更为实用。
总结:可以正常运行,代码符合需求与规格,设计不太周全,维护较难,没有代码规范,需添加readme.md。代码不是很复杂,有注释。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。 fork操作:
Merge pull request操作: 已经完成了修改项目的合并
#采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能: (1)可采集全校各类师生员工疫情信息; (2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能; (3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件; (4)人机交互界面要求GUI界面(WEB页面、APP页面都可); (5)附加分功能:定时填报提醒
##1.需求分析陈述。 2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1月23日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。 为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
通过对(1)-(5)的功能分析,可以得出该项目有三类人的需求,第一类只具有填报功能,第二类可以对自己部门的情况进行查看,而第三类人则可以查看全部数据并拥有新的权限。
##2.软件设计说明。 1)本项目主要由5个模块构成,其中包括登录模块,功能入口模块,信息采集模块,二级部门模块,防控办模块。 2)二级部门的成员,学生和教职工只能进行疫情上报。 3)二级部门的负责人,可以查看自己部门的疫情上报情况,并进行查找等操作。 4)防控办的负责人,可以查看所有人的上报情况,并进行相应操作。
##3.软件实现及核心功能代码展示 有Demo类,主方法为main,在run中有登录,信息采集,查找,导出Excel等功能,在test中有生成柱状图功能。 在进行Excel相关操作时遇到报错问题,经查询资料找到了解决办法,通过导入jar包得以解决,以下是导入的jar包(当然其中包含了生成柱状图等其他包)。
核心代码: 信息采集,并导出到Excel表中。
// 提交信息
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
button1.setVisible(false);
button0.setVisible(true);
// TODO 自动生成的方法存根
try {
FileInputStream fs = new FileInputStream("E://test.xls");// 获取e://test.xls,此为填报信息表
POIFSFileSystem ps = new POIFSFileSystem(fs);// 使用POI提供的方法得到excel的信息
HSSFWorkbook wb = new HSSFWorkbook(ps);
HSSFSheet sheet = wb.getSheetAt(0); // 获取到工作表,因为一个excel可能有多个工作表
HSSFRow row = sheet.getRow(0); // 获取第一行(excel中的行默认从0开始,所以这就是为什么,一个excel必须有字段列头),即,字段列头,便于赋值
FileOutputStream out = new FileOutputStream("E://test.xls");// 向e://test.xls中写数据
row = sheet.createRow((short) (sheet.getLastRowNum() + 1)); // 在现有行号后追加数据
row.createCell(0).setCellValue(j1.getText()); // 设置第一个(从0开始)单元格的数据
row.createCell(1).setCellValue(j2.getText()); // 设置第二个(从0开始)单元格的数据
row.createCell(2).setCellValue(j3.getText());
row.createCell(3).setCellValue(j4.getText());
if (jr1.isSelected()) {
row.createCell(4).setCellValue("是");
}
if (jr2.isSelected()) {
row.createCell(4).setCellValue("否");
}
if (jr3.isSelected()) {
row.createCell(5).setCellValue("是");
}
if (jr4.isSelected()) {
row.createCell(5).setCellValue("否");
}
if (jr5.isSelected()) {
row.createCell(6).setCellValue("是");
}
if (jr6.isSelected()) {
row.createCell(6).setCellValue("否");
}
row.createCell(7).setCellValue(j5.getText());
out.flush();
wb.write(out);
out.close();
} catch (FileNotFoundException e2) {
// TODO 自动生成的 catch 块
System.out.println("信息文件找不到");
e2.printStackTrace();
} catch (IOException e1) {
// TODO 自动生成的 catch 块
System.out.println("信息文件读取错误");
e1.printStackTrace();
}
}
});
##4.程序运行:程序运行时每个功能界面截图。 1)登录界面 分为4种情况:学生/老师;二级部门;防控办;输入错误 2)功能入口界面 分为3种,分别对应几种登录情况。 当输入学生/老师时出现疫情信息上报按钮,
3)信息采集界面
当填写完信息,点击提交后,界面消失,数据将会保存在Excel表中;当然点击清空按钮可迅速清理全部信息。
4)二级部门界面 点击"二级部门负责人入口"按钮,出现填写学院的窗口。
是/否...的按钮功能可显示对应“是”的信息并生成柱状图,当再次按下按钮时显示“否”的信息。
5)防控办界面 点击"防控办负责人入口"按钮,出现防控办负责人查看界面。
大致原理类似于二级负责人查看界面的功能设计,查找学院的原理同上,新添了“某日是/否填报”按钮及其对应的日期输入框,以及导出Excel文件。 列出全部信息:
输入日期,按下“某日是/否填报”按钮,可查看当日填写情况。此原理是通过对比“人员信息.xls”和“test.xls”中的某日的对应姓名,来确定填写人员和未填写人员。
##5.描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图
##6.提供此次结对作业的PSP。 |PSP|任务内容|计划共完成需要的时间(min)|实际完成需要的时间(min)| |:--|:--|:--|:--| |Planning|估计这个任务需要多少时间,并规划大致工作步骤|10|6| |Development|开发|1760|2350| |· Analysis|需求分析 (包括学习新技术)|30|60| |· Design Spec|· 生成设计文档|5|5| |· Design Review|· 设计复审 (和同事审核设计文档)|10|10| |· Coding Standard|· 代码规范 (为目前的开发制定合适的规范)|5|5| |· Design|· 具体设计|30|30| |· Coding|· 具体编码|1500|2000| |· Code Review|· 代码复审|120|180| |· Test|· 测试(自我测试,修改代码,提交修改)|60|60| |Reporting|报告|60|120| |· Test Report|· 测试报告|5|5| |· Size Measurement|· 计算工作量|5|5| |· Postmortem & Process Improvement Plan|· 事后总结,并提出过程改进计划|5|5|
##7.将结对编程项目的源码以增量方式提交到指定同学Github账号的项目仓库中
##8.小结感受: 两人合作能够带来1+1>2的效果,在编程中,相互讨论,可以更快更有效地解决问题,互相请教对方,可以得到能力上的互补。两人互相监督工作,可以增强代码和产品质量,并有效的减少BUG。