項目 | 內容 |
---|---|
班級博客鏈接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
這個作業要求鏈接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的課程學習目標 | (1)體驗軟件項目開發中的兩人合作,練習結對編程(Pair programming);(2)掌握Github協作開發程序的操作方法。 |
這個作業在哪些方面幫助我實現學習目標 | 結對編程、和同伴如何分工以及與同伴如何更好的交流 |
結對方學號-姓名 | 201771010129-王穎奇 |
結對方本次博客作業鏈接 | https://www.cnblogs.com/1556889081wyq/p/12546166.html |
本項目Github的倉庫鏈接地址 | https://github.com/wyq1998/System-second |
任務1:閱讀《現代軟件工程—構建之法》第3-4章內容,理解並掌握代碼風格規范、代碼設計規范、代碼復審、結對編程概念;
已完成
- 代碼風格規范:就是代碼格式的一些要求。主要有以下幾個方面:
- 縮進
- 行寬
- 括號
- 斷行與空白的{}行
- 分行
- 命名
- 下划線
- 大小寫
- 注釋
代碼風格規范的原則是簡明、易讀、無二異性。
- 代碼設計規范:不光是程序書寫的格式問題,而且牽涉到程序設計、模塊之間的關系、設計模式等方方面面。主要體現在以下幾個方面:
- 函數
- goto
- 錯誤處理
- 參數處理
- 斷言
- 如何處理C++中的類
- 類
- class vs.struct
- 公共/保護/私有成員(public、protected和private)
- 數據成員
- 虛函數
- 構造函數
- 折構函數
- new和delete
- 運算符(Operators)
- 異常(Exceptions)
- 類型繼承(Class Inheritance)
- 代碼復審:查看代碼是否符合代碼規范,找出軟件開發過程中的錯誤,降低軟件開發后期維護的難度,提高軟件的質量和可靠性。
- 結對編程:結對編程中有兩個角色:領航員和駕駛員。在個人編寫的過程中,很多人喜歡根據個人喜好來規定代碼規范,而且存在的bug自己難以發現,因此,在結對編程時,我們可以互換角色,在開始寫代碼之前,規定兩個人都認可的一套代碼規范,並且不間斷地進行復審,以減少軟件中存在的問題,修復bug,提高軟件質量。
任務2:兩兩自由結對,對結對方《實驗二 軟件工程個人項目》的項目成果進行評價,具體要求如下:
(1)對項目博文作業進行閱讀並進行評論,評論要點包括:博文結構、博文內容、博文結構與PSP中“任務內容”列的關系、PSP中“計划共完成需要的時間”與“實際完成需要的時間”兩列數據的差異化分析與原因探究,將以上評論內容發布到博客評論區。
(2)克隆結對方項目源碼到本地機器,閱讀並測試運行代碼,參照《現代軟件工程—構建之法》4.4.3節核查表復審同伴項目代碼並記錄。
(3)依據復審結果嘗試利用github的Fork、Clone、Push、Pull request、Merge pull request等操作對同伴個人項目倉庫的源碼進行合作修改。
-
結對方博客鏈接
https://www.cnblogs.com/1556889081wyq/p/12420607.html -
結對方Github項目倉庫鏈接
https://github.com/wyq1998/- -
符合(1)要求的博客評論
評論如下圖所示,也可去結對方作業博客評論區查看
-
符合(2)要求的代碼核查表
項目的開發者:王穎奇
項目的復審者:李婷華1、概要部分
(1)代碼符合需求和規格說明么?
代碼符合需求
缺少相應的規范說明,參照《碼出高效—阿里巴巴開發手冊》的代碼規范來看,代碼是符合規范說明的(2)代碼設計是否考慮周全?
考慮周全(3)代碼可讀性如何?
可以順利讀下去(4)代碼容易維護么?
比較容易維護(5)代碼的每一行都執行並檢查過了嗎?
是的,都可以執行2.設計規范部分
(1)設計是否遵從已知的設計模式或項目中常用的模式?
遵從(2)有沒有硬編碼或字符串/數字等存在?
沒有(3)代碼有沒有依賴於某一平台,是否會影響將來的移植(如Win32到Win64)?
沒有,不會影響移植,任何平台都可以(4)開發者新寫的代碼能否用已有的Library/SDK/Framework中的功能實現?在本項目中是否存在類似的功能可以調用而不用全部重新實現?
可以用
存在,有些代碼是可以調用的(5)有沒有無用的代碼可以清除?(很多人想保留盡可能多的代碼,因為以后可能會用上,這樣導致程序文件中有很多注釋掉的代碼,這些代碼都可以刪除,因為源代碼控制已經保存了原來的老代碼)
基本清除完畢了3.代碼規范部分
修改的部分符合代碼標准和風格么?
符合,全都按照代碼標准修改的4.具體代碼部分
(1)有沒有對錯誤進行處理?對於調用的外部函數,是否檢查了返回值或處理了異常?
對錯誤都進行了處理,沒有異常(2)參數傳遞有無錯誤,字符串的長度是字節的長度還是字符(可能是單/雙字節)的長度,是以0開始計數還是以1開始計數?
無錯誤
本項目中不涉及字符串(3)邊界條件是如何處理的?switch語句的default分支是如何處理的?循環有沒有可能出現死循環?
switch語句的default分支返回false,沒有出現死循環(4)有沒有使用斷言(Assert)來保證我們認為不變的條件真的得到滿足?
有(5)對資源的利用是在哪里申請,在哪里釋放的?有沒有可能導致資源泄露(內存、文件、各種GUI資源、數據庫訪問的連接,等等)?有沒有優化的空間?
在對數據庫進行操作之前申請數據庫連接資源,操作完畢之后釋放申請的資源
不會導致資源泄露
可以優化使用斷言來保證我們認為不變的條件(6)數據結構中有沒有用不到的元素?
沒有5.效能
(1)代碼的效能(Performance)如何?最壞的情況如何?
達到了具體任務的要求(2)代碼中,特別是循環中是否有明顯可優化的部分(C++中反復創建類,C#中 string 的操作是否能用StringBuilder 來優化)?
沒有,已經比較優化了(3)對於系統和網絡調用是否會超時?如何處理?
目前沒有出現超時的現象。假如出現了我們會殺毒;整理系統,減少運行的進程,釋放內存、cpu,釋放c盤空間;6.可讀性
代碼可讀性如何?有沒有足夠的注釋?
可以順利讀取
代碼有足夠的注釋讓我們讀懂7.可測試性
代碼是否需要更新或創建新的單元測試?針對特定領域的開發(如數據庫、網頁、多線程等),可以整理專門的核查表。
可以繼續開發,擺脫傳統的命令行方式,更為實用
- 結對方項目倉庫中的Fork、Clone、Push、Pull request、Merge pull request日志數據
已完成。Fork、Push、Pull request、Merge pull request等日志數據可從結對方github中查看,我就只列出Clone的數據
任務3:采用兩人結對編程方式,結合我校師生疫情每日上報系統使用體驗,設計開發一款符合我校疫情防控工作需求的信息系統,使之具有以下功能:
1、可采集全校各類師生員工疫情信息;
2、各二級部門疫情防控工作負責人可查看本部門人員疫情匯總,並提供高級查詢功能進行多屬性組合查詢和可視化統計功能;
3、學校防控辦指定負責人登錄《西北師范大學疫情防控信息統計》子系統,可瀏覽所有人員填報匯總數據清單,利用【高級查詢】可進行數據組合篩選,系統以圖形化方式展示各學院已填報和未填報學生統計情況和關鍵疫情數據統計情況,可【導出】查詢列表的EXCEL文件;
4、人機交互界面要求GUI界面(WEB頁面、APP頁面都可);
5、附加分功能:定時填報提醒
1、需求分析陳述。
(1)學生、教職工可以進入系統填寫自己的疫情信息;
(2)二級防疫部門負責人可查看自己部門人員的疫情信息;
(3)防控辦負責人可查看所有人員的疫情信息並查看各類情況的統計數據。
2、軟件設計說明。
- 登錄模塊設置5類人員,分別是學生、教職工、二級防疫部門人員、二級防疫部門負責人、學校防控辦人員。建立的數據表如下:
(1)users表
users表用來存儲各級用戶的登錄信息,其中Uname是這五類人員的用戶名,Upassword是這五類用戶的登錄密碼,Utype代表了這五類用戶的身份,Utype=1代表學生,Utype=2代表二級防疫部門人員,Utype=3代表二級防疫部門負責人,Utype=4代表學校防控辦人員,Utype=5代表教職工。
(2)ES表
ES表用來存儲各級用戶的填報信息,其中Sno代表學生的學號或者教職工的工號,Sname代表學生的學號或者教職工的姓名,Es代表學生的學號或者教職工的感染情況,Province代表了各級用戶所屬的部門,Scheckin代表學生的學號或者教職工的填報日期,Utype表示屬於哪一類用戶。
- 主要的功能:
(1)師生可登錄系統進行疫情信息的填報;
(2)二級防疫部門人員可進行疫情信息的填報;
(3)二級防疫部門負責人可對本部門人員的信息進行增刪改查,可根據姓名進行模糊查詢,根據學號、填報日期、感染情況進行准確查詢,可查看感染情況的統計數據(用柱狀圖來表示),這里的感染情況查詢是查看具體的某一天。
(4)學校防控辦人員可以進行增刪改查等功能,可以按照學號、時間、感染情況等進行准確查詢,按照姓名進行模糊查詢,可查看感染情況和填報情況的統計數據,可以查看學生和教職工統計信息的匯總。
3、軟件實現及核心功能代碼展示:軟件包括哪些類,這些類分別負責什么功能,他們之間的關系怎樣?類內有哪些重要的方法,關鍵的方法是否需要畫出流程圖?
- 軟件包括login類、GetConnection類、Users類、CheckUsers類、DormitoryInfo類。
- login類用來做登錄界面,根據用戶類型進行登錄,另外,提醒用戶打卡的功能也封裝在該類中。
- GetConnection類主要用來連接數據庫。
- Users用戶類,聲明私有變量name(用戶名),password(用戶密碼),type(用戶類型)。類內有封裝各自屬性的方法:set(),get()。
- CheckUsers類將從數據庫中獲取的數據存儲到數據集中備用。
- DormitoryInfo類負責主要功能的實現。
- DormitoryInfo類負責login里面每類用戶對應的功能的實現,在實現功能時會調用GetConnection類、CheckUsers類。
- DormitoryInfo類里面有生成柱狀圖和餅狀圖及Excel導出的方法。還有對學生、教職工信息的增刪改查等的方法。
4、程序運行:程序運行時每個功能界面截圖。擴展功能實現可得附加分5分。
(1)學生登錄系統
-
登錄界面
-
學生登錄系統進行信息的填寫
(2)二級防疫部門人員登錄
-
登錄界面
-
二級防疫部門人員進行信息填寫
(3)二級防疫部門負責人登錄
-
登錄界面
-
二級防疫部門負責人添加人員信息
-
添加前
-
添加后
-
-
二級防疫部門負責人刪除人員信息
-
二級防疫部門負責人修改人員信息
-
修改前
-
修改后
-
-
二級防疫部門負責人根據學號進行查詢
-
二級防疫部門負責人根據姓名模糊查詢
-
二級防疫部門負責人根據時間准確查詢
-
二級防疫部門負責人根據感染情況進行查詢
-
二級防疫部門負責人查看感染情況統計圖
(4)防控辦人員登錄
-
登錄界面
-
添加人員信息功能:可以添加學生、學校二級防疫部門成員、學校二級防疫部門負責人、學校防控辦等人員的信息,這里以添加學生信息為例
-
添加前
-
添加后
-
-
刪除人員信息
-
修改前
-
修改后
-
-
根據學號准確查詢
-
根據姓名模糊查詢
-
根據時間准確查詢
-
根據感染情況查詢
-
查看某天的感染情況統計圖
生成的餅狀圖
-
查看某人某天情況
-
查看填報情況統計圖
-
先填入總人數
-
彈出填報人數統計圖
-
導出excel表
-
-
查看學生統計信息匯總
-
查看教職工統計信息匯總
(5)教職工登錄系統
-
登錄界面
-
進行信息填報
(6)打卡提醒功能
這個功能的實現,我們經過討論之后,決定設置一個鬧鍾來實現,在登錄系統之前,用戶可以設置一個鬧鍾,當設置的鬧鍾與系統獲取到的時間相同時,就會播放一段音樂,來提醒你該打卡了。
由於音樂片段無法截圖來展示,就展示一下這個功能實現的代碼。
實現的代碼如下:
static void playMusic() {// 背景音樂播放
try {
java.net.URL cb;
File f = new File("src/images/Taylor+Swift+-+Ours.wav"); // 引號里面的是音樂文件所在的路徑
cb = f.toURL();
AudioClip aau;
aau = Applet.newAudioClip(cb);
aau.play();
aau.loop();// 循環播放
System.out.println("可以播放");
// 循環播放 aau.play()
// 單曲 aau.stop()停止播放
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new login();
String z = JOptionPane.showInputDialog("鬧鍾:");
Runnable runnable = new Runnable() {
// 創建 run 方法
public void run() {
// 獲取電腦時間
java.util.Date utildate = new java.util.Date();
str = DateFormat.getTimeInstance().format(utildate);
System.out.println(str);
System.out.println("Hello!");
b = str.compareTo(z);
if (b == 0) {
System.out.println("1!");
playMusic();
}
}
};
5、描述結對的過程,提供兩人在討論、細化和編程時的微信或QQ截圖(截圖要完整,能夠顯示結對雙方姓名)
-
先是討論具體頁面用什么方式實現,由於學藝不精,做一個優美的Web界面目前還存在問題,我們就決定做一個GUI的界面。
-
實驗二我們都做的是命令行方式的系統,所以導出Excel部分需要商討一下如何實現,其他功能的實現起來比較簡單一點,就沒怎么細細討論。
6、提供此次結對作業的PSP。
PSP2.1 | 任務內容 | 計划共完成需要的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
Planning | 計划 | 15 | 15 |
·Estimate | · 估計這個任務需要多少時間,並規划大致工作步驟 | 15 | 15 |
Development | 開發 | 540 | 960 |
·· Analysis | 需求分析 (包括學習新技術) | 30 | 60 |
·Design Spec | 生成設計文檔 | 15 | 15 |
·Design Review | 設計復審 (和同事審核設計文檔) | 30 | 30 |
·Coding Standard | 代碼規范 (為目前的開發制定合適的規范) | 15 | 15 |
·Design | 具體設計 | 60 | 120 |
·Coding | 具體編碼 | 300 | 600 |
·Code Review | 代碼復審 | 60 | 60 |
·Test | 測試(自我測試,修改代碼,提交修改) | 30 | 60 |
Reporting | 報告 | 75 | 195 |
··Test Report | 測試報告 | 30 | 120 |
·Size Measurement | 計算工作量 | 15 | 15 |
·Postmortem & Process Improvement Plan | 事后總結 ,並提出過程改進計划 | 30 | 60 |
7、小結感受:兩人合作真的能夠帶來1+1>2的效果嗎?通過這次結對合作,請談談你的感受和體會。
我感覺兩個人合作的效率還是比較高的,在合作的過程中,結對的伙伴之間可以相互學習,共同進步。在問題的解決上可以,不同的人會有不同的方法,結對編程時可以兩個人交流,互相學習,最終會找到一個行之有效的高效解決方案。在項目完成方面,結對編程還是會帶來1+1>2的效果。而且兩個人可以互換角色,更好的改進程序,此外自己編寫程序時,有些bug自己發現不了,在結對編程時,同伴可以幫你更好的處理這些問題。但是每個人的性格,做事方式還是會有一定的差異,在結對編程的過程中,需要通過正確的方法來溝通,以保證團隊工作的順利進行。