201871010109-胡歡歡 實驗三 軟件工程結對項目—《D{0-1}KP 實例數據集算法實驗平台》項目報告


博文名稱: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章內容,理解並掌握代碼風格規范、代碼設計規范、代碼復審、結對編程概念;
通過閱讀,做出如下總結:

  1. 代碼風格規范。主要是文字上的規定,看似表面文章,實際上非常重要。代碼風格的原則是:簡明,易讀,無二義性
  2. 代碼設計規范:牽扯到程序設計、模塊之間的關系、設計模式等。比如針對函數,他的最重要的原則就是:只做一件事,並且要做好。
  3. 代碼復審:看代碼是否在代碼規范的框架內正確地解決了問題。代碼復審的三種形式:自我復審、同伴復審、團隊復審。目的是找出代碼錯誤、發現邏輯錯誤、發現算法錯誤、發現潛在的錯誤和回歸性錯誤、發現可能需要改進的地方、傳授經驗;代碼復審后把記錄整理出來:更正明顯的錯誤、記錄無法很快更正的錯誤、把所有的錯誤記在自己的一個“我常犯的錯誤”表中,作為以后自我復審的第一步。
  4. 結對編程是一種敏捷軟件開發的方法,兩個程序員在一個計算機上共同工作。一個人輸入代碼,而另一個人審查他輸入的每一行代碼。輸入代碼的人稱作駕駛員,審查代碼的人稱作觀察員(或導航員)。兩個程序員經常互換角色。在結對編程模式下,兩個人肩並肩地、平等地、互補地進行開發工作。

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

任務三

  1. 需求分析陳述(5分)
    對於本次作業,考慮到實現的難易程度以及用戶體驗,我們決定采用前后端分離思想,結合使用flask+Amaze UI框架+MySQL數據庫完成開發。
  • 框架說明
    flask用於開發服務端接口,Amaze UI用於開發前端界面,發送請求獲取數據並完成數據渲染。數據庫采用MySQL。

  • 接口說明
    后端有5大接口,分別是:散點圖繪制接口,排序接口,回溯求解接口,動態規划求解接口,用戶算法評測接口。

  • 界面說明
    針對這5大接口,分別對應前端的5個界面,各界面需要完成請求數據,解析響應結果,響應結果數據渲染。

  • 代碼規范說明

  1. 軟件設計說明(5分)
  • 后端接口設計說明,如圖

  • 后端接口目錄結構,如圖,其中,src文件夾存放項目源代碼,static文件夾存放靜態資源,upload文件夾存放測評文件與測評代碼,app.py為程序的主文件

  • 界面設計說明

  1. 軟件實現及核心功能代碼展示(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)
  1. 程序運行(2分)
  • 散點圖繪制,如圖

  • 回溯法求解,如圖

  • 動態規划求解,如圖

  • 動態測評,如圖

  • 保存歷史測評數據到服務端,類似於日志,如圖

  1. 描述結對的過程,提供兩人在討論、細化和編程時的結對照片(3分)

  2. 提供此次結對作業的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
  1. 小結感受(4分)
    通過本次結對編程作業,我感受到多人合作開發如果制定一個良好的計划,就可以極大的提高開發效率,反之,如果沒有計划好,事先沒有商議,則會為開發帶來極大的困難,另外,交流和討論時可以采取線上交流的方式,線上交流陳本要低很多,而且更加靈活,在本次開發過程中,我們就是因為事先通過在線交流等,明確了每個人的任務以及代碼規范,才使得互相看代碼時不至於看不懂,還有前后端數據交互的格式的提前制定,也使得前后端對接相對得心應手。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM