项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的课程学习目标 | 团队合作能力 PSP规划 编程能力 继续熟练Github相关操作 |
这个作业在哪些方面帮助我实现学习目标 | 汉堡包法 MySQL的使用 实验二项目 与结对方的合作 PSP |
结对方学号-姓名 | 201271050130-滕江南 |
结对方本次博客作业链接 | https://www.cnblogs.com/tjnkxh/p/12522150.html |
项目Github的仓库链接地址 | https://github.com/banmianzhuang02/test3 |
任务一
概念 | 理解 | 页码 |
---|---|---|
代码风格规范 | 主要是文字方面的规定,原则是:简明,易读,无二义性 | P70 |
代码设计规范 | 主要是程序设计、模块之间的关系、设计模式 | P75 |
代码复审 | 代码是否在代码规范的框架内正确解决问题 | P79 |
结对编程 | 一对程序员肩并肩、平等地、互补地开发工作 | P85 |
任务二
结对方博客
https://www.cnblogs.com/tjnkxh/p/12418223.html
结对方github项目仓库链接
https://github.com/jiangnanteng0413/Epidemic-monitoring-tjn
评论
复审同伴代码
代码核查表
核查项目 | 情况分析 |
---|---|
概要部分 | 代码规范说明未提交,功能未完全实现,可读性和安全性有待提高。建议统一代码的格式规范,优化功能性和安全性。 |
设计规范部分 | 遵从了设计模式,但存在无用代码,还有部分设计未实现。建议:尽可能实现系统功能,删除多余代码。 |
代码规范部分 | 代码规范文档未提交,代码规范需要提升。 |
具体代码部分 | 代码只实现了图形用户界面,数据表格没有导入,无法查询。建议:需要后期进一步修改代码,希望能完整实现项目要求的功能。 |
效能 | 代码能正常编译,无超时情况 |
可读性 | 代码可读性适中,注释较少。建议:增加代码注释,统一格式。 |
可测试性 | 建议:测试时缺少表格数据,希望后期可以加上去。 |
汉堡包法
我们常说 [feedback], 但是在提供反馈时, 不宜完全沉溺于过去的陈年谷子烂芝麻,给别人做评价, 下结论。这样会造成一种 [你就是做得不好, 我恨你] 的情绪。我们可以调整一个角度, 把 [feedback], 变成 [feedforward], 强调 [过去你做得不够, 但是我们以后可以做得更好]在技术团队里, 我们的反馈还是要着重于 [行为和后果] 这一层面, 不要贸然深入到 [习惯和动机], [本质]. 除非情况非常严峻, 需要触动别人内心深处, 让别人悬崖勒马。
然后再来一片面包, 盖上。 这时候可以呼应开头, 鼓励对方把工作做好。
----引用自《构建之法——现代软件工程》邹欣
任务三
需求分析
2019 年 12 月,武汉发生新型冠状病毒(2019-nCoV)疫情,为阻止疫情进一步蔓延,中国政府于2020 年 1 月 23 日对武汉采取了隔离措施,包括北京、上海等 31个省市也相继实施了严格的防控措施。
————引用自《中国抗击新型冠状病毒:进展和影响》
当前,疫情防控工作到了最吃劲的关键阶段。为准确高 效采集和统计全校师生员工新冠肺炎疫情防控相关信息,进一步夯实疫情防控工作基础,坚决打赢校园疫情防控阻击战,学校组织力量开发了师生健康打卡系统。
————引用自《关于试运行西北师范大学师生健康打卡系统的通知》
学校教职工、学生分布范围较广,使得采集的疫情数据复杂,难度较大。通过系统构建的上报平台,将数据整合,然后进行统计分析,为进一步掌握学校疫情情况提供科学依据。数据是平台的血液,动态的数据现时更新才能体现平台的生命力。用户通过系统客户端界面填写相关信息,与此同时后台数据库同步更新,并将其存储起来,进行统计分析。后台通过数据整合,可进行筛选排查,生成相应图表,优化疫情数据的可视性。
功能需求
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面;
软件设计说明
类 | Gui界面生成类 | 后台数据的增删改查类 | 图表生成类 | 实体类 |
---|---|---|---|---|
作用 | 根据需求生成相对应的GUI界面 | 实现对数据库中的数据根据需要进行处理 | 根据后台的数据生成对应的柱状图 | 见github |
设计分析
核心功能 | 设计分析 |
---|---|
关系 | GUI界面根据用户的需求对后台数据的增删改查类进行显示 图表生成类,根据后台的数据类查询的数据进行柱状图的显示 |
CommFrame类内的重要方法 | CommFrame类中的actionPerformed方法将数据再GUI界面进行显示 |
类内的重要方法 | JPanel有一个继承的方法add将指定的约束对象将组件添加到此容器的布局中 Execute_*方法完成对后台数据的增删改查 Query.getAllInfo()方法完成对后台数据的查询并生成对应的柱状图 |
功能界面截图
excel数据
数据界面
登录界面
未填报信息
已填报信息
通过学号查询
通过姓名查询
柱状图的生成
代码上传
github部分操作
代码展示
JFreeChartTest2.java
package Test3;
import java.awt.Font;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
public class JFreeChartTest2 extends ApplicationFrame
{
public JFreeChartTest2(String title,int num1,int num2,int num3,int num4,int num5)
{
super(title);
this.setContentPane(createPanel(num1,num2,num3,num4,num5)); //构造函数中自动创建Java的panel面板
}
public static CategoryDataset createDataset(int num1,int num2,int num3,int num4,int num5) {//创建柱状图数据集
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.setValue(num1,"密切接触","密切接触");
dataset.setValue(num2,"在武汉","在武汉");
dataset.setValue(num3,"在湖北","在湖北");
dataset.setValue(num4,"疑似","疑似");
dataset.setValue(num5,"确诊","确诊");
return dataset;
}
public static JFreeChart createChart(CategoryDataset dataset) //用数据集创建一个图表
{
JFreeChart chart=ChartFactory.createBarChart("hi", "人员分布",
"人员数量", dataset, PlotOrientation.VERTICAL, true, true, false); //创建一个JFreeChart
chart.setTitle(new TextTitle("疫情状况",new Font("宋体",Font.BOLD+Font.ITALIC,20)));//可以重新设置标题,替换“hi”标题
CategoryPlot plot=(CategoryPlot)chart.getPlot();//获得图标中间部分,即plot
CategoryAxis categoryAxis=plot.getDomainAxis();//获得横坐标
categoryAxis.setLabelFont(new Font("微软雅黑",Font.BOLD,12));//设置横坐标字体
return chart;
}
public static JPanel createPanel(int num1,int num2,int num3,int num4,int num5)
{
JFreeChart chart =createChart(createDataset(num1,num2,num3,num4,num5));
return new ChartPanel(chart); //将chart对象放入Panel面板中去,ChartPanel类已继承Jpanel
}
public static void picture(int num1,int num2,int num3,int num4,int num5)
{
JFreeChartTest2 chart=new JFreeChartTest2("疫情柱状图",num1,num2,num3,num4,num5);
chart.pack();//以合适的大小显示
chart.setVisible(true);
}
}
Student.java
package Test3;
import java.util.Date;
public class Student {
private int id;
private String name;
private String college;
private String classl;
private Date date;
private String isContact;
private String isWuhan;
private String isHubei;
private String isYiSi;
private String isQueZhen;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name, String college, String classl, Date date, String isContact, String isWuhan,
String isHubei, String isYiSi, String isQueZhen) {
super();
this.id = id;
this.name = name;
this.college = college;
this.classl = classl;
this.date = date;
this.isContact = isContact;
this.isWuhan = isWuhan;
this.isHubei = isHubei;
this.isYiSi = isYiSi;
this.isQueZhen = isQueZhen;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCollege() {
return college;
}
public void setCollege(String college) {
this.college = college;
}
public String getClassl() {
return classl;
}
public void setClassl(String classl) {
this.classl = classl;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getIsContact() {
return isContact;
}
public void setIsContact(String isContact) {
this.isContact = isContact;
}
public String getIsWuhan() {
return isWuhan;
}
public void setIsWuhan(String isWuhan) {
this.isWuhan = isWuhan;
}
public String getIsHubei() {
return isHubei;
}
public void setIsHubei(String isHubei) {
this.isHubei = isHubei;
}
public String getIsYiSi() {
return isYiSi;
}
public void setIsYiSi(String isYiSi) {
this.isYiSi = isYiSi;
}
public String getIsQueZhen() {
return isQueZhen;
}
public void setIsQueZhen(String isQueZhen) {
this.isQueZhen = isQueZhen;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((classl == null) ? 0 : classl.hashCode());
result = prime * result + ((college == null) ? 0 : college.hashCode());
result = prime * result + ((date == null) ? 0 : date.hashCode());
result = prime * result + id;
result = prime * result + ((isContact == null) ? 0 : isContact.hashCode());
result = prime * result + ((isHubei == null) ? 0 : isHubei.hashCode());
result = prime * result + ((isQueZhen == null) ? 0 : isQueZhen.hashCode());
result = prime * result + ((isWuhan == null) ? 0 : isWuhan.hashCode());
result = prime * result + ((isYiSi == null) ? 0 : isYiSi.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (classl == null) {
if (other.classl != null)
return false;
} else if (!classl.equals(other.classl))
return false;
if (college == null) {
if (other.college != null)
return false;
} else if (!college.equals(other.college))
return false;
if (date == null) {
if (other.date != null)
return false;
} else if (!date.equals(other.date))
return false;
if (id != other.id)
return false;
if (isContact == null) {
if (other.isContact != null)
return false;
} else if (!isContact.equals(other.isContact))
return false;
if (isHubei == null) {
if (other.isHubei != null)
return false;
} else if (!isHubei.equals(other.isHubei))
return false;
if (isQueZhen == null) {
if (other.isQueZhen != null)
return false;
} else if (!isQueZhen.equals(other.isQueZhen))
return false;
if (isWuhan == null) {
if (other.isWuhan != null)
return false;
} else if (!isWuhan.equals(other.isWuhan))
return false;
if (isYiSi == null) {
if (other.isYiSi != null)
return false;
} else if (!isYiSi.equals(other.isYiSi))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", college=" + college + ", classl=" + classl + ", date=" + date
+ ", isContact=" + isContact + ", isWuhan=" + isWuhan + ", isHubei=" + isHubei + ", isYiSi=" + isYiSi
+ ", isQueZhen=" + isQueZhen + "]";
}
}
QQ截图
PSP
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间 |
---|---|---|---|
Planning | 估计这个任务需要多少时间,并规划大致工作步骤 | 15 | 20 |
Deveploment | 开发 | 60 | 80 |
Analysis | 需求分析 (包括学习新技术) | 30 | 35 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 (和同伴审核设计文档) | 20 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 45 |
Design | 具体设计 | 60 | 60 |
Coding | 具体编码 | 300 | 400 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 60 | 80 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 | 20 |
小结
这次结对实验收获很大,在我看来最重要的收获了学会了自己处理很多不会的知识点,其次是尽可能早的完成任务,结对实验对我帮助很大,相信很多同学也都一样,但可能区别就在于前期思考方式的不同上面,我与我的队友好像基本不存在意见等等方面的不统一,也没有出现意见不合之处,可能是前期的分工比较明确,各自也都多替对方考虑了些,所以这次结对合作与我们而言相比单人项目要轻松很多了。
同样在结对过程中队友也让我学到了很多,我初次克服了我对时间把控不到位的问题,才发现变化可能总比计划多,所以事事要乘早做准备,而不是计划分分相扣,而应保留变化的余地,如此才能游刃有余。