软工网络15结对编程(201521123061倪兢飞)

分数多项式运算改进
本文介绍了对现有分数多项式运算程序的功能改进与扩展,包括修复加减法的问题、新增乘方与开根号功能,并通过重构提高代码质量及测试覆盖率。

一、结对成员信息

学号姓名博客链接码云地址
201521123044吴敏烽https://www.cnblogs.com/Min21/https://gitee.com/min21/events
201521123061倪兢飞https://home.cnblogs.com/u/JMUNJF/https://gitee.com/nikoudoublefly/events

源代码地址:https://coding.net/u/lhl1212/p/work2/git
原题目要求:http://www.cnblogs.com/happyzm/p/6472120.html

二、功能改进与扩展

1、检查大部分主要类之间的关系,画出类图

1109705-20180325190417900-1267519841.png

2、浏览所有代码考虑代码质量和测试覆盖率

  • 源代码质量和测试覆盖率
    1109705-20180325191430563-1099410858.png
    1109705-20180325192205765-1451747156.png
    1109705-20180325192419508-1708828571.png

  • 当前设计的一个弱点,通过重构,确保在这个地方已有测试覆盖并保证重构没有改变已有的功能
    • 1、当前的代码的分数多项式的加减法结果是有问题的。
    • 2、当前代码不能实现乘方
    • 3、当前代码不能实现开根号
      1109705-20180325201850299-1785816980.png
  • 修改代码后,检查代码覆盖,看单元测试是否需要修改?测试用例是否需要增加?
    1109705-20180325201211238-1172084956.png
    1109705-20180325201220690-1388002412.png

3、代码重构和增加功能。

\\分数多项式的加减法修改
        public void add(String s)//加法
        {
            String[] str=s.split("[+]");
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {
                String[] str1=str[0].split("\\/");
                String[] str2=str[1].split("\\/");
                if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)//分母不为零
                {
                    result =simplefraction(((Integer.parseInt(str1[0])*Integer.parseInt(str2[1]))+(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1])));        
                }else{
                    throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
                }
            }
            else{//整数
               if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                {     
                   result = Integer.parseInt(str[0])+Integer.parseInt(str[1])+""; 
                   }        
            
           else{
               throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
           } 
            
        }
        
        public void substract(String s)//减法
        {
            String[] str=s.split("[-]");
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {
                String[] str1=str[0].split("\\/");
                String[] str2=str[1].split("\\/");
                if(Integer.parseInt(str1[1]) != 0 && Integer.parseInt(str2[1]) != 0)//分母不为零
                {
                    result =simplefraction(((Integer.parseInt(str1[0])*Integer.parseInt(str2[1]))-(Integer.parseInt(str2[0])*Integer.parseInt(str1[1]))),(Integer.parseInt(str1[1])*Integer.parseInt(str2[1])));        
                }else{
                    throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
                }
            }
            else{//整数
           if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                {
               result = Integer.parseInt(str[0])-Integer.parseInt(str[1])+"";
               }        
            
           else{
               throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
           }
        }
  • 结果展示
    1109705-20180325203110301-1036031333.png
\\实现乘方
private void power(String s) {  //乘方
            String[] str=s.split("[\\^]");
            int n=Integer.parseInt(str[1]);
            if(str[0].indexOf("/")>-1 || str[1].indexOf("/")>-1)//分数
            {  
                String[] str1=str[0].split("\\/");
                if(Integer.parseInt(str1[1]) != 0)//分母不为零
                {
                    
                    int Fz=Integer.parseInt(str1[0]);
                    int Fm=Integer.parseInt(str1[1]);
                    int FzResult=1;
                    int FmResult=1;
            
                    for(int i=0;i<n;i++){
                        FzResult=FzResult*Fz;
                        FmResult=FmResult*Fm;
                    }
                    result=simplefraction(FzResult,FmResult);
                    
                }else{
                    throw new IllegalArgumentException("Divisor cannot be zero!");//除数为零时抛出异常
               }
                    
        }
             else{//整数
                   if( Integer.parseInt(str[0])<1000&&Integer.parseInt(str[1])<1000&&Integer.parseInt(str[0])>-1000&&Integer.parseInt(str[1])>-1000)
                    {     
                      int x=Integer.parseInt(str[0]);
                      int IntResult=(int)Math.pow(x, n);
                      result=Integer.toString(IntResult);
                }           
                
               else{
                   throw new IllegalArgumentException("overrun!");}//数值范围超出时抛出异常
               } 
      } 
            

结果展示:
1109705-20180325203349447-2060428477.png

\\实现数的开根号
private void sqrt(String s) {
            String[] str=s.split("[√]");
            int Num=Integer.parseInt(str[1]);
            int n=1;//倍数
            int x;
            if(Num%4==0){
                while(Num%4==0){
                    n=n*4;
                    Num=Num/4;
                    
                x=(int) Math.sqrt(n);
                System.out.println(x+"√"+Num);
            }
        }
}

结果展示:
1109705-20180325204112739-1591823799.png

三、结对照骗

1109705-20180325205006801-2053652760.png

四、总结

1.这次的结对编程,锻炼了我们的合作意识,与合作能力
2.在重构的过程中,应该先针对源代码进行透彻的分析,了解源码的不足之处
与还未完善的地方
3.预先的计划与实际中所花费的时间不同,增长了不少实战的经验,给了我很大的提升

五、提供此次结对作业的PSP

PSP2.1个人开发流程预估耗费时间(分钟)实际耗费时间(分钟)
Planning计划1512
Estimate明确需求和其他相关因素,估计每个阶段的时间成本89
Development开发150198
Analysis需求分析 (包括学习新技术)620
Design Spec生成设计文档00
Design Review设计复审815
Coding Standard代码规范34
Design具体设计1010
Coding具体编码3620
Code Review代码复审1511
Test测试(自我测试,修改代码,提交修改)1520
Reporting报告2025
.测试报告65
·计算工作量106
·并提出过程改进计划1015

转载于:https://www.cnblogs.com/JMUNJF/p/8646910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值