201771030117-祁甜 實驗三 結對項目—《西北師範大學疫情防控信息系統》項目報告

項目 內容
課程班級博客連接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
這個做業要求連接 http://www.javashuo.com/article/p-zkvgqdwq-mk.html
個人課程學習目標 熟悉結對編程的過程
這個做業在哪些方面幫助我實現學習目標 在開發過程當中始終都是兩我的一塊兒討論一塊兒實現,提升了效率
結對方學號-姓名 201771030123-王爽
結對方本次博客做業連接 http://www.javashuo.com/article/p-bwdrwjvc-mr.html
本項目Github的倉庫連接地址 https://github.com/Gu19901212/Partner

任務1:閱讀《現代軟件工程—構建之法》第3-4章內容,理解並掌握代碼風格規範、代碼設計規範、代碼複審、結對編程概念

一、代碼風格規範:代碼風格規範主要是文字上的規定,看似表面文章,實際上很是重要。原則是:簡明、易讀、無二義性。主要包括縮進、行寬、括號、註釋等在文字上的規定。html

二、代碼設計規範代碼設計規範牽涉到程序設計、模塊之間的關係、設計模式等方方面面的通用原則。包括函數、goto、錯誤處理、斷言等。java

三、代碼複審代碼複審要解決的是項目早期的問題,看代碼是否在代碼規範的框架內正取地解決了問題。有自我複審、同伴複審、團隊複審三種形式。目的是找出代碼的錯誤、發現邏輯錯誤、發現算法錯誤、發現可能須要改進的地方等。git

四、結對編程:在結對編程模式下,一對程序員肩並肩、平等地,互補地進行開發工做。他們並排坐在一臺電腦前,面對同一個顯示器,使用同一個鍵盤、同一個鼠標一塊兒工做。他們一塊兒分析,一塊兒設計,一塊兒寫測試用例,一塊兒編碼,一塊兒作單元測試,一塊兒作集成測試,一塊兒寫文檔。有兩個角色:駕駛員和領航員。若是運用得當,結對編程能夠取得更高的投入產出比。程序員

任務2:兩兩自由結對,對結對方《實驗二 軟件工程我的項目》的項目成果進行評價

結對方博客連接http://www.javashuo.com/article/p-ugkxqchc-mp.htmlgithub

結對方Github項目倉庫連接https://github.com/JzyWs/wangS.git算法

1、對結對方項目博文做業進行閱讀並進行評論

2、隆結對方項目源碼到本地機器,閱讀並測試運行代碼,參照《現代軟件工程—構建之法》4.4.3節覈查表複審同伴項目代碼並記。

完成後就能夠看到結對方的代碼已經克隆到了本地機器數據庫

代碼複審覈查表編程

1. 概要部分設計模式

(1)代碼符合需求和規格說明麼? 微信

  代碼基本符合需求,需求要求支持查詢某人在某一天的疫情狀況, 查詢某種數據的周/月的疫情統計狀況,並用柱狀圖顯示統計結果。實際實現的是可以按學號查詢某個學生的100天的疫情狀況,並用柱狀圖表示。可以查詢某天的2000個學生的疫情狀況,並用柱狀圖顯示。符合規格說明。

(2)代碼設計是否考慮周全?

  考慮的比較周全。

(3)代碼可讀性如何?

  代碼讀起來容易,註釋加的容易理解。就是縮進和排版能夠再優化一下。

(4)代碼容易維護麼?

  容易維護。

(5)代碼的每一行都執行並檢查過了嗎?

  已經檢查過,沒有出錯。

2.設計規範部分

(1)設計是否聽從已知的設計模式或項目中經常使用的模式?

  是。

(2)有沒有硬編碼或字符串/數字等存在?

  存在硬編碼和字符串/數字。

(3)代碼有沒有依賴於某一平臺,是否會影響未來的移植( 如Win32到Win64) ?

  不依賴於某一平臺不會影響移植。

(4)開發者新寫的代碼可否用已有的Library/SDK/Framework中的功能實現?在本項目中是否存在相似的功能能夠調用而不用所有從新實現?

  能。我認爲柱狀圖顯示能夠重複使用,不用從新實現。可是因爲兩個功能是分開實現的,因此須要從新實現。

(5)有沒有無用的代碼能夠清除?    沒有能夠清除的無用代碼。

3. 代碼規範部分

(1)修改的部分符合代碼標準和風格麼(詳細條文略)?

  結對方沒有提供代碼規範。

4.具體代碼部分

(1)有沒有對錯誤進行處理?對於調用的外部函數,是否檢查了返回值或處理了異常?

  進行了錯誤處理,檢查了返回值或處理了異常。

(2)參數傳遞有無錯誤?

  參數傳遞無錯誤。

(3)邊界條件是如何處理的?循環有沒有可能出現死循環?

  邊界條件從1開始,到(記錄數-1)結束。不會出現死循環。

(4)有沒有使用斷言( Assert)來保證咱們認爲不變的條件真的獲得知足?

  沒有使用斷言。

(5)對資源的利用,是在哪裏申請,在哪裏釋放的?有無可能存在資源泄漏(內存、文件、各類GUI資源、數據庫訪問的鏈接,等等) ?有沒有優化的空間?

  申請的是excel文件,沒有釋放。可能存在資源泄露。有優化的空間。

(6)數據結構中有沒有用不到的元素?

  沒有。

5.效能

(1)代碼的效能( Performance )如何?最壞的狀況是怎樣的?

  由於數據量較小,效能比較好。最壞的狀況是數據量特別大的時候。由於統計是用循環實現的。

(2)代碼中,特別是循環中是否有明顯可優化的部分(C++中反覆建立類,C#中string的操做是否能用StringBuilder來優化) ?

  循環沒有明顯可優化的部分。

結對方項目倉庫中的Fork、Clone、Push、Pull request、Merge pull request日誌數據

任務3:採用兩人結對編程方式,結合我校師生疫情每日上報系統使用體驗,設計開發一款符合我校疫情防控工做需求的信息系統,使之具備如下功能:

(1)可採集全校各種師生員工疫情信息;

(2)各二級部門疫情防控工做負責人可查看本部門人員疫情彙總,並提供高級查詢功能進行多屬性組合查詢和可視化統計功能;

(3)學校防控辦指定負責人登陸《西北師範大學疫情防控信息統計》子系統,可瀏覽全部人員填報彙總數據清單,利用【高級查詢】可進行數據組合篩選,系統以圖形化方式展現各學院已填報和未填報學生統計狀況和關鍵疫情數據統計狀況,可【導出】查詢列表的EXCEL文件;

(4)人機交互界面要求GUI界面(WEB頁面、APP頁面均可);

(5)附加分功能:定時填報提醒.

1、需求分析

一、背景

  2019年12月末,中國武漢發生新型冠狀病毒(2019-nCoV) 感染的肺炎疫情,爲遏制疫情蔓延,有效切斷病毒傳播途徑,在中央政府指導下,各級政府部分採起了一系列防控措施: 2020年1 月23 日10時起對武漢「封城」,全國 31個省市也相繼實施了嚴格的防控措施;全國各省市向武漢和湖北派遣醫療隊參與救治工做;在全國範圍內調配口罩、防禦服、藥品等急需的醫療資源支援武漢;指導和督促全國範圍內擁有醫療物資生產資質的企業儘快恢復生產能力;定向撥付專項財政資金用於疾病防控;從其餘省份調集物資保障武漢市民平常生活。

  值得一提的是,中國互聯網企業在這次疫情防控中發揮了社會治理方面的重要做用。以騰訊爲例,圍繞應對疫情管控需求開發了十一款產品。其中疫情在線問診功能,對於減小發熱病人之間的相互交叉感染具備重要的做用,患者在家經過互聯網向在線醫生問診,減小了病毒傳播或感染的風險;謠言粉碎對於公衆採起理性態度看待疫情的發展具備重要意義。滴滴出行還在武漢專門組建車隊,服務於醫護人員的通勤,這在實施交通管制的武漢具備重要做用。此外,還有新型肺炎確診患者同行程查詢工具,用戶只須要輸入本身所乘坐交通工具的時間和班次,就能夠確認是否與被確診感染者同行,提早作好自我隔離和就診工做。在疫情防控中,中國互聯網企業不只發展壯大,在承擔社會責任方面也愈來愈成熟。

  爲有效配合防控機構有關疫情信息的採集、統計與排查,我校開發了教職工/學生疫情上報系統,該系統由教職工疫情每日上報、學生疫情每日上報、二級部門疫情每日彙總表、疫情防控填報統計四個子系統組成。實現對我校各種人員基本狀況、所在區域及活動軌跡及健康情況的信息收集。師生經過我校企業微信服務大廳訪問該系統進行遠程信息填報。

二、功能需求

因爲實際實現狀況與預期有差異,因此功能需求爲實際實現的功能:

(1)全校師生均可以填報疫情狀況;

(2)各二級部門疫情防控工做負責人可查看本部門人員疫情彙總;

(3)學校防控辦指定負責人登陸《西北師範大學疫情防控信息統計》子系統,可瀏覽全部人員填報彙總數據清單;

(4)在網頁上更新數據庫以後就再從數據庫中讀出來進行可視化和導出處理(此功能是單獨的一個項目yiqingtoExcel);

(5)人機交互使用Web頁面。

2、軟件設計說明

一、軟件採用Servlet+JSP+Jdbc+dbutils+EasyUI+jQuery+Ajax+面向接口編程等技術實現。經過Servlet將前臺與後臺鏈接起來。

二、數據庫採用MySQL,設計瞭如圖所示的六張表

collegeadmin:存儲各二級部門疫情防控工做負責人的信息;

schooloffice:存儲學校防疫辦負責人的信息;

student:存儲學生信息;

teacher:存儲老師信息;

yiqing:存儲學生疫情信息;

yiqing_teacher:存儲老師疫情信息。

三、系統功能圖

3、軟件實現及核心功能代碼展現

一、項目yiqing主要的類包括:

(1)BaseDao.java:數據庫操做基礎類,利用泛型和反射機制來抽象數據庫基本的增刪該查操做;

(2)yiqingDao.java:各二級部門疫情防控工做負責人提交本學院師生疫情信息後對數據庫進行修改;

(3)CollegeadminServlet.java:各二級部門疫情防控工做負責人查看本學院學生信息;

(4)LoginServlet.java:控制不一樣身份的人登陸;

(5)SchoolOfficeServlet.java:學校防疫辦獲取各學院已經提交的學生和老師的疫情信息並導出爲Excel文件;

(6)StudentServlet.java:各二級部門疫情防控工做負責人查看本學院老師和學生的疫情信息並提交給學校防疫辦;

(7)yiqingServlet.java:學生填報疫情信息以及控制條件;

isEffectiveDate(Date nowTime, Date startTime, Date endTime)函數:控制學生在天天十點之前填報疫情狀況,若是在十點之前返回true,不然返回false。

(8)yiqingTeacherServlet.java:老師填報疫情信息以及控制條件;

二、項目yiqingtoExcel主要的類包括:

(1)DBhelper.java:鏈接MySQL數據庫的工具類;

(2)Yiq.java:數據庫中yiqing表的實體類;

(3)YiqService.java:讀取數據庫中的表的服務類;

(4)FromDbToExcel.java:將數據庫中的數據導出Excel。

核心代碼

/*判斷時間是否在天天十點之前*/
	//從系統獲取當前時間
	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    	String now =df.format(new Date());	
    	
    	//從系統獲取是哪一天
    	SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd ");
    	String start =df2.format(new Date());
    	
    	//從系統獲取是哪一天
    	SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd ");
    	String end =df3.format(new Date());
		String format = "yyyy-MM-dd HH:mm";
        Date nowTime = new SimpleDateFormat(format).parse(now);
        Date startTime = new SimpleDateFormat(format).parse(start+"00:00");
        Date endTime = new SimpleDateFormat(format).parse(end+"10:00");
        System.out.println(isEffectiveDate(nowTime, startTime, endTime));
        if(isEffectiveDate(nowTime, startTime, endTime)){
        	if(studentDao.add(student)){
    			msg = "提交成功";
    		}
        }
        else {
        	    msg="請於天天十點填寫!";
        }
		studentDao.closeConnection();
		resp.getWriter().write(msg);
	}
    	
     /**
     * 判斷當前時間是否在[startTime, endTime]區間,注意時間格式要一致
     * @param nowTime 當前時間
     * @param startTime 開始時間
     * @param endTime 結束時間
     * @return
     */
    public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
        if (nowTime.getTime() == startTime.getTime()
                || nowTime.getTime() == endTime.getTime()) {
            return true;
        }
        
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }
}

4、程序運行

一、系統在eclipse中的運行圖:

若是登陸身份錯誤的話會拒絕該用戶登陸系統並給出相應提示,一樣的密碼等錯誤也會給出相應提示。

二、學生填報疫情狀況(老師的操做的學生相同,不作重複展現):

填寫完成提交後會提示:

當同一我的在同一天重複提交時:

當填報時間超過當天10點時:

三、各二級部門負責人登陸系統

查看本院學生填報狀況:

查看本院老師填寫狀況

查看學生和老師疫情信息的界面都有提交按鈕,用於提交給學校防疫辦,提交成功會提示:

查看本院學生信息:

四、學校防控辦負責人登陸系統

查看全校各學院已提交的師生疫情信息

五、導出的Excel

六、可視化統計

5、將項目上傳到github倉庫中

6、結對的過程

7、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

8、小結感覺:兩人合做真的可以帶來1+1>2的效果嗎?經過此次結對合做,請談談你的感覺和體會。

  我認爲兩人合做真的可以帶來1+1>2的效果。經過此次與同窗合做,對她的代碼進行復審而且修改我學到了不少。好比github的一些操做還有怎樣對別人的代碼進行復審。上次的項目是一我的獨立完成的,就會感受很吃力。兩我的就會有各自的想法,想法多了辦法也就多了,因此明顯感受輕鬆了許多。每一個人都有本身須要作的部分,另外一我的也會及時指出不足以便於及時進行修改。大大提升了開發的效率。

相關文章
相關標籤/搜索