博文名稱:201871010109-胡歡歡 實驗三 結對項目—《D{0-1}KP 實例數據集算法實驗平台》項目報告(1分)
博文開頭(1分)
項目 | 內容 |
---|---|
課程班級博客鏈接 | https://edu.cnblogs.com/campus/xbsf/2018CST |
這個作業要求鏈接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的課程學習目標 | 1、學習使用flask框架開發項目 2、了解遺傳算法 3、掌握結對開發軟件項目的基本方法 |
這個作業在哪些方面幫助我實現學習目標 | 1、本次作業促使我初步學習了flask框架的使用 2、本次作業使我基本掌握了多人結對開發的基本方法3、這里還有一個收獲到的小知識,在開發本次項目前我一直不明白程序測評的原理,在設計測評接口時通過查閱資料加思考,我終於明白了,相信在以后遇到類似的需求會更加得心應手 |
結對方學號-姓名 | 201871010114-李岩松 201871010106-丁宣元 |
結對方本次博客作業鏈接 | https://www.cnblogs.com/budinge/p/14630602.html https://www.cnblogs.com/liyansong0198/p/14644940.html |
本項目Github的倉庫鏈接地址 | https://github.com/budinge/Exercise-homework1.git |
任務一:閱讀《現代軟件工程—構建之法》第3-4章內容,理解並掌握代碼風格規范、代碼設計規范、代碼復審、結對編程概念;
通過閱讀,做出如下總結:
- 代碼風格規范。主要是文字上的規定,看似表面文章,實際上非常重要。代碼風格的原則是:簡明,易讀,無二義性
- 代碼設計規范:牽扯到程序設計、模塊之間的關系、設計模式等。比如針對函數,他的最重要的原則就是:只做一件事,並且要做好。
- 代碼復審:看代碼是否在代碼規范的框架內正確地解決了問題。代碼復審的三種形式:自我復審、同伴復審、團隊復審。目的是找出代碼錯誤、發現邏輯錯誤、發現算法錯誤、發現潛在的錯誤和回歸性錯誤、發現可能需要改進的地方、傳授經驗;代碼復審后把記錄整理出來:更正明顯的錯誤、記錄無法很快更正的錯誤、把所有的錯誤記在自己的一個“我常犯的錯誤”表中,作為以后自我復審的第一步。
- 結對編程是一種敏捷軟件開發的方法,兩個程序員在一個計算機上共同工作。一個人輸入代碼,而另一個人審查他輸入的每一行代碼。輸入代碼的人稱作駕駛員,審查代碼的人稱作觀察員(或導航員)。兩個程序員經常互換角色。在結對編程模式下,兩個人肩並肩地、平等地、互補地進行開發工作。
任務二兩兩自由結對,對結對方《實驗二 軟件工程個人項目》的項目成果進行評價:
任務三
- 需求分析陳述(5分)
對於本次作業,考慮到實現的難易程度以及用戶體驗,我們決定采用前后端分離思想,結合使用flask+Amaze UI框架+MySQL數據庫完成開發。
-
框架說明
flask用於開發服務端接口,Amaze UI用於開發前端界面,發送請求獲取數據並完成數據渲染。數據庫采用MySQL。 -
接口說明
后端有5大接口,分別是:散點圖繪制接口,排序接口,回溯求解接口,動態規划求解接口,用戶算法評測接口。 -
界面說明
針對這5大接口,分別對應前端的5個界面,各界面需要完成請求數據,解析響應結果,響應結果數據渲染。 -
代碼規范說明
- 軟件設計說明(5分)
-
后端接口設計說明,如圖
-
后端接口目錄結構,如圖,其中,src文件夾存放項目源代碼,static文件夾存放靜態資源,upload文件夾存放測評文件與測評代碼,app.py為程序的主文件
-
界面設計說明
- 軟件實現及核心功能代碼展示(5分)
- 散點圖繪制接口代碼展示
# 更新散點圖接口
@app.route('/show',methods=['post','get'])
def photo():
# 獲取請求參數
fileName = json.loads(request.get_data())['fileName']
seriesNumber = json.loads(request.get_data())['seriesNumber']
# 創建數據庫操作對象
db = dbManger.dbManger(fileName,seriesNumber)
# 從數據庫讀取信息
pList = db.profitThrre()
wList = db.weightThrre()
# 繪制散點圖
path = show.show(pList,wList)
# 返回圖片路徑
return path
- 排序接口代碼展示
# 排序接口
@app.route('/sort',methods=['post','get'])
def sort():
reDict = {}
# 獲取請求參數
fileName = json.loads(request.get_data())['fileName']
seriesNumber = json.loads(request.get_data())['seriesNumber']
# 創建數據庫操作對象
db = dbManger.dbManger(fileName, seriesNumber)
pwList = db.pwNine()
# 排序
sortList = sortData.sort(pwList)
# 構造響應數據
for item in range(len(sortList)):
p1 = sortList[item][0]
p2 = sortList[item][1]
p3 = sortList[item][2]
w1 = sortList[item][3]
w2 = sortList[item][4]
w3 = sortList[item][5]
pw1 = sortList[item][6]
pw2 = sortList[item][7]
pw3 = sortList[item][8]
data = {"p1":p1,"p2":p2,"p3":p3,"w1":w1,"w2":w2,"w3":w3,"pw1":pw1,"pw2":pw2,"pw3":pw3}
reDict.update({str(item):str(data)})
re = json.dumps(reDict)
print(re)
# 返回排序結果
return re
- 回溯算法求解接口展示
# 回溯法求解接口
@app.route('/flashBack',methods=['post','get'])
def fBack():
# 獲取請求參數
fileName = json.loads(request.get_data())['fileName']
seriesNumber = json.loads(request.get_data())['seriesNumber']
maxWeight = json.loads(request.get_data())['maxWeight']
# 創建數據庫操作對象
db = dbManger.dbManger(fileName, seriesNumber)
# 讀取數據
pList = db.profitThrre()
wList = db.weightThrre()
# 回溯法求解
time1 = time.time()
flashBack.flashBack(maxWeight,-1,3,0,0,pList,wList)
time2 = time.time()
# 獲取返回值
re = flashBack.re()
# 構造響應數據
reDict = {'maxProfit':re,'time':time2-time1}
# 返回求解結果
return reDict
- 動態規划算法求解接口展示
# 動態規划求解接口
@app.route('/dp',methods=['post','get'])
def d():
# 獲取請求數據
fileName = json.loads(request.get_data())['fileName']
seriesNumber = json.loads(request.get_data())['seriesNumber']
maxWeight = json.loads(request.get_data())['maxWeight']
# 創建數據庫操作對象
db = dbManger.dbManger(fileName, seriesNumber)
# 讀取數據
pList = db.profitThrre()
wList = db.weightThrre()
#動態規划求解
time1 = time.time()
re = dp.dp(maxWeight,pList,wList)
time2 = time.time()
# 構造響應對象
reDict = {'maxProfit':re,'time':time2-time1}
# 返回求解結果
return reDict
- 動態測評接口代碼展示
# 動態測評接口
@app.route('/upload',methods=['post','get'])
def upPrograme():
# 讀取的文件名
fileName = json.loads(request.get_data())['fileName']
# 第幾組數據
seriesNumber = json.loads(request.get_data())['seriesNumber']
# 代碼類型
fileType = json.loads(request.get_data())['fileType']
# 代碼
value = json.loads(request.get_data())['value']
# 最大價值
maxWeight = json.loads(request.get_data())['maxWeight']
# 數據庫讀取數據
db = dbManger.dbManger(fileName, seriesNumber)
pList = db.profitThrre()
wList = db.weightThrre()
# 拼接得到文件名
file = 'userTest.'+fileType
# 保存代碼到文件
upload.up(file,value)
# 運行測試代碼
reDict = {'outStr':runPy.runP(pList,wList,maxWeight).split('----')[0].strip('\n'),'userOutStr':runPy.runP(pList,wList,maxWeight).split('----')[1].strip('\n')}
# 返回測評結果
return json.dumps(reDict)
- 程序運行(2分)
-
散點圖繪制,如圖
-
回溯法求解,如圖
-
動態規划求解,如圖
-
動態測評,如圖
-
保存歷史測評數據到服務端,類似於日志,如圖
-
描述結對的過程,提供兩人在討論、細化和編程時的結對照片(3分)
-
提供此次結對作業的PSP(4分)
PSP2.1 | 任務內容 | 計划共完成需要的時間(h) | 實際完成需要的時間(h) |
---|---|---|---|
Planning | 計划 | 0.5 | 0.5 |
nbsp; Estimate | 估計這個任務需要多少時間,並規划大致工作步驟 | 0.5 | 0.5 |
Development | 開發 | 22 | 28 |
nbsp; Analysis | 需求分析(包括學習新的技術) | 8 | 14 |
nbsp; Design Spec | 生成設計文檔 | 1 | 1 |
nbsp; Design Review | 設計復審 | 0.5 | 0.5 |
nbsp; Coding Standard | 代碼規范(為開發制定合適的規范) | 1 | 0.5 |
nbsp; Design | 具體設計 | 1.5 | 0.5 |
nbsp; Coding | 具體編碼 | 67 | 10 |
nbsp; Code Review | 代碼復審 | 1 | 0.5 |
nbsp; Test | 測試(自我測試,修改代碼,提交修改) | 2 | 4 |
Reporting | 報告 | 2 | 1.2 |
nbsp; Test Report | 測試報告 | 1 | 0.5 |
nbsp; Size Measurement | 計算工作量 | 0.5 | 0.2 |
nbsp; Postmortem & Process Improvement Plan | 事后總結 ,並提出過程改進計划 | 0.5 | 0.5 |
- 小結感受(4分)
通過本次結對編程作業,我感受到多人合作開發如果制定一個良好的計划,就可以極大的提高開發效率,反之,如果沒有計划好,事先沒有商議,則會為開發帶來極大的困難,另外,交流和討論時可以采取線上交流的方式,線上交流陳本要低很多,而且更加靈活,在本次開發過程中,我們就是因為事先通過在線交流等,明確了每個人的任務以及代碼規范,才使得互相看代碼時不至於看不懂,還有前后端數據交互的格式的提前制定,也使得前后端對接相對得心應手。