zoukankan      html  css  js  c++  java
  • 结对作业

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

        

     

  • 相关阅读:
    触动心灵的话语
    join和os.path.join 的用法
    os.path.join 的用法
    Python中函数的定义必须在调用的前面
    矩阵和数组的区别
    Object detection with deep learning and OpenCV
    YOLO Object Detection with OpenCV
    Python-OpenCV中VideoCapture类的使用
    Object Detection: Face Detection using Haar Cascades
    有关目标检测的文章
  • 原文地址:https://www.cnblogs.com/zhangq896/p/8776209.html
Copyright © 2011-2022 走看看