201771030123-王爽 實驗三 軟件工程結對項目—《西北師範大學疫情防控系統》項目報告

項目 內容
課程班級博客連接 2020年春軟件工程課程班(2017級計算機科學與技術)
這個做業要求連接 實驗三 軟件工程結對項目
個人課程學習目標 (1)體驗軟件項目開發中的兩人合做,練習結對編程(Pair programming)。
(2)掌握Github協做開發程序的操做方法。
這個做業在哪些方面幫助我實現學習目標 (1)閱讀《構建之法》第3-4章內容,學習瞭解結對編程的相關內容。
(2)經過結對編程的過程去熟悉GitHub協做開發的各類操做。
結對方的學號姓名 <201771030117-祁甜>
結對方的博客做業鏈接 http://www.javashuo.com/article/p-brwdtnfl-mb.html
本項目的倉庫連接 https://github.com/Gu19901212/Partner.git

一.對結對方《實驗二 軟件工程我的項目》的項目成果進行評價

  (1)對項目博文做業進行閱讀並進行評論

  結對方博客連接

  結對方項目倉庫連接

    評論截圖以下圖:
html

  (2)克隆結對方項目源碼,閱讀並測試運行代碼,複審同伴項目代碼並記錄。

 代碼複審覈查表 

1.概要部分
  1)代碼能符合需求和規格說明麼? 能,系統能夠實現對疫情的上報與統計
  2)代碼設計是否有周全的考慮? 否,還須要繼續完善
  3)代碼可讀性如何? 可讀,每一個類都有特定功能的註釋
  4)代碼容易維護嗎? 比較容易維護
  5)代碼的每一行都執行並檢查了嗎? 每一行都檢查了但沒有單步執行,只是總體執行

2.設計規範部分
  1)設計是否聽從已知的設計模式或項目中經常使用的模式? 是的,是已知的設計模式,比較容易掌握
  2)有沒有硬編碼或字符串/數字等存在? 沒有
  3)代碼有沒有依賴於某一平臺,是否會影響未來的移植(如Win32到Win64)? 不會影響
  4)開發者新寫的代碼可否用已有的Library/SDK/Framework中的功能實現?在本項目中是否存在相似的功能能夠調用而不用所有從新實現? 有的,存在有的相似功能能夠調用
  5)有沒有無用的代碼能夠清除? 沒有

3.代碼規範部分
   修改的部分符合代碼標準和風格麼? 符合

4.具體代碼部分
  1)有沒有對錯誤進行處理?對於調用的外部函數,是否檢查了返回值或處理了異常? 有的有出錯處理,有的沒有,沒有異常
  2)參數傳遞有無錯誤,字符串的長度是字節的長度仍是字符(多是單/雙字節)的長度,是以0開始計數仍是以1開始計數? 參數傳遞沒有錯誤,字符串的長度是字節的長度,是以1開始的
  3)邊界條件是如何處理的?switch語句的default分支是如何處理的?循環有沒有可能出現死循環? 設有判斷語句,不會出現死循環
  4)有沒有使用斷言(Assert)來保證咱們認爲不變的條件真的獲得知足? 沒有
  5)對資源的利用,是在哪裏申請,在哪裏釋放的?有無可能存在資源泄露(內存、文件、各類GUI資源、數據訪問的鏈接,等等)?有沒有優化空間? color=gray
  6)數據結構中有沒有用不到的元素? 沒有

5.效能
  1)代碼的效能(Performance)如何? 基本達到任務要求
  2)代碼中,特別是循環中是否有明顯可優化的部分(C++中反覆建立類,C#中 string 的操做是否能用StringBuilder 來優化)? 沒有
  3)對於系統和網絡調用是否會超時?如何處理? 目前沒有出現超時,若是出現如何處理還須要尋找方法

6.可讀性
   代碼可讀性如何?有沒有足夠多的註釋? 可讀性能夠,有足夠多的註釋

7.可測試性
   代碼是否須要更改或建立新的單元測試? 不須要
java

  (3)依據複審結果嘗試利用github的Fork、Clone、Push、Pull request、Merge pull request等操做對同伴我的項目倉庫的源碼進行合做修改。

    1)到同伴倉庫下使用fork,並在本身的倉庫中查看,截圖以下:

git

    2)使用clone將從同伴那裏fork過來的項目下載到本地,截圖以下:


github

    3)使用push、pull request對同伴的代碼進行修改,下面的截圖是我經過push更新了一些文件再pull request給同伴,她再merge pull request的記錄以下:

web

二.採用兩人結對編程方式,結合我校師生疫情每日上報系統使用體驗,設計開發一款符合我校疫情防控工做需求的信息系統

  (1)需求分析陳述

  • 非功能性需求
        如今因爲新冠狀病毒的疫情,各個城市的學校都一致延遲開始時間,可是雖然延遲時間,但學校也但願你們能早日返校,因此在此以前學校也要求咱們天天都填寫疫情上報表。在全部人都填寫了以後,但願能根據學校的要求清晰的查看全部職工及學生的狀況,因此如今設計開發一款符合我校疫情防控工做需求的信息系統

  • 功能性需求
    • (1)可採集全校各種師生員工疫情信息;
    • (2)各二級部門疫情防控工做負責人可查看本部門人員疫情彙總,並提供高級查詢功能進行多屬性組合查詢和可視化統計功能;
    • (3)學校防控辦指定負責人登陸《西北師範大學疫情防控信息統計》子系統,可瀏覽全部人員填報彙總數據清單,利用【高級查詢】可進行數據組合篩選,系統以圖形化方式展現各學院已填報和未填報學生統計狀況和關鍵疫情數據統計狀況,可【導出】查詢列表的EXCEL文件;
    • (4)人機交互界面要求GUI界面(WEB頁面、APP頁面均可);
    • (5)附加分功能:定時填報提醒

  對於這些須要實現的功能來講,因爲咱們團隊在實驗二中,我選的是一類,同伴選的是二類。相對來講,同伴的實驗二的項目跟這次的項目比較貼切,因此一開始咱們是暫定爲,在她的項目上進行修改,就是添加一些功能、頁面設計等。而我以前實驗二作的是一類,對可視化已經數據轉儲的知識已經有必定的熟悉,因此咱們的暫定分工爲:同伴負責在他的實驗二源程序上添加教師填報的相關功能,我負責對收集的信息的可視化以及列表的導出Excel功能進行實現,最後兩我的再討論對於交互界面的處理。
sql

  (2)軟件設計說明

    設計思路說明:一開始咱們是想按照需求分析的功能依次實現的,可是實際狀況與預期不一樣,一直不能達到預期效果,在最後的時候咱們決定導出Excel和數據可視化與填報系統分開實現,使用項目yiqing來實現教師學生填報疫情信息以及各防空辦查看整體信息,使用項目yiqingToExcel來實現從數據庫讀取信息而且導出Excel已經將讀取的信息繪製柱狀圖。具體類實現以下:

數據庫

  • DBhelper.java——鏈接MySQL數據庫的工具類
  • Yiq.java——數據庫中yiqing表的實體類
  • YiqService.java——讀取數據庫中的表的服務類
  • FromDbToExcel.java——將數據庫中的數據導出Excel

  • BaseDao.java——數據庫操做基礎類,利用泛型和反射機制來抽象數據庫基本的增刪該查操做;
  • (2)CollegeadminServlet.java——各二級部門疫情防控工做負責人查看本學院學生信息;
  • (3)LoginServlet.java——控制不一樣身份的人登陸;
  • (4)SchoolOfficeServlet.java——學校防疫辦獲取各學院已經提交的學生和老師的疫情信息;
  • (5)StudentServlet.java——各二級部門疫情防控工做負責人查看本學院老師和學生的疫情信息並提交給學校防疫辦;
  • (6)yiqingServlet.java——學生填報疫情信息以及控制條件。
    isEffectiveDate(Date nowTime, Date startTime, Date endTime)函數——控制學生在天天十點之前填報疫情狀況,若是在十點之前返回true,不然返回false。
  • yiqingTeacherServlet.java——老師填報疫情信息以及控制條件。
  • yiqingDao.java——各二級部門疫情防控工做負責人提交本學院師生疫情信息後對數據庫進行修改;

    類之間的關係:在項目yiqing中,用LoginServlet.java來控制不一樣身份的人登陸,分爲老師,學生,學院負責人,學校防空辦負責人。登陸以後根據身份不一樣可進行填報信息,進行不一樣的操做。對於學生和老師就是經過yiqingServlet.java、yiqingTeacherServlet.java兩個類來支撐填報信息以及控制條件,學院負責人則是可查看學院師生疫情狀況,也就是SchoolOfficeServlet.java這個類支撐的,校防空辦的負責人則能夠好看全部的的疫情狀況;在項目yiqingToExcel中,就是建立實體類(Yiq.java),而後鏈接數據庫(DBhelper.java),以後就是進行數據庫服務類(YiqService.java)以及導出和可視化類(FromDbToExcel.java)的實現
編程

  總的來講,咱們這次的項目可以達到的功能以下:

    (1)全校師生都可填報疫情信息;
    (2)各二級部門疫情防控工做負責人可查看本部門人員疫情彙總;
    (3)學校防空辦指定負責人登陸《西北師範大學疫情防控信息統計》子系統,可瀏覽全部人員填報數據清單;
    (4)網頁上更新數據庫以後就再從數據庫中讀取表格內容進行可視化和導出Excel處理;
    (5)人機交互使用web頁面;
設計模式

  主要代碼:

public class YiqService {
	/**
	 * 查詢數據庫中yiqing表中全部的數據
	 */
	public static List<Yiq> getAllByDb() {
		List<Yiq> list = new ArrayList<Yiq>();
		DBhelper db = new DBhelper();
		String sql = "select d.id,d.name1,d.college,d.class1,d.date,d.place,d.wuhan,d.hubei,d.wuhancontact,d.hubeicontact,d.back,d.suspected,d.confirm,d.state from yiqing d";
		ResultSet rs = db.Search(sql, null);
		try {
			while (rs.next()) {
				int id = rs.getInt("id");
				String name1 = rs.getString("name1");
				String college = rs.getString("college");
				String class1 = rs.getString("class1");
				Date date = rs.getDate("date");
				String place = rs.getString("place");
				String wuhan = rs.getString("wuhan");
				String hubei = rs.getString("hubei");
				String wuhancontact = rs.getString("wuhancontact");
				String hubeicontact = rs.getString("hubeicontact");
				String back = rs.getString("back");
				String suspected = rs.getString("suspected");
				String confirm = rs.getString("confirm");
				String state = rs.getString("state");
				
				list.add(new Yiq(id,name1,college,class1,date,place,wuhan,hubei,wuhancontact,hubeicontact,back,suspected,confirm,state));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

        /**
	 * 實現數據導出Excel和數據可視化主程序
	 */
public static void main(String[] args) {
		try {
			WritableWorkbook wwb = null;
			// 建立可寫入的Excel工做簿
            String fileName = "F://test1//yiqing.xls";
            File file=new File(fileName);
            if (!file.exists()) {
                file.createNewFile();
            }
          //以fileName爲文件名來建立一個Workbook
            wwb = Workbook.createWorkbook(file);
            
         // 建立工做表
            WritableSheet ws = wwb.createSheet("Test Shee 1", 0);
            
          //查詢數據庫中全部的數據
            List<Yiq> list= YiqService.getAllByDb();
            //要插入到的Excel表格的行號,默認從0開始
            Label Id= new Label(0, 0, "學號");//表示第
            Label name= new Label(1, 0, "姓名");
            Label college= new Label(2, 0, "班級");
            Label class1= new Label(3, 0, "班級");
            Label wuhan= new Label(4, 0, "武漢籍");
            Label hubei= new Label(5, 0, "湖北籍");
            Label wuhancontact= new Label(6, 0, "武漢接觸史");
            Label hubeicontact= new Label(7, 0, "湖北接觸史");
            Label back= new Label(8, 0, "是否返校");
            Label confirm= new Label(9, 0, "疑似");
            Label state= new Label(10, 0, "確診");
            
            ws.addCell(Id);
            ws.addCell(name);
            ws.addCell(college);
            ws.addCell(class1);
            ws.addCell(wuhan);
            ws.addCell(hubei);
            ws.addCell(wuhancontact);
            ws.addCell(hubeicontact);
            ws.addCell(back);
            ws.addCell(confirm);
            ws.addCell(state);
            
            
            
            for (int i = 0; i < list.size(); i++)
            {
            	
            	Label Id_i= new Label(0, i+1, list.get(i).getId()+"");
            	Label Name_i= new Label(1, i+1, list.get(i).getName1()+"");
            	Label college_i= new Label(2, i+1, list.get(i).getCollege()+"");
            	Label class1_i= new Label(3, i+1, list.get(i).getClass1()+"");
            	Label wuhan_i= new Label(4, i+1, list.get(i).getWuhan()+"");
            	Label hubei_i= new Label(5, i+1, list.get(i).getHubei()+"");
            	Label wuhancontact_i= new Label(6, i+1, list.get(i).getWuhancontact()+"");
            	Label hubeicontact_i= new Label(7, i+1, list.get(i).getHubeicontact()+"");
            	Label back_i= new Label(8, i+1, list.get(i).getBack()+"");
            	Label confirm_i= new Label(9, i+1, list.get(i).getConfirm()+"");
            	Label state_i= new Label(10, i+1, list.get(i).getState()+"");
            	
            	
            	
            	ws.addCell(Id_i);
            	ws.addCell(Name_i);
            	ws.addCell(college_i);
            	ws.addCell(class1_i);
            	ws.addCell(wuhan_i);
            	ws.addCell(hubei_i);
            	ws.addCell(wuhancontact_i);
            	ws.addCell(hubeicontact_i);
            	ws.addCell(back_i);
            	ws.addCell(confirm_i);
            	ws.addCell(state_i);
            }
          //寫進文檔
            wwb.write();
           // 關閉Excel工做簿對象
            System.out.println("數據導出成功!");
            wwb.close();
		}catch (Exception e) {
			 // TODO Auto-generated catch block
            e.printStackTrace();
		}
		JFrame frame=new JFrame("疫情統計表");
		frame.setLayout(new GridLayout(2,2,10,10));
		frame.add(new FromDbToExcel().getChartPanel());   //添加柱形圖
		frame.setBounds(0, 0, 900, 800);
		frame.setVisible(true);
	}

  (3)程序運行

  這次項目的功能圖以下:

  運行界面:

  學生登陸以後進行信息填寫而且可看到填報提醒:



  學生上報疫情信息成功!:


  若是當天重複提交會出現下面信息,提醒學生當天已上報過了:


  各二級部門負責人可查看本學院學生上報的疫情狀況:


  點擊提交可向學校防空部門提交該學院信息,提交成功:


  也可查看本學院教職工的上報的疫情信息並上報到學校:



  還可查看本學院學生的一些信息及聯繫電話:


  學校防空辦負責人登陸後可查看全校學生及老師上報的疫情信息:



  網頁更新數據庫以後運行項目yiqingToExcel,能夠獲得導出的Excel文件以及可視化柱狀圖:


網絡

  (4)結對交流過程:

  在這次結對編程中咱們使用的是qq進行交流,下面是交流的截圖:

  (4)上傳項目到GitHub:

  (5)這次項目的PSP展現:

PSP2.1 任務內容 計劃共完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 30 25
Estimate 估計這個任務須要多少時間,並規劃大體工做步驟 30 30
Development 開發 1745 1925
Analysis 需求分析(包括學習新技術) 90 120
Design Spec 生成設計文檔 30 40
Design Review 設計複審(和同事審覈設計文檔) 90 70
Coding Standard 代碼規範(爲目前的開發制定合適的規範) 20 20
Design 具體設計 40 50
Coding 具體編碼 1080 1200
Code Review 代碼複審 60 90
Test 測試(自我測試,修改代碼,提交修改) 60 90
Reporting 報告 180 165
Test Report 測試報告 30 25
Size Measurement 計算工做量 5 5
Postmortem&Process Improvement Plan 過後總結並提出過程改進計劃 60 50

  (6)小結:

  這次項目咱們體驗告終對編程,對於結對編程從一開始的沒聽過,到閱讀過《構建之法》裏面的結對編程的相關描述後,從理論上來講,我以爲結對編程是能夠達到1+1>2的效果的,用爲這個過程當中,咱們是統一體,一塊兒學習,一塊兒實踐,經過分工合做,取長補短的方式讓這個過程更加有意義,對於「我想不出這個點怎麼作就只能死磕到底」的這種狀況發生的概率有所降低,而是「一個想不出來,另外一個換一個思路就能夠想出了」的狀況有所增長,這是一個共同促進的效果。從實踐上來是,也確實是能夠達到1+1>2的效果,可是也不是理論上的那麼順利,由於一我的有一我的的問題,兩我的有兩我的的問題,在開始的時候會在溝通或思想上有所分歧,可是通過磨合以後兩我的的想法總會不謀而合,也就慢慢的好了,總的來講,經過此次實驗,我從同伴身上、結對編程中學到了不少。遺憾的是,沒能在有限的時間內想辦法將所需實現的功能所有實現,下次還須要更加努力

相關文章
相關標籤/搜索