结对开发
Posted tkg1314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对开发相关的知识,希望对你有一定的参考价值。
1、第一阶段目标:重构四则运算-- 能把计算的功能封装起来,通过API 接口调用计算方法。
定义一个计算核心类:把四则运算的计算功能包装在一个模块中 (这个模块可以是一个类 Class, 一个DLL等等)。
“计算核心”模块和调用类它的其他模块之间是什么关系呢?
它们要通过一定的API (Application Programming Interface) 来和其他模块交流。
这个API 接口应该怎么设计呢? 可以从下面的最简单的接口开始:
Calc()
这个Calc 函数接受字符串的输入(字符串里就是运算式子,例如 “ 5+3.5“, “7/8 – 3/8 ”, “3 + 90 * (-0.3)“ 等等),这个模块的返回值是一个字符串,例如,前面几个例子的结果就是 ( ”17.5“, “ 1/2”, “-24“).
2 第二阶段目标 - 通过测试程序和API 接口测试其简单的加减乘除功能。并能看到代码覆盖率。
可以扩展 Calc() 的定义,让它接受一个新的参数 “precision”, 或者可以启用一个新的函数 Setting()。
最多4 个运算符
数值范围是 -1000 到 1000
精度是小数点后两位
怎么通过API 告诉我们的模块呢? 我们当然可以用函数的参数直接传递,但是参数的组合很多,怎么定义好参数的规范呢? 建议大家考虑用 XML 来传递这些参数。
增加了新的Setting() 函数之后,要让模块支持这样的参数,同时,还要保证原来的各个测试用例继续正确地工作。
3第三阶段目标 – 定义异常处理。
如果输入是有错误的,例如 “1 ++ 2”, 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768 * 3”, 或者是 “ 248.04 / 0” 怎么办? 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示? 那么如果真的计算结果是 “-1” 又怎么处理呢?
建议这个时候,要定义各种异常 (Exception), 让 Core 在碰到各种异常情况的时候,能告诉调用者 - 你错了! 当然,这个时候,同样要进行下面的增量修改:
定义要增加什么功能 - 例如:支持 “运算式子格式错误” 异常,写好测试用例,传进去一个错误的式子,期望能捕获这个 异常。 如果没有,那测试就报错。
在 Core 模块中实现这个功能,测试这个功能, 同时测试所有以前的功能,保证以前的功能还能继续工作 (没有 regression), 确认功能完成,继续下一个功能。
代码:
import java.math.BigDecimal;import java.text.NumberFormat;import java.util.*;public class Core { public int calc(String zifu,int max,int fanwei1,int fanwei2,int jingdu) throws ZeroException, MoreException, CharNumException { float a[]=new float [20]; int b[]=new int [20]; char c[]=new char [20]; int j=0; int shu; float sum = 0; String fu="+-/*"; //System.out.println(zifu.length()); for(int i=0;i<zifu.length();i++) { if(zifu.charAt(i)==‘+‘) { b[j]=i; c[j]=‘+‘; j++; //System.out.println("++++"); } else if(zifu.charAt(i)==‘-‘) { b[j]=i; c[j]=‘-‘; j++; // System.out.println("---"); } else if(zifu.charAt(i)==‘*‘) { b[j]=i; c[j]=‘*‘; j++; } else if(zifu.charAt(i)==‘/‘) { b[j]=i; c[j]=‘/‘; j++; } } //System.out.println(j); //System.out.println(zifu.substring(2,5)); for(int i=0;i<j+1;i++) { if(i==0) a[i]=Integer.parseInt(zifu.substring(0,b[i])); else if(i==j) a[i]=Integer.parseInt(zifu.substring(b[i-1]+1,zifu.length())); else a[i]=Integer.parseInt(zifu.substring(b[i-1]+1,b[i])); } /*for(int i=0;i<j+1;i++) { System.out.print(a[i]+" "); } for(int i=0;i<j;i++) { System.out.println(c[i]); }*/ String yunsuanfu1=String.valueOf(c); if(j-1>max) { throw new CharNumException("字符数大于"+max+""); } for( shu=0;shu<j+1;shu++) {//System.out.println("111"); if(a[shu]>fanwei2||a[shu]<fanwei1) { throw new MoreException("有些数字不在范围内"); } } //System.out.println(j+"!!!!!!!"); StringBuffer yunsuanfu=new StringBuffer(yunsuanfu1); //System.out.println(yunsuanfu.indexOf("*")); //System.out.println(yunsuanfu); //System.out.println(yunsuanfu.indexOf("*")); while(yunsuanfu.indexOf("*")!=-1||yunsuanfu.indexOf("/")!=-1) { if(yunsuanfu.indexOf("/")==-1&&yunsuanfu.indexOf("*")!=-1) { sum=a[yunsuanfu.indexOf("*")]*a[yunsuanfu.indexOf("*")+1]; a[yunsuanfu.indexOf("*")]=a[yunsuanfu.indexOf("*")]*a[yunsuanfu.indexOf("*")+1]; for(int i=yunsuanfu.indexOf("*")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } //System.out.println(sum); yunsuanfu.delete(yunsuanfu.indexOf("*"), yunsuanfu.indexOf("*")+1); } else if(yunsuanfu.indexOf("*")<yunsuanfu.indexOf("/")&&yunsuanfu.indexOf("*")!=-1) { sum=a[yunsuanfu.indexOf("*")]*a[yunsuanfu.indexOf("*")+1]; a[yunsuanfu.indexOf("*")]=a[yunsuanfu.indexOf("*")]*a[yunsuanfu.indexOf("*")+1]; for(int i=yunsuanfu.indexOf("*")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } //System.out.println(sum); yunsuanfu.delete(yunsuanfu.indexOf("*"), yunsuanfu.indexOf("*")+1); } else if(yunsuanfu.indexOf("/")<yunsuanfu.indexOf("*")&&yunsuanfu.indexOf("/")!=-1) { if(a[yunsuanfu.indexOf("/")+1]==0) { throw new ZeroException("除数不能为0!"); } sum=a[yunsuanfu.indexOf("/")]/a[yunsuanfu.indexOf("/")+1]; a[yunsuanfu.indexOf("/")]=a[yunsuanfu.indexOf("/")]/a[yunsuanfu.indexOf("/")+1]; for(int i=yunsuanfu.indexOf("/")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } //System.out.println(sum); yunsuanfu.delete(yunsuanfu.indexOf("/"), yunsuanfu.indexOf("/")+1); } else if(yunsuanfu.indexOf("*")==-1&&yunsuanfu.indexOf("/")!=-1) { if(a[yunsuanfu.indexOf("/")+1]==0) { throw new ZeroException("除数不能为0!"); } sum=a[yunsuanfu.indexOf("/")]/a[yunsuanfu.indexOf("/")+1]; a[yunsuanfu.indexOf("/")]=a[yunsuanfu.indexOf("/")]/a[yunsuanfu.indexOf("/")+1]; for(int i=yunsuanfu.indexOf("/")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } //System.out.println(sum); yunsuanfu.delete(yunsuanfu.indexOf("/"), yunsuanfu.indexOf("/")+1); } } while(yunsuanfu.indexOf("+")!=-1||yunsuanfu.indexOf("-")!=-1) { if(yunsuanfu.indexOf("+")!=-1&&yunsuanfu.indexOf("+")<yunsuanfu.indexOf("-")) { sum=a[yunsuanfu.indexOf("+")]+a[yunsuanfu.indexOf("+")+1]; a[yunsuanfu.indexOf("+")]=a[yunsuanfu.indexOf("+")]+a[yunsuanfu.indexOf("+")+1]; for(int i=yunsuanfu.indexOf("+")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } yunsuanfu.delete(yunsuanfu.indexOf("+"), yunsuanfu.indexOf("+")+1); // System.out.println(yunsuanfu); //System.out.println(1); } else if(yunsuanfu.indexOf("-")!=-1) { sum=a[yunsuanfu.indexOf("-")]-a[yunsuanfu.indexOf("-")+1]; a[yunsuanfu.indexOf("-")]=a[yunsuanfu.indexOf("-")]-a[yunsuanfu.indexOf("-")+1]; for(int i=yunsuanfu.indexOf("-")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } yunsuanfu.delete(yunsuanfu.indexOf("-"), yunsuanfu.indexOf("-")+1); //System.out.println(yunsuanfu); //System.out.println(2); } else{ sum=a[yunsuanfu.indexOf("+")]+a[yunsuanfu.indexOf("+")+1]; a[yunsuanfu.indexOf("+")]=a[yunsuanfu.indexOf("+")]+a[yunsuanfu.indexOf("+")+1]; for(int i=yunsuanfu.indexOf("+")+1;i<yunsuanfu.length()-1;i++) { a[i]=a[i+1]; } yunsuanfu.delete(yunsuanfu.indexOf("+"), yunsuanfu.indexOf("+")+1); //System.out.println(yunsuanfu); //System.out.println(3); } //System.out.println(sum); } BigDecimal bd = new BigDecimal(sum); bd = bd.setScale(jingdu,BigDecimal.ROUND_HALF_UP); System.out.println(bd); System.out.println(yunsuanfu); /*for(int i=0;i<j+1;i++) { System.out.print(a[i]+" "); }*/ return 0; } }
import java.util.Scanner; public class Calculator { /** * @param args */ public static void main(String[] args) { Core c=new Core(); try{ c.calc("20-8/2-20*5+5",4,-1000,1000,4); } catch(ZeroException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch(MoreException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch(CharNumException e) { System.out.println(e.getMessage()); e.printStackTrace(); } } } class CharNumException extends Exception { public CharNumException(String msg) { super(msg); } } class MoreException extends Exception { public MoreException(String msg) { super(msg); } } class ZeroException extends Exception { public ZeroException(String msg) { super(msg); } }
以上是关于结对开发的主要内容,如果未能解决你的问题,请参考以下文章