• 结对项目


    一、【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页面调用,类与类之间划归清晰,面向对象编程也大大实现了代码的重用性。

        

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

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

    (图片较小,右击图像 ---> 查看图像即可看大图):

     

     

     

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

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

     

    消耗最大的函数:

    复制代码
          /*
         * 得到算式,得到答案
         * 这个方法是把所有的整个式子,算式和结果分别放入三个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;
     4 
     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')

      我们用的是网页端来展示界面模块,所以主要是html,css,js来实现的界面模块设计,主要分为注册页面、登录页、主页面、做题页面、错题页面,

    登录页

    主页面

     

     

      做题页面

    八、【界面模块与计算模块的对接】
      最为核心的做题页面采用的是jsp代码由主页面homePage.jsp传参到做题页面doYourAnswer.jsp,然后用户输入答案后,通过循环将answer进行判断,判断结束后,记录错题的题号,并通过URL传值进入错题页wrongQuestion.jsp,部分代码如下:

     <form action="doYourAnswer.jsp" method="post">
                        <table>
                            <tr>
                                <td><input type="text" name="myAnswer"/></td>
                                <td><input type="submit" value = "提交"></td>
                                <td>
                                <%
                                        String myAnswer = request.getParameter("myAnswer");
                                        String answer = Lists.resArr.get(num);
                                        if (myAnswer == answer){
                                            out.print(num + "right");
                                        }else{
                                            out.print(num + "wrong");
                                            QuesNum[wrongNum]=num;
                                            wrongNum++;
                                        }
                                    }
                                %>
                                </td>
                            </tr>
                        </table>
                    </form>
                    <a href="wrongQuestion.jsp?<%
                    for ( int i=0 ;i<=wrongNum;i++ ) {%>
                        re[]=<%=QuesNum[i] %>
                    <%
                    }
                    %>&&wrongNum=<%=wrongNum %>">查看错题</a>

    九、描述结对的过程

      结对过程:我的队友是杨帆,十分感谢他在本次作业中的帮助,我们两人之前都是主学后台,由于我对前台略懂所以我的代码任务主要是负责页面,另外就是Jsp的页面完成前后台对接,对于用户管理的数据库操作和Java工具类的实现是队友协助完成的。做这个项目时,出现了不少Bug,

      结对照片:

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

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

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

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

           结对编程的优点:

           1.  取长补短,也许很多时候一个人想不到的东西结合两人的想法也许就能产生非凡的效果

        2.相互学习的机会,使两人共同进步,能促进同学间友好交流

           3.体验合作的快乐

           缺点:有时意见可能会不统一

     

           我的优缺点:

           优点:比较有耐心,坚持做好一件事,善于搜索信息,比较细心 。  

           缺点:有时不断坚持处理事情会稍不灵活。

     

           队友(杨帆)的优缺点:

           优点:认真自信,富有责任心,吃苦耐闹,处理事情比较灵活。

           缺点:比较。。。呃呃呃,感觉没啥毛病,大家一起合作,虽然有时会有一种修复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

     

  • 相关阅读:
    团队项目——站立会议DAY14
    团队项目——站立会议DAY13
    团队项目——站立会议DAY12
    团队项目——站立会议 DAY11
    团队项目——站立会议DAY10
    团队项目——站立会议DAY9
    团队项目——站立会议 DAY8
    团队项目——站立会议DAY7
    团队项目——站立会议DAY6
    作业五:团队项目——项目启动及需求分析
  • 原文地址:https://www.cnblogs.com/liuz100/p/8769857.html
Copyright © 2020-2023  润新知