項目 | 內容 |
---|---|
課程班級博客連接 | 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 |
結對方博客連接
結對方項目倉庫連接
評論截圖以下圖:
html
代碼複審覈查表
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
1)到同伴倉庫下使用fork,並在本身的倉庫中查看,截圖以下:
git
2)使用clone將從同伴那裏fork過來的項目下載到本地,截圖以下:
github
3)使用push、pull request對同伴的代碼進行修改,下面的截圖是我經過push更新了一些文件再pull request給同伴,她再merge pull request的記錄以下:
web
對於這些須要實現的功能來講,因爲咱們團隊在實驗二中,我選的是一類,同伴選的是二類。相對來講,同伴的實驗二的項目跟這次的項目比較貼切,因此一開始咱們是暫定爲,在她的項目上進行修改,就是添加一些功能、頁面設計等。而我以前實驗二作的是一類,對可視化已經數據轉儲的知識已經有必定的熟悉,因此咱們的暫定分工爲:同伴負責在他的實驗二源程序上添加教師填報的相關功能,我負責對收集的信息的可視化以及列表的導出Excel功能進行實現,最後兩我的再討論對於交互界面的處理。
sql
設計思路說明:一開始咱們是想按照需求分析的功能依次實現的,可是實際狀況與預期不一樣,一直不能達到預期效果,在最後的時候咱們決定導出Excel和數據可視化與填報系統分開實現,使用項目yiqing來實現教師學生填報疫情信息以及各防空辦查看整體信息,使用項目yiqingToExcel來實現從數據庫讀取信息而且導出Excel已經將讀取的信息繪製柱狀圖。具體類實現以下:
數據庫
類之間的關係:在項目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); }
這次項目的功能圖以下:
運行界面:
學生登陸以後進行信息填寫而且可看到填報提醒:
學生上報疫情信息成功!:
若是當天重複提交會出現下面信息,提醒學生當天已上報過了:
各二級部門負責人可查看本學院學生上報的疫情狀況:
點擊提交可向學校防空部門提交該學院信息,提交成功:
也可查看本學院教職工的上報的疫情信息並上報到學校:
還可查看本學院學生的一些信息及聯繫電話:
學校防空辦負責人登陸後可查看全校學生及老師上報的疫情信息:
網頁更新數據庫以後運行項目yiqingToExcel,能夠獲得導出的Excel文件以及可視化柱狀圖:
網絡
在這次結對編程中咱們使用的是qq進行交流,下面是交流的截圖:
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 |
這次項目咱們體驗告終對編程,對於結對編程從一開始的沒聽過,到閱讀過《構建之法》裏面的結對編程的相關描述後,從理論上來講,我以爲結對編程是能夠達到1+1>2的效果的,用爲這個過程當中,咱們是統一體,一塊兒學習,一塊兒實踐,經過分工合做,取長補短的方式讓這個過程更加有意義,對於「我想不出這個點怎麼作就只能死磕到底」的這種狀況發生的概率有所降低,而是「一個想不出來,另外一個換一個思路就能夠想出了」的狀況有所增長,這是一個共同促進的效果。從實踐上來是,也確實是能夠達到1+1>2的效果,可是也不是理論上的那麼順利,由於一我的有一我的的問題,兩我的有兩我的的問題,在開始的時候會在溝通或思想上有所分歧,可是通過磨合以後兩我的的想法總會不謀而合,也就慢慢的好了,總的來講,經過此次實驗,我從同伴身上、結對編程中學到了不少。遺憾的是,沒能在有限的時間內想辦法將所需實現的功能所有實現,下次還須要更加努力