一.項目地址
https://git.coding.net/chenxin1998/Arithmetic.git
https://git.coding.net/maleping/Amerithic.git
二.預計完成項目時間(PSP)
|
PSP2.1 |
任務內容 |
計劃共完成需要的時間(h) |
實際完成需要的時間(h) |
|
Planning |
計劃 |
15 |
17 |
|
· Estimate |
· 估計這個任務需要多少時間,并規劃大致工作步驟 |
18 |
20 |
|
Development |
開發 |
98 |
100 |
|
·· Analysis |
需求分析 (包括學習新技術) |
52 |
54 |
|
· Design Spec |
· 生成設計文檔 |
22 |
24 |
|
· Design Review |
· 設計復審 (和同事審核設計文檔) |
18 |
20 |
|
· Coding Standard |
代碼規范 (為目前的開發制定合適的規范) |
12 |
16 |
|
· Design |
具體設計 |
26 |
28 |
|
· Coding |
具體編碼 |
48 |
56 |
|
· Code Review |
· 代碼復審 |
7 |
9 |
|
· Test |
· 測試(自我測試,修改代碼,提交修改) |
18 |
24 |
|
Reporting |
報告 |
9 |
6 |
|
·· Test Report |
· 測試報告 |
3 |
2 |
|
· Size Measurement |
計算工作量 |
2 |
1 |
|
· Postmortem & Process Improvement Plan |
· 事后總結 ,并提出過程改進計劃 |
3 |
3 |
三. 如何進行接口設計*
接口是提供給其他模塊或者系統使用的一種約定或者規范。因此接口必須要保證足夠的穩定性和易用性。這是設計接口的基本要求。
信息隱藏的意思是讓模塊僅僅公開必須要讓 外界知道的東西,而隱藏其他一切內容。在模塊設計的接口設計中,就充分體現了信息隱藏這一原則——接口是模塊的外部特征,應當公開;而數據結構、算法、實現體等則是模塊的內部特征,應當隱藏。一個模塊僅提供有限的接口,接口是模塊與外界交互的惟一途徑。
耦合是模塊之間依賴程度的度量。低耦合意味著模塊之間的獨立性更好,改變一個模塊不會影響其它模塊。所以在程序設計中我們采用前后端分離的模式,將出題模塊、計算模塊、運算符判斷模塊等均封裝到不同的方法中,從而降低程序的耦合度。
四. 計算模塊接口的設計與實現過程*
在計算模塊中算法的關鍵是中綴表達式轉后追表達式和根據中綴表達式計算結果,其思路大致為從左到右遍歷中綴表達式的每一個數字和運算符,如果是數字就輸出(即存入后綴表達式),如果是右括號,則彈出左括號之前的運算符,如果優先級低于棧頂運算符,則彈出棧頂運算符加入后綴表達式,并將當前運算符加入后綴表達式,遍歷結束后,將棧則剩余運算符彈出。根據中綴表達式計算結果的過程大致是從左到右遍歷后綴表達式,遇到數字就進棧,遇到符號,就將棧頂的兩個數字出棧運算,運算結果進棧,直到獲得最終結果。
五. 計算模塊接口部分的性能改進
|
|
用時 |
|
使用JProfiler工具分析調試 |
3(h) |
|
查找影響性能的程序模塊 |
3(h) |
|
性能改進 |
6(h) |
我們在性能分析的過程中花費了比較多的時間。
性能優化涉及面很廣。一般而言,性能優化指降低響應時間和提高系統吞吐量兩個方面,但在流量高峰時候,性能問題往往會表現為服務可用性下降,所以性能優化也可以包括提高服務可用性。在某些情況下,降低響應時間、提高系統吞吐量和提高服務可用性三者相互矛盾,不可兼得。
一開始的時候,我們用了比較多的正則表達式,發現:正則表達式給人的印象是快捷簡便。但是在 N.O.P.E 分支中使用正則表達式將是最糟糕的決定。如果萬不得已非要在計算密集型代碼中使用正則表達式的話,至少要將Pattern緩存下來,避免反復編譯Pattern。最好還是用普通的 char[] 數組或者是基于索引的操作。還有就是使用了大量的泛型,導致的結果是使用了 byte、 short、 int 和 long 的包裝類,當我們處于 N.O.P.E. 分支的深處時,應該極力避免使用包裝類。這樣做的壞處是給GC帶來了很大的壓力。GC將會為清除包裝類生成的對象而忙得不可開交。所以最后優化方法是使用基本數據類型、定長數組,并用一系列分割變量來標識對象在數組中所處的位置。
以下是一些JAVA性能優化的辦法:http://www.importnew.com/16181.html
性能分析圖:

六. 計算模塊部分單元測試展示
部分單元測試代碼如下:
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class AirthmeticwebappseApplicationTests { @Test public void contextLoads() { } }
單元測試覆蓋率:

七. 計算模塊部分異常處理說明
部分代碼
package cn.bravedawn.airthmeticwebappse; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class AirthmeticwebappseApplicationTests { @Test public void contextLoads() { } }
八. 界面模塊的詳細設計過程*
- 生成主頁面包括可選擇的語言
- 點擊start now進入出題界面,跳轉到隨機生成的題目
- 在出題界面包括時間提示,寫答案,以及答案正確錯誤提示
- 做完題目后可點擊提交按鈕
- 主頁面前端代碼展示:
View Code<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Four arithmetic applets</title> <link rel="stylesheet" href="/static/css/style.css"> <script src="/static/js/jquery-3.1.1.js"></script> </head> <body> <!--head part--> <div class="nav"> <p id="flag" th:text="${flag}" hidden></p> <h1 class="head-title">Four arithmetic applets</h1> <select class="lan-select"> <option value ="volvo">English</option> <option value ="saab">簡體中文</option> <option value="opel">繁體中文</option> </select> </div> <!--body part--> <div class="content"> <h1 class="ready vertical-center">Are you ready?</h1> <a href="/answer.html"><button class="btn-start vertical-center">Start Now!</button></a> <a href="javascript:void(0);"><button class="btn-start-two vertical-center">See Past Performance!</button></a> </div> <script type="text/javascript"> $(function () { $(".btn-start-two").click(function () { var flag = $("#flag").text(); if (flag === "1"){ location.href = "/result.html" } else{ alert("You did not participate in the test 24 hours ago!"); } }) }) </script> </body> </html>
九. 界面模塊與計算模塊的對接*
本次結對項目我們做的是web項目。
前端計時部分代碼展示:
View Codefunction formatSeconds(value) { var secondTime = parseInt(value);// 秒 var minuteTime = 0;// 分 var hourTime = 0;// 小時 if (secondTime > 60) {//如果秒數大于60,將秒數轉換成整數 //獲取分鐘,除以60取整數,得到整數分鐘 minuteTime = parseInt(secondTime / 60); //獲取秒數,秒數取佘,得到整數秒數 secondTime = parseInt(secondTime % 60); //如果分鐘大于60,將分鐘轉換成小時 if (minuteTime > 60) { //獲取小時,獲取分鐘除以60,得到整數小時 hourTime = parseInt(minuteTime / 60); //獲取小時后取佘的分,獲取分鐘除以60取佘的分 minuteTime = parseInt(minuteTime % 60); } } var result = "" + parseInt(secondTime) + "秒"; if (minuteTime > 0) { result = "" + parseInt(minuteTime) + "分" + result; } if (hourTime > 0) { result = "" + parseInt(hourTime) + "小時" + result; } return result; }
網頁頁面展示
![]()


十. 結對照片

十一. 結對編程的優點和缺點
通過這次結對項目,我們覺得結對編程能夠帶來1+1>2的效果。
結對編程有以下優點:
1.之前一個人做的時候,遇到不懂得問題時,就會陷入迷茫。當兩個人一起編程時,有不懂的可以一起討論,說出自己的意見,也為整個編程過程節約了時間。
2.除此之外,兩個人一起合作時就會產生更多更好的想法,可以更好的優化整個項目的設計,遇到問題時可以相互幫助解決問題,效率也比較高。
3.兩個人合作還可以發現多方身上的優點,找出自己身上的不足,并能相互監督讓彼此變得更好,還可以彼此分享好的學習經驗。綜上所述,我們認為兩個人合作的效率遠遠大于一個人。
要說結對編程的缺點:
1.我覺得主要在完成項目的過程中,會產生分歧。每個人有每個人自己的想法,如果不能及時解決分歧,達成一致,很有可能演化成矛盾,進而使合作關系破裂,無法完成項目。
2.對于一個有經驗的編程人員來說,更習慣于一個人編程。畢竟,在編程的過程中有別人在看的感覺有些奇怪。
小組成員互評:
馬樂平:優點:認真細心,勤奮好問,善于思考; 缺點:理解能力欠佳,不善溝通
陳逸璇:優點:對學習充滿熱情,不怕困難,善于溝通; 缺點:技術還有待提高
十二.實際完成項目時間(PSP)
|
PSP2.1 |
任務內容 |
計劃共完成需要的時間(h) |
實際完成需要的時間(h) |
|
Planning |
計劃 |
15 |
17 |
|
· Estimate |
· 估計這個任務需要多少時間,并規劃大致工作步驟 |
18 |
20 |
|
Development |
開發 |
98 |
100 |
|
·· Analysis |
需求分析 (包括學習新技術) |
52 |
54 |
|
· Design Spec |
· 生成設計文檔 |
22 |
24 |
|
· Design Review |
· 設計復審 (和同事審核設計文檔) |
18 |
20 |
|
· Coding Standard |
代碼規范 (為目前的開發制定合適的規范) |
12 |
16 |
|
· Design |
具體設計 |
26 |
28 |
|
· Coding |
具體編碼 |
48 |
56 |
|
· Code Review |
· 代碼復審 |
7 |
9 |
|
· Test |
· 測試(自我測試,修改代碼,提交修改) |
18 |
24 |
|
Reporting |
報告 |
9 |
6 |
|
·· Test Report |
· 測試報告 |
3 |
2 |
|
· Size Measurement |
計算工作量 |
2 |
1 |
|
· Postmortem & Process Improvement Plan |
· 事后總結 ,并提出過程改進計劃 |
3 |
3 |

浙公網安備 33010602011771號