天天看點

2016012084結對作業項目報告

倉庫:https://git.coding.net/librarian1/Operation_Generation_Validate.git

網站:http://ali.hellowood.com.cn:8089/ 出題做題都能實作,如果生成題目數量較多,會有一點延遲

隊友:馬越 http://www.cnblogs.com/mayue-/p/8768455.html

目錄

  • 需求分析
  • 接口設計方法
  • 計算子產品
    • 計算子產品接口設計與實作
    • 計算子產品接口性能改進
    • 計算子產品單元測試
    • 計算子產品異常處理說明
  • 界面子產品
    • 界面子產品設計
    • 界面與計算子產品對接
  • 結對
    • 結對過程
    • 結點優缺點
  • PSP展示

帶界面四則運算出題網頁程式

  • 基本功能:

    定制出題要求:

    -n題目數量範圍1 ~ 10000

    -m [lower] [upper] 設定題目數值的範圍(包括原始題目與運算過程中所有中間結果的絕對值的數值範圍)下界參數範圍為 1到100,上界參數範圍為 50到1000

    -o題目中最多有多少個運算符,預設為1,範圍1 ~ 10,除非指定運為1,否則每個算式運算符大于等于2

    -c題目中是否包含乘除法

    -b題目中是否包含括号

    運算過程中不得出現小數,可以出現負數。

    生成result.txt

  • 做題功能:

    不包括分數,但可能會出現負數與括号

    在背景解析題目;

    将題目挨個順序展示,讓使用者答題;

    使用者答題結束後,軟體可統計本次使用者的答題時長與答對題目的數量。

  • 附加功能

    計時器

Information Hiding資訊隐藏

1972年,David Parnas 發表了一篇題為《論将系統分解為子產品的準則》的論文首次讓公衆注意到資訊隐藏這一概念。

資訊隐藏式結構程式設計與面向對象設計的基礎之一。在面向對象設計中,它又引出了封裝和子產品化的概念,并與抽象的概念緊密相關。

in Parnas's seminal 1972 paper On the Criteria to Be Used in Decomposing Systems into Modules, this dictum is expressed in terms of information hiding, and the terms cohesion and coupling are not used. 來自維基百科

這是論文on the criteria to be used in decomposing systems into modules summary的英文PDF

下載下傳

資訊隐藏是軟體的首要技術使命中格外重要的一種啟發式方法,因為它強調的就是隐藏複雜度。

loose coupling 松耦合

在電腦運算和系統設計中,一個松耦合的系統中的每一個元件對其他獨立元件的定義所知甚少或一無所知。子範圍包括類、接口、資料和服務之間的耦合。

做法:

将出題功能與做題功能設計為2個類;

為每一個具體的出題參數設計一個接口,在生成題目的generation類中實作這些接口,并且對這個類進行封裝;

在設計中不寫入具體數字,而是設計常量;

避免循環調用,每一個類的方法都盡量封閉,不需要互相調用。

實作松耦合,接口可以由具體類generation和validate直接實作,而不需要改變依賴類interface,使得軟體設計具有可擴充性

2016012084結對作業項目報告

關鍵算法:

  • 做題算法
  • 出題算法

    生成算子算符 —— 算結果并判斷合法——生成算式(加括号)——輸出

如何使用排程場算法

  1. 先随機生成一串算子(整數)和一串算符(按算符參數要求),存入兩個連結清單

算子:A B C D

算符:x y z

  1. 算結果并判斷合法

    整數加減乘除,有優先級

    逐漸計算出結果,一旦過程出現分母為零或小數,則跳出

A x B y C z D

注意:這其中會出現

A + B * C

從左至右的運算,但之後輸出算式會是

(A + B)* C

  1. 生成算式(加括号)

    整數加減乘除

    設定2個整型priority1 ,priority2 對算子串中前後兩個算子進行優先級判斷,

    +

    -

    為低優先級0,

    ×

    /

    為高優先級1。

    如果priority1 ,priority2 為

    01

    那麼在兩端加括号,否則

    00 10 11

    則不加。

用Junit4對generation類和validate類中每一個方法進行單元測試,因為是第一次寫單元測試,是以一開始簡直毫無頭緒,後來決定用簡單的assert斷言來編寫測試,并且遵照了一部分單元測試的原則,即

Right. 結果是否正确.
Boundary. 主要是CORRECT 原則
Independent. 一個測試應隻專注于一個函數,或一組函數.
  • validate類中doResult方法的單元測試

    覆寫率:100%

2016012084結對作業項目報告
  • generation類中operation,operator,character,bracket方法的單元測試
2016012084結對作業項目報告
  • operator類
    2016012084結對作業項目報告
  • operation類
    2016012084結對作業項目報告

2016012084結對作業項目報告

對于題目數量,數值範圍,運算符數量和題目要求輸入等四個接口分别設計了異常。

異常寫在了枚舉類enum裡面,然後在頁面輸入那些題目要求的時候會對每個輸入框進行判斷,如果有異常會走背景的方法輸出異常

  • EXCEPTION_TITEL_NUMBER

    未設定題目數量或題目數量不符合規定

  • EXCEPTION_NUMBER_RANGE

    未設定數值範圍或數值範圍不符合規定

  • EXCEPTION_SIGN_NUMBER

    未設定運算符數量或運算符數量不符合規定

  • 題目要求未送出

我負責的是後端計算子產品的設計,指令行的實作和單元測試,界面子產品由馬越同學負責。

  • 定制做題
    2016012084結對作業項目報告
  • 計時器和展示題目
    2016012084結對作業項目報告
  • 判斷對錯和記錄
    2016012084結對作業項目報告
  • 展示正确答案
    2016012084結對作業項目報告

兩個servlet

  • GenerationServlet類 ——負責出題做題

    用表單将前台的參數傳給generation類。然後生成String類型的字元串傳給servlet,在servlet中寫入的檔案。

  • UploadServlet類 ——負責解析做題

2016012084結對作業項目報告

結對優缺點

  • 缺點

    付出了兩個人的努力卻隻得到了一個人的生産力,在剛剛開始結對程式設計時的确如此,兩個同學都各自寫各自的代碼,最後還要将對方的代碼再看一遍。

    剛開始結對時,對于自己的設計都會更加自信,類似“如果我自己做速度會更快”,特别是後期如果出現什麼BUG,就會加大這種分歧。

  • 優點,

    我負責後端算法,馬越負責前端界面,兩個不同領域的人可以互補學習,能産出更優秀的代碼。

    兩人還能夠從互相的交流中受益,通常能寫出更加高效的代碼。

隊友互評

馬越:

  • 做事果斷,行動力強
  • 比較浮躁 無法集中注意力

    我(唐祎琳):

  • 喜歡思考比較有挑戰的問題,不畏懼難題
  • 不喜歡求助

任務内容 計劃共完成需要的時間(min) 實際完成需要的時間(min)
計劃 5
· 估計這個任務需要多少時間,并規劃大緻工作步驟
開發 782 1175
· 需求分析 (包括學習新技術) 60 90
· 生成設計文檔 10
· 設計複審 (和同僚稽核設計文檔) 2
· 代碼規範 (為目前的開發制定合适的規範)
· 具體設計
· 具體編碼 480 540
· 代碼複審 30
· 測試(自我測試,修改代碼,送出修改) 120 180
報告 55 37
· 測試報告 40
· 計算工作量
· 事後總結, 并提出過程改進計劃

總結與改進

對于這一次的項目,是在單純的寫程式的基礎上加上了測試和異常,還有使用者界面的實作,這些都是我以前不感興趣的内容,我總覺的過于簡單了,不如算法有趣,但是實踐才發現并非如此,其實測試也需要優秀的代碼和思考,異常需要全面的考慮,界面需要有審美與使用者體驗的關注。