结对作业——四则运算
?
?
一、在文章開頭給出Coding.Net項目地址。
?
可以直接使用的URL地址:
http://39.105.6.214/four_Operations/
coding倉庫地https://git.coding.net/meiyoupiqidefan/jieduizuoye.git
?
二、在開始實現程序之前,在下述PSP表格記錄下你估計將在程序的各個模塊的開發上耗費的時間。
PSP
| PSP | 任務內容 | 計劃共完成需要的時間(min) | 實際完成需要的時間(min) |
| Planning | 計劃 | 10 | ? |
| Estimate | 估計這個任務需要多少時間,并規劃大致工作步驟 | 5 | ? |
| Development | 開發 | 5*60 | ? |
| Analysis | 需求分析 (包括學習新技術) | 10*60 | ? |
| Design Spec | 生成設計文檔 | 1*60 | ? |
| Design Review | 設計復審?(和同事審核設計文檔) | 20 | ? |
| Coding Standard | 代碼規范?(為目前的開發制定合適的規范) | 10 | ? |
| Design | 具體設計 | 30 | ? |
| Coding | 具體編碼 | 20*60 | ? |
| Code Review | 代碼復審 | 3*60 | ? |
| Test | 測試(自我測試,修改代碼,提交修改) | 5*60 | ? |
| Reporting | 報告 | 2*60 | ? |
| Test Report | 測試報告 | 3*60 | ? |
| Size Measurement | 計算工作量 | 20 | ? |
| Postmortem & Process Improvement Plan | 事后總結,?并提出過程改進計劃 | 30 | ? |
?
?
三、看教科書和其它資料中關于Information Hiding, Interface Design,?Loose Coupling的章節,說明你們在結對編程中是如何利用這些方法對接口進行設計的。
Information Hiding?信息隱藏:
什么是信息隱藏:
信息隱藏指在設計和確定模塊時,使得一個模塊內包含的特定信息(過程或數據),對于不需要這些信息的其他模塊來說,是不可訪問的。
為什么要信息隱藏:
隱藏復雜度:這樣你就不用再去應付它,除非你要特別關注的時候;
隱藏變化源:這樣當變化發生時,其影響就能被限制在局部范圍內。復雜度的根源包括復雜的數據類型、文件結構、布爾判斷以及晦澀的算法等等。
我們是怎么做的:
提供穩定接口,將邏輯集中到一個單獨的類、包或者子系統中,使得改動不會給系統帶來全局性的影響。
?
Interface Design?接口設計:
什么是接口設計:
對接口的名字,內容,邏輯進行設計
為什么要接口設計:
好的接口設計可以增強代碼可讀性,易用性,可更改性
我們是怎么做的:
設計接口,規范接口名字,注重接口邏輯。
?
Loose Coupling?松耦合:
什么是松耦合:
也叫做弱耦合,低耦合。耦合性也稱塊間聯系。指軟件系統結構中各模塊間相互聯系緊密程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決于模塊間接口的復雜性、調用的方式及傳遞的信息。
什么要松耦合:
功能上或代碼上可以達到重用,再組合新功能的時候,可以像搭積木一樣,分別拿出去再重用,而不會太關聯其他。
我們是怎么做的:
將相互依賴的類放在一個命名空間(包)中,對外模塊盡量與其他方法或功能減少聯系。
?
?
四、計算模塊接口的設計與實現過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?說明你的算法的關鍵(不必列出源代碼),以及獨到之處。
先看一下目錄結構:
?
?
?
?
?
關鍵代碼:
?ScanServelet.jsp
package control;import entity.InfoBean; import util.ReadFile;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List;@WebServlet(name = "ScanServlet") public class ScanServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {response.setCharacterEncoding("utf-8");//計數器int count = 0;count = Integer.parseInt(request.getParameter("count"));//將題目有關信息存儲List<InfoBean> L = new ArrayList<InfoBean>(); // String file="C:\\Program Files\\apache-tomcat-8.5.15\\result\\result.txt";/*成功取出L*/String file = request.getParameter("file");L = ReadFile.readFileByLines(file);int line = Integer.parseInt(request.getParameter("line"));int user_ans = Integer.parseInt(request.getParameter("user_ans"));if (user_ans == L.get(line).getRight_ans()) {count++;}line++;String startTime = request.getParameter("startTime"); // String startTime = request.getParameter("startTime");//比較正確答案request.setAttribute("file",file);request.setAttribute("List", L);request.setAttribute("line", line);request.setAttribute("count", count);request.setAttribute("startTime", startTime);if (line == L.size()) {request.getRequestDispatcher("complete.jsp").forward(request, response);} else request.getRequestDispatcher("answerQuestions.jsp").forward(request, response);} catch (Exception e) {response.sendRedirect("message.jsp");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);} }?
?
?
?五、計算模塊接口部分的性能改進。記錄在改進計算模塊性能上所花費的時間,描述你改進的思路,并展示一張性能分析圖,并展示你程序中消耗最大的函數。
?
?
?
?
?
六、計算模塊部分單元測試展示。展示出項目部分單元測試代碼,并說明測試的函數,構造測試數據的思路。并將單元測試得到的測試覆蓋率截圖,發表在博客中。只需要測試命令行部分,且該部分覆蓋率到90%以上,否則單元測試部分視作無效。
?
?
?
?
?
?
七、計算模塊部分異常處理說明。在博客中詳細介紹每種異常的設計目標。每種異常都要選擇一個單元測試樣例發布在博客中,并指明錯誤對應的場景。
?
我們制作的是web端四則運算器,在網頁的輸入中,我們使用前端的js,對于不合法的參數輸入,不予通過,使得后端接收到的值都是合法的參數。
具體代碼如下:answerQuestions.jsp
?
1 <script type="text/javascript" 2 src="js/bootstrap.js"></script> 3 4 <script type="text/javascript" src="js/jquery-1.10.2.min.js"></script> 5 <script type="text/javascript" src="js/bootstrap.min.js"></script> 6 <script type="text/javascript" src="js/bootstrapValidator.js"></script> 7 <script type="text/javascript" 8 src="js/bootstrap.min.js"></script> 9 <link href="//cdn.bootcss.com/bootstrap-validator/0.5.3/css/bootstrapValidator.min.css" rel="stylesheet"> 10 <script src="//cdn.bootcss.com/bootstrap-validator/0.5.3/js/bootstrapValidator.min.js"></script> <center><h1 style="font-family:華文新魏;font-size:5em">WELCOME</h1><div class="container-fluid"><div class="row-fluid"><div class="span12"><form class="form-horizontal" role="form"id="defaultForm"onsubmit="return tishi(this)"action="Print" method="get"><div class="form-group"><label class="col-sm-5 control-label">最小值 :</label><div class="col-sm-2"><input type="text" class="form-control" placeholder="范圍 :1~100" name="min"></div></div><div class="form-group"><label class="col-sm-5 control-label">最大值 :</label><div class="col-sm-2"><input type="text" class="form-control" id="" placeholder="范圍 :50~1000" name="max"></div></div><div class="form-group"><label class="col-sm-5 control-label">題目數量 :</label><div class="col-sm-2"><input type="text" class="form-control" id="" placeholder="范圍 :1~10000" name="n"></div></div><div class="form-group"><label class="col-sm-5 control-label">操作符最大個數:</label><div class="col-sm-2"><input type="text" class="form-control" id="" placeholder="范圍 :1~10" name="o"></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-6"><div class="checkbox"><label><input type="checkbox" name="c">是否乘除</label></div><div class="checkbox"><label><input type="checkbox" name="b">是否有小括號</label></div></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="submit" class="btn btn-default" id="">出題</button></div></div></form><a href="index.jsp">返回</a></div> </div> </div> </center>?
?
1 <script type="text/javascript"> 2 $(document).ready(function() { 3 // Generate a simple captcha 4 function randomNumber(min, max) { 5 return Math.floor(Math.random() * (max - min + 1) + min); 6 }; 7 $('#captchaOperation').html([randomNumber(1, 100), '+', randomNumber(1, 200), '='].join(' ')); 8 9 $('#defaultForm').bootstrapValidator({ 10 // live: 'disabled', 11 message: 'This value is not valid', 12 feedbackIcons: { 13 valid: 'glyphicon glyphicon-ok', 14 invalid: 'glyphicon glyphicon-remove', 15 validating: 'glyphicon glyphicon-refresh' 16 }, 17 fields: { 18 min: { 19 validators: { 20 notEmpty: { 21 message: '請輸入1-100之間的數' 22 },stringLength: { 23 min: 1, 24 max: 3, 25 message: '請輸入1-100之間的數' 26 }, 27 } 28 }, 29 max: { 30 validators: { 31 32 notEmpty: { 33 message: '請輸入50-1000之間的數' 34 }, 35 stringLength: { 36 min: 1, 37 max: 4, 38 message: '請輸入50-1000之間的數' 39 }, 40 } 41 }, 42 n: { 43 44 validators: { 45 notEmpty: { 46 message: '請輸入1-10000之間的數' 47 }, 48 stringLength: { 49 min: 1, 50 max: 5, 51 message: '請輸入1-10000之間的數' 52 }, 53 regexp: { 54 regexp: /^[0-9]/, 55 message: '請輸入數字' 56 }, 57 58 } 59 }, 60 o: { 61 validators: { 62 notEmpty: { 63 message: '請輸入1-10之間的數' 64 },stringLength: { 65 min: 1, 66 max: 2, 67 message: '請輸入1-10之間的數' 68 }, 69 } 70 } 71 } 72 }); 73 74 // Validate the form manually 75 $('#validateBtn').click(function() { 76 $('#defaultForm').bootstrapValidator('validate'); 77 }); 78 79 80 $('#resetBtn').click(function() { 81 $('#defaultForm').data('bootstrapValidator').resetForm(true); 82 }); 83 }); 84 85 86 </script>?
?
?
?
八、界面模塊的詳細設計過程。在博客中詳細介紹界面模塊是如何設計的,并寫一些必要的代碼說明解釋實現過程。
?
?以下為流程圖:
頁面不一一列舉,在這里舉兩個地方的內容:
index.jsp
1 <body> 2 <center> 3 <div class="indexbtn"> 4 <h2 id="title"> 5 WELCOME! 6 </h2> 7 <br> 8 <form action="setQuestions.jsp" method="get"> 9 <input type="submit" class="btn" value="出題" class="index"> 10 11 </form> 12 <form action="uploadInterface.jsp" method="get"> 13 14 <input type="submit" class="btn" value="做題" class="index"> 15 16 </form></div> 17 </center> 18 </body>?
answeQuestio.jsp
<%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";%><%List<InfoBean> L = new ArrayList<InfoBean>();L = (List<InfoBean>) request.getAttribute("List");String startTime = (String)request.getAttribute("startTime");int line = Integer.parseInt(request.getAttribute("line").toString());int first = L.get(line).getLine();String second = L.get(line).getQuestion();int count = Integer.parseInt(request.getAttribute("count").toString()); %> 1 <center> 2 <div class="container-fluid"> 3 <div class="row-fluid"> 4 <div class="span12"> 5 <div class="row-fluid"> 6 <div class="span2"> 7 </div> 8 <fi class="span8"> 9 <h1 style="font-family:華文新魏;font-size:5em">WELCOME</h1> 10 11 12 <!-- 禁用 for="disabledTextInput" --> 13 14 <form action="Scan" method="get"> 15 <fieldset> 16 <input type="text" name="line" value="<%=line %>" style="display: none" id="line"> 17 <input type="submit" value="<%=L.size()%>" style="display:none" id="size" > 18 <input type="text" name="count" value="<%=count%>" style="display:none"> 19 <li><label>序號:<input type="text" value="<%=first%>" disabled/> </label></li> 20 <li><label>題目:<input type="text" value="<%=second%>" disabled/> </label></li> 21 <li><label> 答案:<input type="text" name="user_ans" /> </label></li> 22 <input type="submit" value="下一題" style="display: block" id="nextOne"> 23 <input type="text" name="startTime" value="<%=startTime%>" style="display: none"> 24 <input type="submit" id="finish" value="完成" style="display:none"> 25 </fieldset> 26 </form> 27 <%--<form action="complete.jsp" method="get">--%> 28 <%--<input type="submit" id="finish" value="完成" style="display:none">--%> 29 <%--<input type="text" name="count" value="<%=count%>" style="display:none" >--%> 30 <%--<li><label> 答案:<input type="text" name="user_ans" style="display:none" id=""/> </label></li>--%> 31 <%--</form>--%> 32 </fi> 33 </div> 34 <div class="span2"> 35 </div> 36 </div> 37 </div> 38 </div> 39 </div> 40 41 <a href="index.jsp">返回</a> 42 </center>?
?
九、界面模塊與計算模塊的對接。詳細地描述UI模塊的設計與兩個模塊的對接,并在博客中截圖實現的功能。
?
我們整個界面的設計,采用了bootstrap框架,色調以綠色為主基調,加上生動有趣的3D的跟隨鼠標JS,使得整個界面簡潔大方,生動活潑,綠色護眼。
?
index.jsp
?
主界面,可以選擇出題還是做題
?
?
?
?
setQuestions.jsp 出題界面,輸入參數,定制題目
?
?
利用BootstrapValidate?插件,對輸入空值,超過范圍等情況進行處理,不能提交表單,并給出對應提示。界面簡潔大方又富有友好性。下面是一張不合法輸入的效果圖:
?
?
點擊出題之后,可以選擇瀏覽器下載出好的題目:
?
?
?
接下去是做題界面
?
upload.jsp 先從本地上傳文件到服務器
?
?
?
服務器接收數據并顯示出來:
?
其中序號框和題目框設置了disablied屬性,使得用戶不能更改input框里的內容,更加安全。
?
?
?
在答案框輸入答案會觸發變大效果:
?
?
?
?
?
?
一直點下一題,直到最后一題,則下一題按鈕消失,出現完成按鈕。點擊完成按鈕則跳轉到最后一個頁面。
?
?
Finished.jsp?顯示答對的題數和總共用的時間:
?
?
?
十、描述結對的過程,提供非擺拍的兩人在討論的結對照片。
?
?
?
?
十一、結對編程的優缺點和結對成員的優缺點
結對編程:
優點:
缺點:需要互相配合時間,習慣。
?
我:
優點:
缺點:編碼速度慢
?
我的搭檔:
優點:
缺點:
?
十二、在你實現完程序之后,在附錄提供的PSP表格記錄下你在程序的各個模塊上實際花費的時間。
PSP
| PSP | 任務內容 | 計劃共完成需要的時間(min) | 實際完成需要的時間(min) |
| Planning | 計劃 | 10 | 15 |
| Estimate | 估計這個任務需要多少時間,并規劃大致工作步驟 | 5 | 30 |
| Development | 開發 | 5*60 | 3*60 |
| Analysis | 需求分析 (包括學習新技術) | 10*60 | 10*60 |
| Design Spec | 生成設計文檔 | 1*60 | 1*60 |
| Design Review | 設計復審?(和同事審核設計文檔) | 20 | 30 |
| Coding Standard | 代碼規范?(為目前的開發制定合適的規范) | 10 | 15 |
| Design | 具體設計 | 30 | 1*60 |
| Coding | 具體編碼 | 20*60 | 24*60 |
| Code Review | 代碼復審 | 3*60 | 5*60 |
| Test | 測試(自我測試,修改代碼,提交修改) | 5*60 | 2*60 |
| Reporting | 報告 | 2*60 | 1*60 |
| Test Report | 測試報告 | 3*60 | 1*60 |
| Size Measurement | 計算工作量 | 20 | 20 |
| Postmortem & Process Improvement Plan | 事后總結,?并提出過程改進計劃 | 30 | 30 |
?
?
轉載于:https://www.cnblogs.com/fangnuonuo/p/8766360.html
總結
以上是生活随笔為你收集整理的结对作业——四则运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Keepalived搭建高可用集群
- 下一篇: Traefik访问master节点不通的