结对作业

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联系,所以很多时候叙述不清楚。在很多的时候,面对项目时,我们会有不同的想法,就会出现分歧,我们为了彼此的想法只能都尝试一下,有的时候真的很是浪费时间。

    

 

 

以上是关于结对作业的主要内容,如果未能解决你的问题,请参考以下文章

结对编程作业

结对编程第一次作业

《结对作业》——软件工程作业

结对-结对编程项目作业名称-结对项目总结

结对作业(软件工程第四次作业)

结对作业