實驗二 軟件工程准備
項目 | 內容 |
---|---|
課程班級博客鏈接 | 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流程,學會在開發前有個整體把握和設計,搞清方向,才能在入手時高效高質量的完成任務,這是我本次實驗最大的收獲。
總結:由於編程能力不足,我通過學習一個教學視頻來做本次實驗,但只實現了部分功能,在本次實驗中意識到很多學習方面的問題,會在后續學習中繼續努力,補上未完成功能,但第一次完成這樣的實驗作業,收獲知識和遇到的困難都讓我挫敗和興奮,只有扎做好每一步才能提高專業能力。