在http://blog.csdn.net/chensheng913/archive/2006/01/17/581616.aspx?Pending=true 有一个讨论帖,有位网友提出了把以下语句的分支语句取消的问题,他的语句如下:
Dim count1
count1 = salary.Value + USA.Value * Drate + JAN.Value * Jrate - 4000
If count1 < 500 Then
tax.Value = count1 * 0.05
ElseIf count1 < 2000 Then
tax.Value = count1 * 0.1 - 25
ElseIf count1 < 5000 Then
tax.Value = count1 * 0.15 - 125
ElseIf count1 < 20000 Then
tax.Value = count1 * 0.2 - 375
ElseIf count1 < 40000 Then
tax.Value = count1 * 0.25 - 1375
ElseIf count1 < 60000 Then
tax.Value = count1 * 0.3 - 3375
Else
tax.Value = count1 * 0.3 - 3375
End If
这段代码复杂而多变,给书写,阅读,测试和维护都会带来困难,所以这位网友想消除它是很合理的。
这是个税率计算的语句段,公式是确定的:税=月薪*税率-折扣,税率又和月薪有关系,月薪越高税率越高,首先这里可以归纳出一个基本类:
public class TaxItem{
float limit; // 月薪界限
float ratio;// 税率
float discount;// 折扣
public TaxItem(float limit,float ratio,float discount){
this.limit=limit;
this.ratio=ratio;
this.discount=discount;
}
public TaxItem(){
this(0.0f,0.0f,0.0f);
}
public float getDiscount() {
return discount;
}
public float getLimit() {
return limit;
}
public float getRatio() {
return ratio;
}
}
然后就是税计算类:
import java.util.ArrayList;
public class TaxCaculator{
private static ArrayList list=new ArrayList();
public TaxCaculator(){
// 这里把各个等级加入到链表中,注意添加顺序是由小到大
list.add(new TaxItem(500.0f,0.05f,0.0f));
list.add(new TaxItem(2000.0f,0.1f,25.0f));
list.add(new TaxItem(5000.0f,0.15f,125.0f));
list.add(new TaxItem(20000.0f,0.2f,375.0f));
list.add(new TaxItem(40000.0f,0.25f,1375.0f));
list.add(new TaxItem(60000.0f,0.3f,3375.0f));
}
// 这个函数用来计算所得税
public float getTax(float salary){
TaxItem item=new TaxItem();
for(int i=0;i<list.size();i++){
item=(TaxItem)list.get(i);
if(salary>item.getLimit()){
continue;
}
else{
break;
}
}
// 返回最终结果,当然,这个公式也可以放在TaxItem 类中,这里就见仁见智了。
return salary*item.getRatio()-item.getDiscount();
}
}
// 调用方法如下
public class Inlet{
public static void main(String[] arg){
TaxCaculator taxCaculator=new TaxCaculator();
float salary=1000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=2000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=3000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=4000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=5000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=15000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=25000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=55000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=65000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
salary=85000.f;
System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
}
}
输出如下:
Salary=1000.0 Tax=75.0
Salary=2000.0 Tax=175.0
Salary=3000.0 Tax=325.00003
Salary=4000.0 Tax=475.0
Salary=5000.0 Tax=625.0
Salary=15000.0 Tax=2625.0
Salary=25000.0 Tax=4875.0
Salary=55000.0 Tax=13125.0
Salary=65000.0 Tax=16125.0
这样就消除了冗长复杂的分支语句。
相应程序扩展:
如果是从配置文件读取各个等级,则需要将TaxCaculator的构造函数中的等级添加部分提出到一个函数中,需要时调用就可以。
欢迎各位朋友和我讨论。
E-mail:junglesong@gmail.com.
