软件工程网络15结对编程作业

本文详细介绍了如何实现分数运算的功能,包括加减乘除及错误排查,并通过代码重构提高程序的可读性和运行效率。

题目要求:

码云链接

201521123011祁泽文码云地址:https://gitee.com/jiaowoxiaotiancai/software-engineering
201521123009张晨晨码云地址:https://gitee.com/z1450429983/events

需求分析:

1.实现分数整数的四则运算。
2.实现错误排查,以及正确率的统计。
3.实现新增功能括号运算,减少重复题目。
4.进行代码的单元测试,检查覆盖率。

clone过程:

[改]修改clone部分:

1103004-20180401131805570-1565022549.png

类图:

1103004-20180324221833256-873946874.png

1.参考代码的不足之处:

1.改进现有代码
【参考】个人博客地址2:http://www.cnblogs.com/belong033 ,源代码:https://coding.net/u/Belong033/p/java-third/git

不足之一:

从以上可以看出这位同学已经有了main函数,又在类(这里有两个类createInteger创建整数类,createFraction创建分数类)中又写了main方法,使得整体代码的可读性不高。

1103004-20180324133538269-2121926157.png
1103004-20180324133517564-597246656.png

不足之二:

并且在类的main方法中包含了所有的运算方法(加减乘除)导致:
1.测试时main方法出错却不知道哪一个代码块出现问题,不能分布排查。
2.有大量重复代码,使代码的冗长,降低运行效率。

1103004-20180324134244200-579910438.png
1103004-20180324134323897-631876077.png

不足之三:

这里的辗转相除法感觉出现了逻辑问题,运行时结果是错误的。

1103004-20180324133921646-461044427.png
1103004-20180401152426281-2105067729.png

2.修改与重构:

重构1(针对方法的重构):

将两个类中的main方法删除(这里以createInteger为例),将加减乘除单独写成方法,这样便可以一目了然,再在main中调用createInteger的方法。用switch后,那段判断判断正误的if循环也只需要写一遍就可以了,大大简化了之前的代码。
1103004-20180324135905649-721015392.png
1103004-20180324140054950-1402841918.png
1103004-20180324145437606-1980096481.png

重构2(针对逻辑问题的重构):

对于问题3辗转相除法求公约数修改后的代码,最后运行结果的截图如下图:

1103004-20180324144236162-1719424313.png
1103004-20180324205020289-2032569316.png

3.单元测试:

第一次测试:

可以看出第一次做单元测试时有一个错误,是除法产生的,再去重新测试除法时发现了所返回的数的格式转换问题。

1103004-20180324205255230-974465976.png

第一次测试问题修正:

检查代码发现是因为,除法会产生分数所以我返回的是String型,而我的result是int型,所以再转换时出现了格式错误。
修改时有两个想法:1.用数组储存分子分母,返回一个整型,在main函数调用时采用```i1+“/”+i2````的格式输出。但这样就把除法搞复杂了。2.将所有方法(加减乘除)都返回String型,result也定义为String型,这样相对简单,代码阅读性也高。

1103004-20180324205450845-1302800807.png

第二次测试:

1103004-20180324210139632-984493037.png

4.检测覆盖率:

1103004-20180324210341206-991950435.png

[改]修改:

1103004-20180401124256245-1164879441.png

【功能改进与扩展】

思维导图:

1103004-20180325172052195-982563251.png

增加括号运算符:

虽然在参考代码中只找到了逻辑错误,没找到逻辑泥球,但在自己写括号运算时,体验到了什么叫逻辑泥球,在用栈写括号运算时,可能想的方式不够好导致了一堆if,else的循环,一个嵌套一个。于是不用栈了。

//逻辑泥球
 Integer s = null;
         for (int i = 0; i < arr.length; i++) {
        if  ( stack.isEmpty()){
            if(arr[i].equals("("))
            continue;
            else
            stack.push(arr[i]);
         }
        
        else if (arr[i].equals(")") ){
              String r1 = stack.pop();
              String r2 = stack.pop();
              String r3 = stack.pop();
              char r=r2.charAt(0);
            Integer  a = Integer.valueOf(r1);
            Integer b = Integer.valueOf(r3);
              if(stack.isEmpty()){

              switch(r){
                case '+':
                     m=a+b;
                    break;
                case '-':
                    m=a-b;
                    break;
                    }
              String l1=arr[i+1];//*/
              char l=l1.charAt(0);
              String l2=arr[i+2];
              Integer l3= Integer.valueOf(l2);
              switch(l){
                case '*':
                     s=m*l3;
                    break;
                case '/':
                    Integer A=new Integer(5);
                    int m1=A.intValue();
                    int l4=A.intValue();
                    String s1=createInteger.dev(m1, l4);
                    s= Integer.valueOf(s1);
                    break;  
                    }
                }
              else {
                  String r4 = stack.pop();//fuhao
                  String r5 = stack.pop();
                  char l=r4.charAt(0);
                  Integer l3= Integer.valueOf(r5);
                  switch(l){
                    case '*':
                         s=m*l3;
                        break;
                    case '/':
                        Integer A=new Integer(5);
                        int m1=A.intValue();
                        int l4=A.intValue();
                        String s1=createInteger.dev(l4, m1);
                        s= Integer.valueOf(s1);
                        break;
                        }
                    }
             }
     }      

下图是修改后的代码,但是还是不够完善。因为用switch规定了产生算式的格式如:case 1:str="("+a+"+"+b+")*"+c+"=";break;没有用二叉树随机生成符号或算式。
1103004-20180325165145470-1538104712.png
1103004-20180325165240483-1503269268.png

【附加题】

增加一个运算符(乘方)

1103004-20180324230717278-1067778131.png
1103004-20180324230824640-1787322819.png

[改]添加:效能分析

1103004-20180401142040940-1205722157.png
1103004-20180401140934347-1246781824.png
1103004-20180401141644264-1226049590.png

【两人合作】

照片:

1103004-20180325161132222-1904310732.png

总结(结对编程感想)

1.两人确定了代码规范,以Tab键为准。体验了这次结对编程,在领航员和驾驶员两个角色下互相转换,说实话并没有体验到1+1>2。可能由于两人编程基础都相对薄弱,所以没有思维的碰撞,更多的交流只是一个人听从另一个人的想法。
2.这次选取的代码结构相对不太友好,前期两人都忙于重构代码,几乎是重写了整个代码的结构,让我们认识到一个代码好的风格的重要性,如果将所有的方法写在一个main方法中,不仅测试难以测试出具体出错的地方,也不方便对功能的增删改查。
3.通过和已经工作的人对比psp发现,需求分析方面所用时间太少,而编写代码时间太长。这也是需要改进的地方。

PSP

1103004-20180325170633142-1161952573.png

转载于:https://www.cnblogs.com/jiaowoxiaotiancai/p/8638951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值