项目 | 内容 |
---|---|
这个作业属于哪个课程 | https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
作业学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程;(2)掌握Github协作开发程序的操作方法; |
这个作业在哪些方面帮助我实现学习目标 | (1)对软件项目协作开发流程的实践(2)相关知识的学习 |
结对方学号和姓名 | 201771010110 孔维滢 |
结对方本次博客作业链接 | https://www.cnblogs.com/Weiron/p/12588171.html |
项目的Github仓库链接 | https://github.com/wang-zhi-c-it/- |
实验内容及步骤:
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
-
代码规范风格的原则是:简明,易读,无二义性:
-
标识符应当直观且可以拼读,可望文知意,不必进行“解码”。
-
标识符的长度应当符合“min-length && max-information”原则。
-
命名规则尽量与所采用的操作系统或开发工具的风格保持一致。
-
程序中不要出现仅靠大小写区分的相似的标识符。
-
变量的名字应当使用“名词”或者“形容词+名词”。
-
全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
-
用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
-
-
代码复审:
-
代码符合需求和规格说明。对功能的实现非常完善。
-
代码设计有比较周全的考虑。首先,程序对输入有详细的处理,对输入的格式进行了检查,并对输入的数字大小进行了判断。程序还有周全的错误处理,把错误信息输出到ErrorLog.txt中。
-
代码有较高的可读性。代码根据功能分为了几个不同的类,对功能的划分较为直观,关键部分有详细的注释,但有些部分仍缺少必要的注释,存在一些难以理解的代码。由于代码的分工十分明确,所以易于维护。
-
代码的每一行都执行并检查过了。
-
-
结对编程
- 两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
- 结对方博客链接 <>
- 结对方Github项目仓库链接 <>
- 克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
- 依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
博客评论
代码审核表
1.概要部分
(1)代码能符合需求和规格说明么?
答:基本符合需求与规格
(2)代码设计是否有周全的考虑?
答:不太周全,修改了很多次
(3)代码可读性如何?
答:简单易懂
(4)代码容易维护么?
答:比较容易
(5)代码的每一行都执行并检查过了吗?
答:是的,检查过
2.设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式?
答:是
(2)有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。)
答:有,已清除
3.代码规范部分
(1)修改的部分符合代码标准和风格么(详细条文略)?
答:符合代码标准
4.效能
(1)代码的效能(Performance)如何?最坏的情况是怎样的?
答:代码正确,程序运行正常。
(2)代码中,特别是循环中是否有明显可优化的部分?
答:有可优化部分,但是代码正确就没有修改
6.可读性
代码可读性如何?有没有足够的注释?
答:代码不是很复杂,没有任何注释
7.可测试性
代码是否需要更新或创建新的单元测试?
答:需要
GitHub协作开发流程
任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
- (1)可采集全校各类师生员工疫情信息;
- (2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
- (3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况
- (4)人机交互界面要求GUI界面(WEB页面、APP页面都可)
- (5)附加分功能:定时填报提醒
1. 需求分析陈述
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
2. 软件设计说明:
- 实现的功能
(1)可采集全校各类师生员工疫情信息
(2) 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示关键疫情数据统计情况
(3)人机交互界面要求GUI界面
- 软件实现及核心功能代码展示:软件包括哪些类,这些类分别负责什么功能,他们之间的关系怎样?类内有哪些重要的方法,关键的方法是否需要画出流程图?
软件实现
1.数据库结构:
2.表的设计:
into表——用户登录信息 message——疫情填报信息
3.代码结构:
-
Logup
-用户/管理员登录界面实现 -
studentadd
-用户填报界面实现 -
StudentManagement
-管理员登录界面实现 -
add
-是实现添加学生信息的一个类 -
query
-是实现查询全部信息的一个类 -
studentQuery
-是实现通过学号查询信息的一个类 -
time
-是实现通过日期查询信息的一个类 -
studenthot
-是实现查询所有患病人员信息的一个类 -
studentUpdate
-是实现更新信息的一个类 -
studentDelete
-是实现删除信息的一个类 -
逻辑结构:
-
核心代码:
public class Logup extends JFrame implements ActionListener {
//定义登录界面的组件
JButton jb1,jb2,jb3=null;
JRadioButton jrb1,jrb2=null;
JPanel jp1,jp2,jp3,jp4,jp5=null;
JTextField jtf=null;
JLabel jlb1,jlb2,jlb3=null;
JPasswordField jpf=null;
ButtonGroup bg=null;
JLabel label;
ImageIcon background;
//菜单项
JMenuBar jmb=null;
JMenu jm=null;
JMenuItem jmi1,jmi2=null;
Connection con;
Statement sql;
static String userword;
static String pwd;
public static void main(String[] args) {
// TODO Auto-generated method stub
Logup ms=new Logup();
}
//构造函数
public Logup()
{
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch(ClassNotFoundException e){}
try{
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/text","root","123");
sql = con.createStatement();
}
catch(SQLException ee){}
//创建组件
jb1=new JButton("登录");
jb2=new JButton("重置");
jb3=new JButton("退出");
//设置监听
jb1.addActionListener(this);
jb2.addActionListener(this);
jb3.addActionListener(this);
jmb=new JMenuBar(); //JMenuBar指菜单栏
jm=new JMenu("选项"); //JMenu是菜单栏中的选项栏
jmi1=new JMenuItem("开始"); //JMenuItem指选项栏中的选项
jmi2=new JMenuItem("退出系统");
jm.add(jmi1);
jm.add(jmi2);
jmb.add(jm);
background=new ImageIcon("src/1.jpg");
label=new JLabel(background);
label.setBounds(0, 0, background.getIconWidth(), background.getIconHeight());
jp5=(JPanel)this.getContentPane();
jp5.setOpaque(false);
jp5.setLayout(new FlowLayout());
jrb1=new JRadioButton("管理员",true);
jrb2=new JRadioButton("用户");
bg=new ButtonGroup();
bg.add(jrb1);
bg.add(jrb2);
jp1=new JPanel();
jp2=new JPanel();
jp3=new JPanel();
jp4=new JPanel();
jlb1=new JLabel("用户名:");
jlb2=new JLabel("密 码:");
jlb3=new JLabel("权 限:");
jtf=new JTextField(10);
jpf=new JPasswordField(10);
//加入到JPanel中
jp1.add(jlb1);
jp1.add(jtf);
jp2.add(jlb2);
jp2.add(jpf);
jp3.add(jlb3);
jp3.add(jrb1);
jp3.add(jrb2);
jp4.add(jb1);
jp4.add(jb2);
jp4.add(jb3);
//加入JFrame中
this.add(jp1);
this.add(jp2);
this.add(jp3);
this.add(jp4);
this.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
//设置布局管理器
this.getLayeredPane().setLayout(null);
//给窗口设置标题
this.setTitle("疫情信息管理系统");
//设置窗体大小
this.setSize(350,300);
//设置窗体初始位置
this.setLocation(200, 150);
//设置当关闭窗口时,保证JVM也退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示窗体
this.setVisible(true);
this.setResizable(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="退出")
{
System.exit(0);
}else if(e.getActionCommand()=="登录")
{
if(!jtf.getText().isEmpty() && !jpf.getText().isEmpty())
{
//当点击登录按钮时,首先与数据库建立连接
//如果选中管理员登录
if(jrb1.isSelected())
{
try {
querytea();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//首先判断是否存在该用户,即是否得到了密码
if(pwd ==null)
{
this.clear();
}else
{
//调用登录方法
this.tealogin();
}
}else if(jrb2.isSelected()) //用户在登录系统
{
try {
querystu();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//首先判断是否存在该用户,即是否得到了密码
if(pwd ==null)
{
this.clear();
}else
{
//调用登录方法
this.stulogin();
}
}
}else if(jtf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名","提示消息",JOptionPane.WARNING_MESSAGE);
this.clear();
}else if(jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入密码","提示消息",JOptionPane.WARNING_MESSAGE);
this.clear();
}
}else if(e.getActionCommand()=="重置")
{
this.clear();
}
}
-
程序运行:
-
登录界面
-
学生填报界面
-
管理员查询界面
-
查询全部
-
按学号查询
-
按时间查询
-
查询患病患者
-
生成柱状图
-
信息更新
-
信息删除
-
-
结对讨论
-
psp:
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际需要的时间(min) |
---|---|---|---|
planning | 计划 | 20 | 30 |
Estimate | 估计这个需要多少时间,并规划大致工作步骤 | 15 | 20 |
Development | 开发 | 400 | 500 |
Analysis | 需求分析(包括学习新技术) | 60 | 90 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 10 | 15 |
Coding Standard | 代码规范 | 5 | 5 |
Design | 具有设计 | 100 | 120 |
Coding | 具体编码 | 400 | 500 |
Code Review | 代码复审 | 60 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
SizeMeasurement | 计算工作量 | 5 | 5 |
Postmortem&ProcessImprovementPlan | 事后总结,并提出过程改进计划 | 30 | 30 |
-
小结感受
通过本次实验我觉得结对编程可以实现 1+1>2的效果,一个人走的更快,一群人走的更远,个人编程和结对编程就像如此,个人的项目虽然完成很快,但是两个人做的项目更加精美。结对编程的好处就是可以结合两个人的思想,比如在设计算法的时候,有很多情况都是结合了两个人的思想。还有就是在编程的时候,一个人编程另一个人在旁边能够及时的发现错误,大大提高了编程的效率。两个人一起编程可以提高积极性,一个人有时候在面对很多诱惑的时候就会怠慢很多。