实验二 软件工程准备
项目 | 内容 |
---|---|
课程班级博客链接 | https://www.cnblogs.com/nwnu-daizh/ |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的课程学习目标 | (1)学习软件工程基础概念和理论;(2)学习个人在团队中如何发挥作用;(3)团队如何更好协作;(4)熟悉项目开发的流程 |
这个作业在哪些方面帮助我实现课程目标 | (1)掌握软件项目个人开发流程。(2)掌握Github发布软件项目的操作方法。 |
项目仓库Github链接 | https://github.com/Tanya11010 |
任务1:陈述学生疫情每日上报子系统使用体验;
对于该系统我的使用体验如下:首先是使用的第一天可能由于用户访问时间点比较密集,系统很不稳定,我持续尝试了一小时都没有成功的提交信息。但由于大多数同学目前都在家,而且填报时间早上10点钟就截止,大家容易忘记上报疫情信息。不过界面简单整齐,很多问题设置“是”或“否”按钮,填写简单方便,而且学校 老师在很短的时间内做出这个子系统供我们使用,当时我还觉得挺惊讶,病情出现没多久就有这个子系统。
任务2:总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。
在以下两类开发要求选择一种完成项目开发任务:
- 第一类开发要求:
有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,请设计一个命令行程序, 支持查询某人在某一天的疫情情况, 查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。 - 第二类开发要求:
1. 系统可采集学生疫情有效信息;
2. 系统支持用户在线使用;
3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
我选择第一类开发要求。
1.需求分析
(1)需要一个保存了100天 2000 个教职工/学生的防疫信息的数据文件;我用MySQL建立数据库保存防疫信息。
(2)设计一个命令行程序,程序可以查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况;我选择用java来写该命令行程序。
(3)用柱状图显示统计结果,可以用java中的第三方包: jfreechart-1.0.13.jar、 jcommon-1.0.16.jar、 gnujaxp.jar等来实现。
2.功能设计,获得题目需求后,要对项目做功能设计,但题目需求是项目的基本功能要求,自己思考和调研会有超出题目要求的需求,甚至你的奇思妙想会设计出特色的功能。因此,功能会有:
基本功能:
1)登录功能,用户分为两类,学生和管理员;
2)学生可填报信息;
3)学生可修改登录密码;
4)管理员可以增加、删除,修改学生填报的信息支持;
5)查询某人在某一天的疫情情况;
6)查询每月确诊新增人数的统计情况及用柱形图显示的结果
7)查询每月疑似例新增人数的统计情况及用柱形图显示的结果
3.设计实现,设计包括你会有哪些类,这些类分别负责什么功能,他们之间的关系怎样?你会设计哪些重要的函数,关键的函数是否需要画出流程图?函数之间的逻辑关系如何?(10分)
1)com.tjl.jdbc 数据库连接
JDBCUtils.java 封装JDBC工具类,连接、释放资源
2)com.tjl.view 视图包
view.java 包含各类视图菜单类
3)com.tjl.test 测试类包
JDBCUtilsTest.java 测试mysql进行语句类
ViewTest.java 测试各种视图的类
4)com.tjl.bean 用户类包
User.java 封装用户类
5)com.tjl.chart 柱形图包
Chart.java 封装柱形图类
5)创建数据库(data),数据表(info)
6)com.tjl.dao 对数据库访问的类实现
UserDao.java 借口(登录、增删、改、查)
UserDao_Imp.java 借口的实现类(mtsql具体执行)
7)Main 主程序
Main.Java 程序入口
4.测试运行,你的项目必须是可运行的,请展示项目代码的运行截图,包括题目要求实现功能对应的运行截图。这些截图说明你确实完成了项目需求,如果实现了扩展需求,也请大方秀出来。(5分)
(1)数据库
(2)登录界面
(3)学生界面
修改密码:
登录及退出
(5)管理员界面
添加信息
删除信息
修改密码
查询信息
确诊人数统计界面:
柱形图显示统计结果
疑似例统计界面:
柱形图显示统计结果:
5.粘贴自己觉得比较独特的或满意的代码片段,用博客园代码控件来显示。(提示:要有必要的注释说明,不要贴所有代码!不符合规定的要倒扣分)(5分)
数据库连接部分:
package com.tjl.jdbc;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
/**
* jdbc连接数据库
* @author by yqj;
*/
public class JDBC {
public static void main(String[] args) {
try {
// 加载驱动器
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("驱动加载成功");
// 连接数据库,获得连接对象conn;
// 数据库地址,账号,密码
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/data?useSSL=false&serverTimezone=UTC","root","root");
System.out.println("数据库连接成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("驱动加载失败");
System.out.println("数据库连接失败");
}
}
}
改进到:
package com.tjl.jdbc;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* 自建JDBC接口,将前面的程序进行封装
*/
public class JDBCUtils {
static Properties properties = null;
static {
//加载JDBCUtil类时调用
properties = new Properties();
try {
String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath();
properties.load(new FileInputStream(path));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getMysqlConn(){
try {
//加载驱动类
Class.forName(properties.getProperty("driver"));
//建立连接
return DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),
properties.getProperty("password"));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//关闭资源
public static void close(ResultSet rs, PreparedStatement ps,Connection connection){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs, PreparedStatement ps){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(PreparedStatement ps,Connection connection){
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection connection){
try {
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
6.总结:你设计的程序如何实现软件设计的“模块化”原则。
- 将整个程序分为了视图模块、用户模块、数据库、入口程序操作等几个模块,每个模块可独立编写,每个模块可以修改同时又不需要修改系统中的其他模块。最后组装成完整的程序每个模块都是单入口和单出口,模块规模适中,如此使得程序的结构清晰,容易阅读、测试和修改。
- java中的类、接口、对象等概念,使得我们的模块化更加容易。分类封装,一个类调用其他类中的方法,可以直接调用(静态方法),或者实例化一个类对象后再调用其中的方法。
7.展示PSP,这个环节重要的是让自己看到自己的估计和实际消耗时间,哪个环节耗时最多,哪个环节估计和实践相差巨大?为什么?(5分)
PSP:
PSP2.1 | 计划共需要完成时间(min) | 实际完成需要的时间(min) |
---|---|---|
计划 | 15 | 30 |
估计这个任务需要多少时间、并规划大致工作步骤 | 15 | 30 |
开发 | 930 | 1175 |
需求分析(包括学习新技术) | 30 | 50 |
生成设计文档 | 30 | 15 |
设计复审( | 30 | 30 |
代码规范 | 30 | 20 |
具体设计 | 120 | 60 |
具体编码 | 600 | 800 |
测试(自我测试,修改代码,提交修改) | 120 | 200 |
报告 | 130 | 140 |
测试报告 | 60 | 70 |
计算工作量 | 20 | 10 |
事后总结,并提出过程改进计划 | 50 | 60 |
测试部分的预估时间与实践实践相差较大,编写的代码问题较多,需要修改的部分较多。
任务3:完成任务2项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中。(50分)
(已成功导入到Github)
以及Github中PR流程图:
之前编写系统时,没按PSP流程做过预估和计划,尤其需求分析和功能设计部分处于模糊状态。我一般都直接开始入手写程序,写的过程才一边加入新功能模块,编写程序时一团乱,也不怎么特意做模块划分,思考需要写什么类,用什么方法,函数之间的调用方法,思路不清晰,以至于效率很低,且代码质量不高,此次实验让我熟悉了PSP流程,学会在开发前有个整体把握和设计,搞清方向,才能在入手时高效高质量的完成任务,这是我本次实验最大的收获。
总结:由于编程能力不足,我通过学习一个教学视频来做本次实验,但只实现了部分功能,在本次实验中意识到很多学习方面的问题,会在后续学习中继续努力,补上未完成功能,但第一次完成这样的实验作业,收获知识和遇到的困难都让我挫败和兴奋,只有扎做好每一步才能提高专业能力。