項目 | 內容 |
---|---|
課程班級博客鏈接 | https://edu.cnblogs.com/campus/xbsf/2018CST?filter=all |
這個作業要求鏈接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的課程學習目標 | 1. 熟悉github操作 2. 熟悉springboot+vue網站開發的技術 3.加深對D{0-1}問題的解法的理解 4.熟悉java語言開發程序的一般流程 5.掌握程序設計的模塊化開發 6.熟悉PSP流程 7.體驗軟件項目開發中的兩人合作,練習(結對編程) 8.掌握Github協作開發程序的操作方法 |
這個作業在哪些方面幫助我實現學習目標 | 1. 更加熟練git的相關操作 2. 熟練markdown編輯器的使用方法 3.溫習使用前后端分離技術開發網站的過程 4.學會算法設計的思想 5.學會GitHub協作開發的操作 6.體驗到了結對編程的好處 |
結對方學號-姓名 | 201871010111-劉佳華 |
結對方本次博客作業鏈接 | https://www.cnblogs.com/JerryLau-213/p/14652158.html |
項目Github的倉庫鏈接地址 | 1.后台數據接口: https://github.com/beike666/bag_serve_better 2.前台頁面:https://github.com/beike666/bag_client |
博客正文
任務1:閱讀《現代軟件工程—構建之法》第3-4章內容,理解並掌握代碼風格規范、代碼設計規范、代碼復審、結對編程概念
- 代碼風格規范:就是代碼格式的一些要求。主要有以下幾個方面:
- 縮進
- 行寬
- 括號
- 斷行與空白的{}行
- 分行
- 命名
- 下划線
- 大小寫
- 注釋
- 縮進
代碼風格規范的原則是簡明、易讀、無二異性。
- 代碼設計規范:不光是程序書寫的格式問題,而且牽涉到程序設計、模塊之間的關系、設計模式等方方面面。主要體現在以下幾個方面:
-
函數
-
goto
-
錯誤處理
- 參數處理
- 斷言
- 參數處理
-
如何處理C++中的類
- 類
- class vs.struct
- 公共/保護/私有成員(public、protected和private)
- 數據成員
- 虛函數
- 構造函數
- 折構函數
- new和delete
- 運算符(Operators)
- 異常(Exceptions)
- 類型繼承(Class Inheritance)
- 類
-
- 代碼復審:查看代碼是否符合代碼規范,找出軟件開發過程中的錯誤,降低軟件開發后期維護的難度,提高軟件的質量和可靠性。
-
結對編程:結對編程中有兩個角色:領航員和駕駛員。在個人編寫的過程中,很多人喜歡根據個人喜好來規定代碼規范,而且存在的bug自己難以發現,因此,在結對編程時,我們可以互換角色,在開始寫代碼之前,規定兩個人都認可的一套代碼規范,並且不間斷地進行復審,以減少軟件中存在的問題,修復bug,提高軟件質量。
任務2:兩兩自由結對,對結對方《實驗二 軟件工程個人項目》的項目成果進行評價,具體要求如下:
(1)對項目博文作業進行閱讀並進行評論,評論要點包括:博文結構、博文內容、博文結構與PSP中“任務內容”列的關系、PSP中“計划共完成需要的時間”與“實際完成需要的時間”兩列數據的差異化分析與原因探究,將以上評論內容發布到博客評論區。
-
結對方博客鏈接
https://www.cnblogs.com/JerryLau-213/p/14587753.html -
結對方Github項目倉庫鏈接
https://github.com/jerryLau-hua/D-0-1-Problem -
符合(1)要求的博客評論
(2)克隆結對方項目源碼到本地機器,閱讀並測試運行代碼,參照《現代軟件工程—構建之法》4.4.3節核查表復審同伴項目代碼並記錄。
- 克隆結對方項目源碼
- 測試運行代碼
- 符合(2)要求的代碼核查表
項目的開發者:劉佳華
項目的復審者:常龍龍
復審原則 | 內容 |
---|---|
概要部分 | |
代碼符合需求和規格說明么? | 代碼符合需求 缺少相應的規范說明,參照《碼出高效—阿里巴巴開發手冊》的代碼規范來看,代碼是符合規范說明的 |
代碼設計是否考慮周全? | 考慮周全 |
代碼可讀性如何? | 可以順利讀下去 |
代碼容易維護么? | 比較容易維護 |
代碼的每一行都執行並檢查過了嗎? | 是的,都可以執行 |
設計規范部分 | |
設計是否遵從已知的設計模式或項目中常用的模式? | 遵從 |
有沒有硬編碼或字符串/數字等存在? | 沒有 |
代碼有沒有依賴於某一平台,是否會影響將來的移植? | 沒有,不會影響移植,任何平台都可以 |
開發者新寫的代碼能否用已有的Library/SDK/Framework中的功能實現? | 可以用 存在,有些代碼是可以調用的 |
有沒有無用的代碼可以清除? | 沒有 |
代碼規范部分 | |
修改的部分符合代碼標准和風格嗎? | 符合,全都按照代碼標准修改的 |
具體代碼部分 | |
有沒有對錯誤進行處理?對於調用的外部函數,是否檢查了返回值或處理了異常? | 使用回溯求解大數據時會出現內存溢出的異常 |
參數傳遞有無錯誤,字符串的長度是字節的長度還是字符(可能是單/雙字節)的長度是以0開始計數還是以1開始計數? | 沒有 |
邊界條件是如何處理的? switch語句的default分支是如何處理的?循環有沒有可能出現死循環? | 沒有出現死循環 |
有沒有使用斷言( Assert)來保證我們認為不變的條件真的得到滿足? | 沒有 |
數據結構中有沒有用不到的元素? | 沒有 |
效能 | |
代碼的效能(Performance)如何?最壞的情況是怎樣的? | 達到了具體任務的要求 |
代碼中,特別是循環中是否有明顯可優化的部分(string的操作是否能用StringBuilder來優化)? | 沒有,已經比較優化了 |
對於系統和網絡的調用是否會超時?如何處理? | 目前沒有出現超時的現象。假如出現了我們會殺毒;整理系統,減少運行的進程,釋放內存、cpu,釋放c盤空間; |
可讀性 | |
代碼可讀性如何?有沒有足夠的注釋? | 可以順利閱讀 有足夠的注釋 |
可測試性 | |
代碼是否需要更新或創建新的單元測試? | 可以繼續開發,測試數據庫的復雜性操作 |
(3)依據復審結果嘗試利用github的Fork、Clone、Push、Pull request、Merge pull request等操作對同伴個人項目倉庫的源碼進行合作修改。
-
我對結對隊友的實驗二項目進行了克隆
-
fork:fork是復制、打分支倉庫的意思
要Fork一個人的代碼倉庫,fork操作會復制一份目標倉庫(包括文件,提交歷史,issues,和其余一些東西),復制后的倉庫在你自己的GitHub帳號下,這個操作是在github服務器上完成的,和本地計算機的倉庫沒有關系。 -
push:將本地倉庫中的項目推送到雲端
-
Pull request:請求別人pull自己的倉庫。
任務3:采用兩人結對編程方式,設計開發一款D{0-1}KP 實例數據集算法實驗平台,使之具有以下功能:
一、需求分析
在上次實驗項目的基礎上進行改進,以下是我基於springboot+vue的網站技術做出的的需求分析:
- 后台要能夠從給定的文件中讀取出正確的數據並保存到數據庫
- java后端給前端傳遞正確的數據,前端根據后端傳的數據繪制散點圖
- java后端實現對自定義數據類型的列表的排序(實現Comparator接口),並向前端傳數據
- 實現java后台解決D{0-1}背包問題的動態規划和回溯算法
- 后台將求解后的數據寫入文件並保存,前端展示文件下載閱覽
- 后台接收用戶發送的算法文件並運行,將運行結果保存到文件然后返回前端
- 后台編寫遺傳算法求解D{0-1}KP
開發環境
名稱 | 版本 |
---|---|
jdk | 1.8.0 |
vue-cli | 3.12.1 |
node.js | 14.15.0 |
git | 2.29.1.windows.1 |
二、功能設計
- D{0-1}KP數據可以保存到數據庫,也可以從數據庫中清除
- 平台可繪制任意一組D{0-1}KP數據以重量為橫軸、價值為縱軸的數據散點圖
- 平台可對任意一組D{0-1}KP數據按項集第三項的價值:重量比進行非遞增排序;
- 在平台上,用戶能夠自主選擇動態規划算法、回溯算法求解指定D{0-1} KP數據的最優解和求解時間(以秒為單位)
- 在平台上,任意一組D{0-1} KP數據的最優解、求解時間和解向量可保存為txt文件或導出EXCEL文件
- 平台可動態嵌入任何一個有效的D{0-1}KP 實例求解算法,並保存算法實驗日志數據
- 平台可使用遺傳算法求解D{0-1}KP
三、設計實現
1. 主要類
2. 數據庫中表的設計
file_data表
volume表
3.關鍵方法代碼
代碼測試功能模塊中,后台調用命令行運行java代碼
//run.bat文件的目錄
String publicFilePath=System.getProperty("user.dir")+System.getProperty("file.separator")
+"code";
String batFilePath=publicFilePath+System.getProperty("file.separator")+"run.bat";
//調用cmd窗口的命令
String command = "cmd.exe /c start /b "+batFilePath;
//run.bat文件對象
File file1 = new File(publicFilePath);
Process p;
try {
//執行命令
p = Runtime.getRuntime().exec(command,null,file1);
endTime=System.currentTimeMillis();
//取得命令結果的輸出流
InputStream fis=p.getInputStream();
//用一個讀輸出流類去讀
InputStreamReader isr=new InputStreamReader(fis);
//用緩沖器讀行
BufferedReader br=new BufferedReader(isr);
String line=null;
//直到讀完為止
while((line=br.readLine())!=null) {
//取出運行結果
Judge judge = new Judge();
boolean bool = judge.isNumeric(line);
if(bool){
currentAnswer=line;
break;
}
}
br.close();
isr.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
將數據保存到數據庫的代碼
for (String profit : result.getProfits()) {
//創建一個數據表對應的類對象
FileData fileData = new FileData();
fileData.setData(profit);
fileData.setType(1);
fileData.setTeam(result.getProfits().indexOf(profit)+1);
fileData.setFile(result.getFileName());
//執行數據庫保存操作
fileDataService.save(fileData);
}
四、程序運行
1. 數據存儲和數據清空
- 數據庫存儲
- 數據表的狀態
- 數據庫清空
- 數據表的狀態
2. 散點圖繪制
3. 數據排序
4.算法求解
- 動態規划算法
- 回溯算法
5.結果文件存儲
- 保存為txt文件
- 查看txt文件
- 保存為execl文件
- 查看execl文件
6.代碼測試
- 提交本地算法代碼
- 選擇數據進行測試
- 查看保存的實驗日志數據
- 查看平台提供的示例代碼
7.下載遺傳算法代碼文件,去6進行測試
- 下載遺傳算法代碼
- 查看下載的遺傳算法
- 上傳代碼進行測試
- 查看測試結果
五、結對編程
-
結對過程描述
1、項目剛開始我們在討論是使用哪種人機交互界面,最終出於頁面效果和開發時間進度方面我們選擇javaWeb頁面,並且使用Springboot+vue的開發方式(因為在上次項目我就使用的網站開發,這次只需要在上次的基礎上進行功能擴展);
2、在項目的具體開展過程中,我們各司其職,我負責網站開發,,劉佳華負責算法設計,網站開發完畢后,劉佳華將項目克隆下來,將算法嵌入到后台代碼中,再push上去等等。最終在我們兩個人的合作之下,完成了本次項目開發
-
結對編程討論照片(部分截圖)
六、本次項目的PSP
PSP | 任務內容 | 計划共完成需要的時間(h) | 實際完成需要的時間(h) |
·Estimate | 估計這個任務需要多少時間,並規划大致工作步驟 | 0.5 | 1 |
Development | 開發 | 36.8 | 38.4 |
·Analysis | 需求分析 (包括學習新技術) | 1 | 1 |
·Design Spec | 生成設計文檔和思路 | 1 | 2 |
·Design Review | 設計復審 | 0.5 | 0.6 |
·Coding Standard | 代碼規范 (為目前的開發制定合適的規范) | 0.3 | 0.3 |
·Design | 具體設計 | 1 | 1 |
·Coding | 具體編碼 | 30 | 30 |
·Code Review | 代碼復審 | 2 | 2 |
·Test | 測試(自我測試,修改代碼,提交修改) | 1 | 1.5 |
Reporting | 博客 | 4 | 8 |
七、GitHub推送記錄
- 后台推送
- 前台推送
八、小結感受
1、結對編程有利有弊,但是總的來說是利大於弊的,1+1的效果>2。
2、結對編程也是一次互相學習的過程,在結對的過程中,我們可以互相幫助,分享學習資源,出現問題也可以一起討論解決,大大加快了項目的開展進度。而且我們分工明確,我負責編寫網站,我的結對隊友(劉佳華)負責編寫算法,我們各司其職,互相交流,一起合作,最終很好的完成了本次項目。
3、在項目開展過程中,我們也會遇到很多的問題,例如網絡質量不佳,GitHub官網進不去,克隆項目也會出現網絡超時的情況,我們只能下載zip包,在本地運行項目;還有遺傳算法求解D{0-1}KP,我們經過查閱資料,最終只做出了遺傳算法求解0-1問題,項目在這方面還有所欠缺。
4、在結對過程我也看到了自己能力上的缺陷,以前學習的時候重視理論課而疏於實踐課,導致和別人在動手實踐上面的差距,需要及時的彌補自己。同時算法方面我真是欠缺太多,在面對這樣的問題時缺乏思路,因此今后我需要補習算法方面的知識,加強軟件課程的學習,在遇到任何問題時都能有一個正確的思路。