软工网络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、检查大部分主要类之间的关系,画出类图

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

  • 源代码质量和测试覆盖率


  • 当前设计的一个弱点,通过重构,确保在这个地方已有测试覆盖并保证重构没有改变已有的功能

    • 1、当前的代码的分数多项式的加减法结果是有问题的。
    • 2、当前代码不能实现乘方
    • 3、当前代码不能实现开根号
  • 修改代码后,检查代码覆盖,看单元测试是否需要修改?测试用例是否需要增加?

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!");}//数值范围超出时抛出异常
           }
        }
  • 结果展示
\实现乘方
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!");}//数值范围超出时抛出异常
	           } 
      }	
			

结果展示:

\实现数的开根号
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);
        	}
        }
}

结果展示:

三、结对照骗

四、总结

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

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

PSP2.1 个人开发流程 预估耗费时间(分钟) 实际耗费时间(分钟)
Planning 计划 15 12
Estimate 明确需求和其他相关因素,估计每个阶段的时间成本 8 9
Development 开发 150 198
Analysis 需求分析 (包括学习新技术) 6 20
Design Spec 生成设计文档 0 0
Design Review 设计复审 8 15
Coding Standard 代码规范 3 4
Design 具体设计 10 10
Coding 具体编码 36 20
Code Review 代码复审 15 11
Test 测试(自我测试,修改代码,提交修改) 15 20
Reporting 报告 20 25
. 测试报告 6 5
· 计算工作量 10 6
· 并提出过程改进计划 10 15
原文地址:https://www.cnblogs.com/JMUNJF/p/8646910.html