结对作业
Posted zhangq896
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对作业相关的知识,希望对你有一定的参考价值。
一、Coding.net的地址
在此次的结对项目中,我的搭档是安然。
我的coding.net地址: https://git.coding.net/zhangq896/group.git
在此次的结对作业未能得到可测试的URL地址
二、psp表格(预先估计的时间)
PSP |
任务内容 |
计划时间(min) |
完成时间(min) |
Planning |
计划 |
60 |
80 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
60 |
80 |
Development |
开发 |
3000 |
4800 |
Analysis |
需求分析 |
60 |
80 |
Design Spec |
生成文档 |
0 |
0 |
Design Review |
设计复审 |
200 |
300 |
Coding Standard |
代码规范 |
20 |
30 |
Design |
具体设计 |
1200 |
1800 |
Coding |
具体编码 |
1800 |
3600 |
Code Review |
代码复审 |
300 |
600 |
Test |
测试 |
130 |
150 |
Reporting |
报告 |
600 |
600 |
Test Report |
测试报告 |
60 |
80 |
Size Measurement |
计算工作量 |
30 |
60 |
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
600 |
600 |
三、对接口进行设计
(1)Information Hiding信息隐藏在设计的所有层次上都有很大作用:从用具名常量代替字面常量,到创建数据类型,再到类的设计、子程序的设计以及子系统的设计等等。把具体数字(如100)直接写到程序中,这样会导致对它的引用过于分散 。private也同样使得信息得到隐藏。
(2)Interface Design接口设计需要提供哪些功能的接口,这些接口大致如何,发起请求应该返回什么样的数据等等,
(3)Loose Coupling
很多复杂问题的解决都是通过增加中间层来实现的。
比如:应用系统最早是两层架构,数据库的负载往往会很大,通过增加应用服务器来分摊数据库层的压力;
系统集成,点对点的对接,系统间相互的依赖性太大,增加一个中间层实现松耦合性。
开发语言上,想让对象与对象间松耦合,通过增加抽象类或者接口来做到。在此次的作业中实现的模块化,获取表达式,进行符号判断等等,降低了程序的耦合度。
四、计算模块接口的设计与实现的过程
在此次的项目中有几大模块,获取表达式生成文件,处理异常模块,计算类,处理答案类(生成时间等)。
其中获得表达式fun()调用获得因子的函数getYin()
首先,需要自动生成文件计算题,其中使用了获取表达式fun(),获得因子函数getYin(),以及计算操作opt()函数
通过UploadServlet()函数将所存在的文件通过session上传到服务器上,而doGet()以及doPost()被UploadServlet()重写。同样在DealAnswer()中重写了doGet()和doPost()函数
五、
六、
七、计算模块部分异常处理说明
模块的异常处理
package com.edu; public class Command { public Command() { } public static float opt(String s) throws Exception { if(s != null && !"".equals(s.trim())) { int a1 = s.indexOf("+"); int a2 = s.indexOf("-"); int a3 = s.indexOf("*"); int a4 = s.indexOf("/"); int a5 = s.indexOf("("); if(a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1) { if(s.trim() != null && !"".equals(s.trim())) { return Float.parseFloat(s.trim()); } else { throw new Exception("operate error"); } } else { float n2; if(a5 != -1) { int n11 = s.indexOf(")"); if(n11 == -1) { throw new Exception("括号不匹配"); } else { n2 = opt(s.substring(a5 + 1, n11).trim()); s = s.replace(s.substring(a5, n11 + 1), String.valueOf(n2)); return opt(s); } } else { float n1; if(a1 != -1) { n1 = opt(s.substring(0, a1)); n2 = opt(s.substring(a1 + 1, s.length())); return n1 + n2; } else if(a2 != -1) { n1 = opt(s.substring(0, a2)); n2 = opt(s.substring(a2 + 1, s.length())); return n1 - n2; } else if(a3 != -1) { n1 = opt(s.substring(0, a3)); n2 = opt(s.substring(a3 + 1, s.length())); return n1 * n2; } else if(a4 != -1) { n1 = opt(s.substring(0, a4)); n2 = opt(s.substring(a4 + 1, s.length())); return n1 / n2; } else { return (float)Integer.parseInt(s.trim()); } } } } else { return 0.0F; } } }
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class Command { public static ArrayList<String> fu= new ArrayList(); public static ArrayList<Integer> num= new ArrayList(); public static ArrayList<String> fg= new ArrayList(); public static ArrayList<Float> jian= new ArrayList();//保存四则运算中间结果 public static boolean flag=false; public static int n=1;//题目数 public static int nops=1;//符号数 public static int mlow=0;//数值最低取值范围 public static int mhigh=50;//数值最高取值范围 public static int c=0;//是否含有括号 public static int bc=0;//是否包含乘除法 /**获取表达式 * @return */ public static String fun() { String str=""; int k=0,s=0,nos=(int) (Math.random()*nops)+1; int a=(int) (Math.random()*((mhigh-mlow)/n))+mlow; num.set(0, a); str+= a; for(int i=0;i<nops;i++) { char f=fu.get((int) (Math.random()*fu.size())).charAt(0); if(f==\'/\') { str+= f; fg.set(i, f+""); int b= getYin(num.get(i)); num.set(i+1, b); str+= b; }else if(f==\'*\'){ str+= f; fg.set(i, f+""); int b=(int) (((mhigh-mlow)/(num.get(i)/2+1))*Math.random()+mlow); num.set(i+1, b); str+= b; }else if(i>1&&fg.get(i-1).equals("+")) { str+=\'-\'; fg.set(i, f+""); int b=(int) (((mhigh-mlow)/(num.get(i)+1))*Math.random()+mlow); num.set(i+1, b); if(bc==1&&k==0&&nops>2&&s<2&&i<num.size()-2) { str+="("+b; k=1; s++; }else if(bc==1&&k==1&&nops>2) { str+=b+")"; k=0; }else { str+= b; } }else { str+= f; fg.set(i, f+""); int b=(int)(Math.random()*((mhigh-mlow)))+mlow; num.set(i+1, b); if(bc==1&&k==0&&nops>2&&s<2&&i<num.size()-2) { str+="("+b; k=1; s++; }else if(bc==1&&k==1&&nops>2) { str+=b+")"; k=0; }else { str+= b; } } } if(bc==1&&k==1) { str+=")"; } return str; }
八、界面模块的详细设计过程
通过继承HttpServlet开发servlet,通过处理get请求以及post请求实现servlet
package com.edu; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; 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.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; @WebServlet({"/uploadServlet"}) public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String UPLOAD_DIRECTORY = "upload"; private static final int MEMORY_THRESHOLD = 3145728; private static final int MAX_FILE_SIZE = 41943040; private static final int MAX_REQUEST_SIZE = 52428800; public UploadServlet() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(!ServletFileUpload.isMultipartContent(request)) { request.setCharacterEncoding("UTF-8") ; PrintWriter factory1 = response.getWriter(); factory1.println("Error: enctype=multipart/form-data"); factory1.flush(); } else { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(3145728); factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(41943040L); upload.setSizeMax(52428800L); upload.setHeaderEncoding("UTF-8"); String uploadPath = "d:" + File.separator + "upload"; File uploadDir = new File(uploadPath); if(!uploadDir.exists()) { uploadDir.mkdir(); } try { List ex = upload.parseRequest(request); if(ex != null && ex.size() > 0) { Iterator var9 = ex.iterator(); while(var9.hasNext()) { FileItem item = (FileItem)var9.next(); if(!item.isFormField()) { String fileName = (new File(item.getName())).getName(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); System.out.println(filePath); item.write(storeFile); request.setAttribute("message", "上传成功"); } } } } catch (Exception var13) { request.setAttribute("message", "上传失败: " + var13.getMessage()); } this.getServletContext().getRequestDispatcher("/message.jsp").forward(request, response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
在此次的作业中,通过session会话来实现,其中存在文件上传功能使得更有竞争力。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>四则运算</title> </head> <body> <h1>文件上传</h1> <form method="post" action="uploadServlet" enctype="multipart/form-data"> 选择一个文件: <input type="file" name="uploadFile" /> <br/><br/> <input type="submit" value="上传" /> </form> </body> </html>
九、界面模块与计算模块的对接
在界面模块与计算模块的对接中,前端向后端发送请求,通过servlet方法后端做出回应。后端生成文件,自动生成题目,前端则将通过封装答案以及题目到两个集合中。
下面是实现的效果:
十、描述结对的过程
在此次结对作业中我们有查阅很多的资料,尤其是Java的知识,其中通过继承HttpServlet开发servlet的方法,也是算是重新拾起的,不过这次的前段代码没有怎么完善,只是一些简单的小页面,看到许多的同学制作的网页十分的精美,觉得自己制作的真的很low。但是对于我来说,这也就已经足够了,我们两个都对前端没有很好的基础,所有才导致了现在的局面,我们会及时反思自己,争取下一次的页面制作更加精美一些。
十一、结对编程的优点和缺点
(1)结对编程的优点
在此次的结对编程中,由于自己的很多知识疏于运用,所有我们不得不重新翻阅资料,在一起学习知识,然后重新掌握觉得真的是很奇妙,比起自己一个人学习,队友更是互补了自己的不足之处。
(2)结对编程的缺点
由于我们不是一个寝室的,有的时候只能通过QQ联系,所以很多时候叙述不清楚。在很多的时候,面对项目时,我们会有不同的想法,就会出现分歧,我们为了彼此的想法只能都尝试一下,有的时候真的很是浪费时间。
以上是关于结对作业的主要内容,如果未能解决你的问题,请参考以下文章