web结对项目

 

 

一、Coding.Net项目地址:

       https://git.coding.net/verde/Pair_Work.git

 

 

二、对接口进行的设计

看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。

如下图SRC的目录结构:

        如图一共有以下四个包:

  •  Information Hiding,Interface Design,Loose Coupling的实现:

1.信息隐藏:  

   项目中多个实体类封装数据,例如:Users类,Lists类,由于经过封装,信息访问只可通过get,set方法,对项目操作者是不可见的,实现了信息隐藏。主要体现在以下两方面:

       用户类封装了用户的个人信息,限定范围private直接联系到数据库。

       题目,结果,和算式分别在实体类Lists中建立三个LinkedList链表,expArr,resArr,addArr,在前台获取算式各种参数时只需要调用linkedList类的各种方法,例     如:get,set,get(index)操作简单,暴露信息少。

2.接口设计

     当初有了解过一些有关于框架的知识,所以这次项目结构设计也借鉴了一些接口思想:

           1.只有一个类(Function类)与前台交互使用实现接口,前台信息接受方便、只需创建一个对象,同时也保证了代码干净整洁。

           2.项目使用了面向对象思想,避免在jsp中加入过多的java代码,而是把各种功能写在类中的各种方法中,在jsp页面中直接调用方法。

           4.Tests类在后台功能实现的过程中边写代码边测试,在于前台交接之前一直使用junit代替前台传入的参数,这点使我们节省了时间。

2.松耦合

     java类的原则:“高内聚,低耦合”:每个类中功能健全,类与类间尽量减少关联

           生成式子等操作直接引用了上次作业的Main类的一些代码,DBUtil只与UsersOperation类有关;Operation包中getResult类、getExpression类,ToolDemo类只与Function类有关;Tests类只用于测试Function的方法,实体类只实现封装,只由Function类和jsp页面调用,类与类之间划归清晰,面向对象编程也大大实现了代码的重用性。

    

 

 

三、计算模块接口的设计与实现过程

           设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。

图片较小,右键点击图像 ---> 查看图像即可看大图

 

 

 

 见上图src下目录结构↑↑↑

四、计算模块接口部分的性能改进

          记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。

通过参数传值,类间调用等实现模块的对接(主要是Command类和Expression类)。内存消耗如图:分析可知相对稳定。

 

最初由项目的Command。java右键Profile As,进入性能分析,其次打开JVM虚拟机(可以用教程的密码破解Frofile软件)。

然后进入Live memory,最初消耗变化如图:

等待两分钟后,出现红色绿色并存现象:

还有不足,故进行性能优化处理后:

 

      因为这个项目代码比较多,昨天数了一下加起来一千多行,想想都是我俩亲手敲的,还很激动……

      我们的模块化方法是逐渐实现的,一开始仿佛仅满足功能的实现,到后来慢慢的把所有类和方法逐个归类。比如说向前台传LinkedList,那时候方法和实体类是写在一起的,当初的想法是先在本类实现了功能再去实现再在其他类中使用链表。本来功能实现在我们项目中并不算是大问题,很快就实现了功能,但是模块话显而易见有很大的优势。也多亏了在工作室时候学长带我们了解到的框架思想,这次虽然还没有使用框架的能力,但是开发过程中模块化思想的安排确实费了很多脑筋~

 

 

消耗最大的函数:

      /*
     * 得到算式,得到答案
     * 这个方法是把所有的整个式子,算式和结果分别放入三个ArrayList中
     * 新建树并产生用户获取到数目的算式,分别存放List中
     * 实现了逐个遍历
     * */
    
    //获取三个list
    public LinkedList<String> createList(int num,int symNum){
        GetExpression bTree;
        
        for(int i=0;i<num;i++){
            //构造树
            bTree = new GetExpression(symNum);
            bTree.buildBTree();
            //设置list类里面的expression,result          
            String expression = bTree.toString();
            String result = bTree.CalAndVal();
            Lists l = new Lists(expression,result);
            //把expression和result获取出来
            Lists.expArr.add(expression);
            Lists.resArr.add(result);
            Lists.addArr.add(l.toString());
        }    
        return Lists.expArr;
    }

 

 

五、计算模块部分单元测试展示

  展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。只需要测试命令行部分,且该部分覆盖率到90%以上,否则单元测试部分视作无效

 1 package Function;
 2 
 3 import org.junit.Test;
 5 import Entity.Lists;
 6 
 7 public class Tests {
 8 
 9     @Test
10     public void getList(){
11         Function fun = new Function();
12         fun.setSybNum(3);
13         Lists list = new Lists();
14         fun.createList(100,fun.getSybNum());
15         System.out.println(list.getExpArr());
16     }//由于没有和前台交互,这时候随便传了几个参数
17     
18     @Test
19     public void getFile(){
20         Function fun = new Function();
21         fun.ReadFile("C://Users//apple//Desktop//ttt.txt","C://Users//apple//Desktop//www.txt");;
22     }//获取文件
23 }

 

 

六、计算模块部分异常处理说明

  在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景

java异常主要分为以下这些种类,比较常见的有空指针异常,溢出异常,找不到类,找不到文件

由于我们的项目包含数据库,相对应的数据库操作的异常处理也很多.

见下图和以下代码:

右击图像 ---> 查看图像即可看大图:

          

 

 

   /*
*增加用户
*/
@Test
public void insertUsers(String nickname ,String password,String email) { Users users = new Users(); try { Class.forName(DRIVER); connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); String sql = "INSERT INTO db_user(nickname,password,email) VALUE(?,?,?)"; ps = connection.prepareStatement(sql); ps.setString(1, nickname); ps.setString(2, password); ps.setString(3, email); ps.execute(); } catch (Exception e) { System.out.println(e.getStackTrace()); } finally { try { connection.close(); ps.close(); } catch (SQLException e) { System.out.println(e.getStackTrace()); } } }
     /*
     * 读取文件
     * */
    
    @Test
    public void ReadFile(String fromUrl,String toUrl){
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(toUrl));
            BufferedReader br = new BufferedReader(new FileReader(fromUrl));
            String s = null;
            for(int i=1;i<=100;i++){
                s = String.valueOf(Math.random());
                bw.write(s);
                bw.newLine();
            }
            bw.flush();
            while((s=br.readLine())!=null){
                System.out.println((String)s);
                System.out.println("下一行");
            }
            bw.close();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    /*
*查询所有的用户
*/
    @Test
    public List<Users> queryAllUsers() {
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Users> list = new ArrayList<Users>();
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            String sql = "SELECT * FROM db_user";
            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()){
                Users users = new Users();
                users.setId(rs.getInt("id"));
                users.setNickName(rs.getString("nickname"));
                users.setPassword(rs.getString("password"));
                users.setEmail(rs.getString("email"));
                list.add(users);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e){
                e.printStackTrace();
            }
        }
        return list;
    }

 

七、界面模块的详细设计过程

  在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。(5')

        右键点击图像 ---> 查看图像即可看大图:

                           

 

 我们的出题界面:右击图像 ---> 查看图像即可看大图:

                                                                 

 

 右击图像 ---> 查看图像即可看大图:

 

 

 

八、界面模块与计算模块的对接

  详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。(4')

      以下代码是交互时jsp获取数据代码:

<%
    Function fun = new Function();
    /* 1.把获得的题目数提交给后台 */
    String problemNum = request.getParameter("problemNum");
    fun.setNum(Integer.parseInt(problemNum));
    %>
    
    <% 
    /* 2.包含多少个运算符 */
    String symbolNum = request.getParameter("symbolNum");
    fun.setSybNum(Integer.parseInt(symbolNum));
    %>
    
    <%
    /* 3.算式数值范围*/
    String max = request.getParameter("max");
    fun.setMax(Integer.parseInt(max));
    %>
    
    <%
    /* 4.是否包含乘除法*/
    String multi = request.getParameter("multi");
    if(multi=="true")
        fun.isMulDiv(true);
    else
        fun.isMulDiv(false);
    %>

 

 

 

九、描述结对的过程

  结对过程:

      作业发布以后我一直在学习GUI,看了几天的视频,但是后来决定制作web网页,又开始着手准备web……

      然后按前后端分工:我们两个都是学习的后台,但是因为我前台经验少,就只能辛苦他负责前台了,但是在实践过程中后台部分他也会经常帮助我,并解决了很多问题。后来他还负责了jsp页面。期间一起开过几次会确认分工,互相了解代码功能,后来一起和页面……总之合作的过程还是很顺利的,我在疲劳期的时候就他来做,他在疲劳期的时候就是我来做,他也性格比较好,很好沟通。

     总之这次合作每个人都做了很多,也都有很多收获,结对项目和个人项目完成的过程确实有很大的不同,这次的不足就是浪费了几天时间学习GUI,没有作业刚发布就开始讨论做什么,怎样分工,这可能也是因为我们还缺少经验。以后组队项目会吸取这次的经验,提早开始准讨论并准备~~

  结对照片:

 

 

十、结对编程的优点和缺点

看教科书和其它参考书,网站中关于结对编程的章节,例如:

http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

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

      结对编程的优点:

       1.可以减轻一个人编程的工作量,当一个人做时间久了就会很容易疲劳而且效率低下。但两个人可以轮番交替工作,轮番工作两个人都会很熟悉代码,提高了效率。

       2.遇到问题更容易解决,当一个人长时间无法解决问题,就两个人集思广益,每个人都有自己熟悉的领域。

        结对编程的缺点:和一个人做相比缺少了一些自主性,需要讨论统一意见什么的,还要开会,因为不是自己亲自设计的,有时候会不熟悉对方的代码结构。

      

       我的优缺点:

       优点:比较认真,时间规划比较好,java语言基础比较好   

       缺点:敲代码重度强迫症,不对齐或者格式不好就一定要改好,很浪费时间

                  有时候改不好bug会很烦

                  前台知识有待提高

    

       队友的优缺点:

       优点:比较认真负责;心态很好,出问题就积极改正,并对于bug有坚持不懈的精神;态度端正乐于助人,很好沟通。

       缺点:代码有时候会有一点不规范

    

      

 

 

 

十一、实际花费的时间

 

PSP 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划  8  10
Estimate 估计每个阶段的时间成本,并规划大致工作步骤  8  10
Development 开发 3000 4000
 Analysis  需求分析 (包括学习新技术)  60  60
 Design Spec  生成设计文档  40  50
 Design Review  设计复审 (和同事审核设计文档)  40  45
 Coding Standard  代码规范 (为目前的开发制定合适的规 范)  30  40
 Design  具体设计  120  100
 Coding  具体编码  180  200
 Code Review  代码复审  150  150
 Test  测试(自我测试,修改代码,提交修改)  90  90
Reporting 报告  200  230
Test Report  测试报告  120  150
Size Measurement  计算工作量  20  20
 Postmortem & Process Improvement Plan  事后总结, 并提出过程改进计划  60  60

 

 

posted @ 2018-04-09 22:43  山川湖海*  阅读(145)  评论(1编辑  收藏  举报