web四则运算

目录

1.coding.net地址

2.PSP

3.Information Hiding, Interface Design, Loose Coupling

4.计算模块接口的设计与实现过程

5.计算模块接口部分的性能改进

6.计算模块部分单元测试展示

7.计算模块部分异常处理说明

8.界面模块的详细设计过程

9.界面模块与计算模块的对接。

10.描述结对的过程

11.结对编程的优点和缺点


1.Codiing地址:https://git.coding.net/lzgy18/WEB-four_operation.git

   web测试地址:http://119.29.189.249 


2. PSP

PSP

任务内容

计划时间(min)

完成时间(min)

Planning

计划

30

60

 Estimate

 估计这个任务需要多少时间,并规划大致工作步骤

30

60

Development

开发

4300

6940

Analysis

需求分析

50

50

Design Spec

生成文档

0

0

 Design Review

设计复审

120

150

Coding Standard

代码规范

30

60

Design

具体设计

60

120

Coding

具体编码

3800

5760

Code Review

代码复审

180

600

Test

测试

30

700

Reporting

报告

160

840

Test Report

测试报告

120

240

Size Measurement

计算工作量

30

45

Postmortem & Process Improvement Plan

事后总结, 并提出过程改进计划

30

60


3.(1)information Hiding

          信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。

          也就是说用一个类中封装其中的数据,方法,使得外界不可以随意访问与修改,提高了程序的安全性与健壮性。

          在我们的项目中,要想使用这个类中的方法和变量,秩序调用此类即可,不需要知道这个类中的方法具体如何实现,不可以随意对类中的方法进行修改,只需要对此类进行调用使用是方法即可,也就是说,不需要知道他是怎么实现的,只要知道他是干什么的,调用即可。

   (2) Interface Design , Loose Coupling

          模块划分是一个比较常见的方式,而模块与模块之间则是通过接口设计将它们整合在一起的。总之,我觉得这两个方面是相辅相成的。既然有了松耦合,我又去查了一下,发现有相对的紧耦。我先看了一下什么是耦合性: 耦合性是指组件(在分布式系统中)互相依赖的程度。客户端与它们同其进行通讯的服务之间耦合的性质可能影响智能客户端设计的许多方面,包括互操作性、脱机功能、网络通讯性 能、部署以及维护注意事项。

          紧 耦合系统通常提供直接的对象到对象通讯,并且客户端上的对象对远程对象具有详细的了解。这种紧耦合性可以防止对客户端或服务器进行单独更新。因为紧耦合系 统涉及直接的对象到对象通讯,所以对象通常比在松耦合系统中更为频繁地交互,这样,如果两个对象位于不同的计算机上并且由网 络连接分隔,则可能导致性能和 延迟问题。

        松耦合系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方。

       ( 推荐一个博客:https://www.cnblogs.com/laxcus/p/5681611.html)

          在我们的项目中,模块划分主要分为计算模块,显示模块,控制模块(只要是用来链接显示模块与计算模块),对于计算模块,只需要调用其即可。


4.计算模块接口的设计与实现 

      我们的计算模块主要有四个类,分别用于产生题目,计算结果,选择文件并输出文件内容,写入文件。有15个方法。


5..计算模块接口部分的性能改进

1)在设计过程中,改进了部分功能

我们发现有许多方法没有大的作用,而且,可以调用其他类中的一些方法实现,但没有删除,因此比较耗费

而且,有一个重复调用needing方法,来产生四则运算,使其重头开始重新计算,使得代码利用率不高,而且冗余,我们删除了一些重复调用的代码,比如:

刚开始,我们对于两个数相除产生分数的问题,只要除不尽,就在重新随机产生两个随机数,后来,通过改进例如x%y,只需要重新产生y的值即可。

(2)性能分析截图

 

 


6.计算模块部分单元测试展示

(一)部分测试代码

(1)Command测试

(2)inputFile中Inputfile测试

(3)inputFile中result测试

4)needing方法测试

(5).arrayPractice中的测试

 

 (二)命令行测试

 

 

 

(3)测试覆盖率


   7.计算模块部分异常处理说明

(1)输入参数异常

if(args[r].equals("-n") ){

                try {
                    n = Integer.parseInt(args[++r]);//命令行输入
                    if (n<0||n>10000)
                        System.out.println("n必须输入正整数");
                }
                catch (Exception e)
                {
                    System.out.println("n输入格式不正确");
                }

            }
            else  if(args[r].equals("-m")){
                try {
                    lower= Integer.parseInt(args[++r]);
                    upper= Integer.parseInt(args[++r]);
                    if(lower>=upper){
                        System.out.println("lower不能大于等于upper");
                    }

                }catch (Exception e){
                    System.out.println("lower,upper,输入不合法");
                }

            }

            else   if(args[r].equals("-o")){

                try {
                    opNum= Integer.parseInt(args[++r]);
                    if (opNum>10||opNum<1)
                        System.out.println("opNum取值为1-10");
                }
                catch (Exception e)
                {
                    System.out.println("opNum输入格式不正确");
                }


            }

(2)上传文件异常

 if (file.exists() && file.isFile()) {
            try {
                BufferedReader input = new BufferedReader(new FileReader(file));
                String text;

                while ((text = input.readLine()) != null)
                    list.add(text);
            } catch (IOException ioException) {
                System.err.println("File Error!");
            }
        }

(3)写入文件异常

 try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(path));

            for(String con:content){
                bw.write(con);
                bw.newLine();
            }
            bw.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

(4)文件格式不正确

System.out.println("测试获取文件的后缀:"+str);
               if(!(str.equals(".txt"))){
                   PrintWriter out = response.getWriter();
                   out.print("<script language='JavaScript'>alert('The file format is wrong!!');window.location.href='../upload.jsp';</script>");
               }

8.模块设计

对于后台界面

(1)计算模块有产生四则运算式子,计算结果,上传文件,输出文件内容等类

(2)设计jsp页面,文件上传页面,选择相应的文件,传送path,调用inputFile方法,输出文件内部的内容

 public static List<String> InputFile(String path) {
        File file = new File(path);
        LinkedList<String> list = new LinkedList<String>();
        if (file.exists() && file.isFile()) {
            try {
                BufferedReader input = new BufferedReader(new FileReader(file));
                String text;

                while ((text = input.readLine()) != null)
                    list.add(text);
            } catch (IOException ioException) {
                System.err.println("File Error!");
            }
        }

 (3)输出文件内容后通过调用result方法,获得文件的计算结果,与用户输入结果作比较,得出正确与否

public static String result(String arrayList) {


       String a="";
            try {
               a= String.valueOf(js.eval(arrayList));
                //System.out.println(al);

            } catch (ScriptException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        return a;

    }
 

(4)生成题目online页面,将参数传递给servlet,servlet通过调用needing方法,返回jsp页面生成题目算式,然后,再将算式显示出来,计算比较

public String needing(int lower, int upper, int opNum, boolean haveMS, boolean haveKuo){//产生四则运算并计算出结果
        String[] arr={"+","-","*","/"};
        String s="";
        Random r=new Random(); 
        int a=r.nextInt(opNum)+2 ;//生成3—4随机数
        int[] b=new  int[a];
        //System.out.println("产生的随机运算数的个数"+a);
        int[] number=new int[a];
        for(int j=0;j<a;j++) {
            number[j]=r.nextInt(upper) ;
        } 
        if(opNum==1) {
            int op = r.nextInt(2);
            int v1 = r.nextInt(upper);
            s += v1 + arr[op];
        }
        else {
            for (int j = 0; j < a-1; j++) {
                b[j]= r.nextInt(4);//生成0——4的随机数
                if(haveMS) {
                    if (haveKuo){
                        int a1 = r.nextInt(upper);
                        int a2 = r.nextInt(upper);
                        if (a1 > a2) {
                            s += "(" + a1 + "-" + a2 + ")" + "*" + "(" + number[j] + "-" + number[j + 1] + ")" + "-";}
                        else
                            s += number[j + 1] + "/" + "(" + "(" + a1 + "+" + a2 + ")" + "*" + number[j] + ")" + "+";

                        } else
                    s += number[j] + arr[b[j]];
                }
                else {
                    int t = r.nextInt(2);
                    s += number[j] + arr[t];
                }
                if (j >= 1)
                    b[j] = same(j, b); 
            }
        }

        s+=number[a-1];
        arrayPractice c=new arrayPractice();//调用类计算结果
        List<String> list=c.result1(s); 
        List<String> list2=c.InfixToPostfix(list); 
        int re=c.doCal(list2,upper);
        if(re!=-1){ 
            if(re>upper)
                return needing(lower,upper,opNum,haveMS,haveKuo);} 
        else 
            return needing(lower,upper,opNum,haveMS,haveKuo); 
        return s;
    }
 
int  n= Integer.parseInt(request.getParameter("quesNum"));
        int  max= Integer.parseInt(request.getParameter("maxNum"));
        int min= Integer.parseInt(request.getParameter("minNum"));
        int o= Integer.parseInt(request.getParameter("operScope"));
        boolean c= Boolean.parseBoolean(request.getParameter("multi"));
        boolean  b= Boolean.parseBoolean(request.getParameter("bracket" ));
        
        Producing p=new Producing();
        ArrayList<String> s=new ArrayList<String>();

        for(int i=0;i<n;i++){

                s.add(p.needing(min,max,o,c,b));

        }

(5)将生成的算式在逐个输出,进行计算,并判断对错,此处与上传文件,输出文件内容并判断对错相似

对于前台页面

前台的设计主要由div+css布局实现,由小组的另一位成员翁梦蕾主要设计。
模块功能主要有,导航栏,上传及答题,在线生成题目(即定制服务)跳转答题,计时及输出正确题目数量。
模块的设计由小组的两位成员共同进行交流设计,商讨而出。最初暂定三个界面,商讨过后最终决定产生四个界面,来实现上述所有的功能。设计过程中版式的设计由二人共同制定,初定模型后,进行细化的功能及板块设定,最终由小组的另一成员制作而成。在设计之初,我们二人共同商讨了页面的功能模块名称。

实现的界面代码模块设计主要如下

实现了多语言选择,通过1,2,3,分别选择不同的语言

$(document).ready(function() {
    var lang = $.cookie("lang");
    switch (lang) {
        case '1':
            lang1();
            break;
        case '2':
            lang2();
            break;
        case '3':
            lang3();
            break;
        default:
            lang1();
            break;
    }
})

//答题功能及计时,输出正确数量 

<div class="output">
            <div class="output_answer">

                <ul>
                    <li>
                        题目
                    </li>
                    <li>
                        答案
                    </li>
                    <li>
                        对错
                    </li>
                </ul>
                <div class="answer_scroll">
                    <form   method="get">
                    <table>

                            <%
                                String path = String.valueOf(request.getAttribute("path"));
                                int countR=0;
                                int countL=0;
                                InputFile inputFile=new InputFile();
                                List<String> s1=inputFile.InputFile(path);
                                String[] answer=new String[s1.size()];
                                for(int i=0;i<answer.length;i++){
                                    //String ss=inputFile.result(s2);
                                    answer[i]=(inputFile.result(s1.get(i)));
                                }
                                request.setAttribute("answer",answer);
                                 %>
                        <input type="hidden" id="right_answer" value="<%=answer %>"/>
                        <%
                                for (String s:s1)
                                {
                            %>
                        <tr>
                            <td>
                               <%=s %>
                            </td>
                            <td>
                                <input type="text" name="answer" class="get_answer"/>
                            </td>
                            <td>
                                <span  class="gou">

                                </span>

                            </td>
                        </tr>
                            <%

                                } %>

                    </table>
                    </form>
                </div>
                <input type="submit" value="提交" id="aa" onclick="yesOrNo()"/>
            </div>
            <div class="output_judge">
                <div class="judge_clock">
                    <button type="button" onclick="start()"><img src="img/play.png"/></button>
                    <button type="button" onclick="stop()"><img src="img/stop.png"/></button>
                    <button type="button" onclick="Reset()"><img src="img/over.png"/></button>
                    <input type="text" id="timetext" value="00时00分00秒" readonly><br/>
                </div>
                <div class="judge_number">
                    <ul>
                        <li>
                            <span>本次题目一共有</span>
                        </li>
                        <li>
                            <input type="text" id="total_number" value="<%=answer.length %>" READONLY/>
                        </li>
                        <li>
                            <span>正确的题目一共有</span>
                        </li>
                        <li>
                            <input type="text" id="right_number" READONLY/>
                        </li>
                    </ul>
                </div>
            </div>

9.界面模块与计算模块的对接

UI模块的设计由两个人共同商讨,具体需要为界面美观及功能性强
界面美观需要的有两点:
1.结构清晰,美观
2.色彩不冲突
功能性需要的主要为以下几点:
1.用户制定
2.上传文件
3.获取题目并且答题
4.计时
5.判断正确错误且输出正确题目数量

6.实现多语言(英语,中文,日文的选择)
界面美观由小组中的另一位成员实现,功能性由二人合作完成,共同商讨且实时交流
其中上传文件并计算处理得出答案由我实现,计时及判断正误由小组中另一位成员实现

两个模块的交互
另一名成员规划出页面的模块布局之后,添加jsp代码,将需要的数据传到页面中
需要的数据主要为:
1.题目 为一个list集合
2.题目的数量 为list对象的size
3.正确答案 为一个数组
实现为:
使用了循环输出,jstl标签,以及基本的jsp代码

(1)上传文件页面upload.jsp,上传文件,通过servlet获取文件的路径,然后调用inputFile方法(上面有代码),逐个输出文件的内容,并通过result方法,获得内容答案,传给js,然后利用js,将用户输入的值与正确答案作比较,判断对错,斌输出正确,错误题数和总题数,并通过计时功能,计时

form action="upload" method="post" enctype="multipart/form-data">
            <div class="file">
                <input type="file" name="file" class="file-btn"/>
                <span>选择文件</span>
            </div>
            <input type="submit"  value="上传"/>
        </form>

 

2)online.jsp页面,生成题目并上传到文件前台页面用户输入参数,传给servlet,然后调用needing方法,生成计算式,通过servlet调用writting方法保存到指定文件中,
servlet再将path返回给online2.jsp页面,输出文件内容到页面,通过js获取输入内容,与upload相似,得到题目正确与否

10.描述结对的过程,提供非摆拍的两人在讨论的结对照片

结对的过程:

  1. 商讨项目的制作过程,包括使用的代码,技术规范,页面的框架,实现的功能等
  2. 计划分工及功能的实现,进行PSP的初期规划
  3. 正式开始进行项目的制作,计算模块与界面模块同时进行
  4. 进行页面的交互,并且同时不断修改代码
  5. 进行测试
  6. 发布项目
  7. 撰写博客

 

11.说明结对编程的优点和缺点。同时指出结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)

结对编程的优缺点

  • 优点
    • 能实时更新项目进度,交流密切,方便项目实施
    • 对于懒惰的一方有督促的作用
    • 集思广益,相同的问题两个人更好解决
    • 分工明确,减少工作量
  • 缺点
    • 对于两个人的配合有较高的要求
    • 对于两个人的时间和经历有较高的要求
    • 容易产生分歧

结对的每一个人的优缺点

刘卓锦

  • 优点
    • 代码能力强
    • 耐心
    • 细心
  • 缺点
    • 不爱写注释

翁梦蕾

  • 优点
    • 有设计风格
    • 细心
    • 耐心
  • 缺点
    • 对于java掌控不熟
原文地址:https://www.cnblogs.com/09300726lzj/p/8757224.html