和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          薪水計算續

          本文是 "從薪水計算的例子看一段程序在不同環境中的變化 " 的續文.

          如果需求發生如下變化:
           

          如果說國家改變了公民福利制度,具體就是500元以下的每人補充300,超過20000元的在原有基礎上再扣除20%,請問該如何編程?

          具體等級稅率:

          等級                             稅率                            額定扣除數

          不超過500               5%                              0 (低保每人補助300)

          大于500小于2000       10%                             25

          大于2000小于5000     15%                             125

          大于5000小于20000    20%                             375

          超過20000               25%                             1375(在計算完的基礎上再乘以80%)

           

          這時原有公式就不適用了,我們沒有必要回到分支語句的老路上去,將計算公式歸并成SalaryGrade的一個函數getSalaryAfterTax,然后從SalaryGrade分別擴展兩個類HigherSalaryGrade和LowerSalaryGrade,然后分別實現各自的getSalaryAfterTax函數即可.

          代碼如下:
          SalaryGrade類:
          package com.sitinspring.oostyleadv;

          /**
           * 工資等級類
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class SalaryGrade {
              
          // 月薪界限
              protected double grade;

              
          // 稅率
              protected double ratio;

              
          // 折扣
              protected double discount;

              
          public SalaryGrade(double grade, double ratio, double discount) {
                  
          this.grade = grade;
                  
          this.ratio = ratio;
                  
          this.discount = discount;
              }

              
              
          public double getSalaryAfterTax(double salary){
                  
          return salary*(1-ratio)-discount;
              }


              
          public SalaryGrade() {
                  
          this(0.0f0.0f0.0f);
              }


              
          public double getDiscount() {
                  
          return discount;
              }


              
          public double getGrade() {
                  
          return grade;
              }


              
          public double getRatio() {
                  
          return ratio;
              }

          }

          HigherSalaryGrade類:
          package com.sitinspring.oostyleadv;

          /**
           * 超高收入工資等級類
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class HigherSalaryGrade extends SalaryGrade{
              
          public HigherSalaryGrade(double grade, double ratio, double discount) {
                  
          super(grade,ratio,discount);
              }

              
              
          public double getSalaryAfterTax(double salary){
                  
          return (salary*(1-ratio)-discount)*0.8;
              }


              
          public HigherSalaryGrade() {
                  
          this(0.0f0.0f0.0f);
              }

          }

          LowerSalaryGrade類:
          package com.sitinspring.oostyleadv;

          /**
           * 低保工資等級類
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class LowerSalaryGrade extends SalaryGrade{
              
          public LowerSalaryGrade(double grade, double ratio, double discount) {
                  
          super(grade,ratio,discount);
              }

              
              
          public double getSalaryAfterTax(double salary){
                  
          return salary*(1-ratio)-discount+300;
              }


              
          public LowerSalaryGrade() {
                  
          this(0.0f0.0f0.0f);
              }

          }

          SalaryCaculator類:
          package com.sitinspring.oostyleadv;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;

          /**
           * 工資計算類
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class SalaryCaculator{
              
          private List<SalaryGrade> grades;
              
              
              
          public SalaryCaculator(){
                  grades
          =new ArrayList<SalaryGrade>();
                  
                  grades.add(
          new LowerSalaryGrade(500,0.05,0));
                  grades.add(
          new SalaryGrade(2000,0.1,25));
                  grades.add(
          new SalaryGrade(5000,0.15,125));
                  grades.add(
          new SalaryGrade(20000,0.20,375));
                  grades.add(
          new HigherSalaryGrade(99999999,0.25,1375));
              }

              
              
          // OO化的查詢方法
              public double getSalaryAfterTax(double total){
                  SalaryGrade taxGrade
          =null;
                  
                  
          for(Iterator it=grades.iterator();it.hasNext();){
                      taxGrade
          =(SalaryGrade)it.next();
                      
                      
          if(total>taxGrade.getGrade()){
                          
          continue;
                      }

                      
          else{
                          
          break;
                      }

                  }

                  
                  
          return taxGrade.getSalaryAfterTax(total);
              }

          }

          Main:
          package com.sitinspring.oostyleadv;

          /**
           * Main函數所在的類
           * 
          @author sitinspring(junglesong@gmail.com)
           *
           
          */

          public class Main{
              
          public static void main(String[] args){    
                  SalaryCaculator caculator
          =new SalaryCaculator();
                  
                  
          for(double total=100;total<30000;total+=1000){
                      System.out.println(
          "稅前薪水="+total+" 稅后薪水="+caculator.getSalaryAfterTax(total));
                  }
                  
              }

          }

          代碼下載:
          http://www.aygfsteel.com/Files/sitinspring/TaxCaculator20071115120519.rar

          posted on 2008-02-22 10:32 和風細雨 閱讀(159) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 观塘区| 仁化县| 邳州市| 若尔盖县| 红原县| 洪江市| 通州市| 高要市| 南涧| 黑龙江省| 衡阳市| 石屏县| 龙陵县| 平安县| 革吉县| 那曲县| 当雄县| 田阳县| 天峻县| 贺兰县| 连州市| 古蔺县| 嵊泗县| 丰宁| 青铜峡市| 泾阳县| 铁岭市| 海口市| 如东县| 永顺县| 新绛县| 拉萨市| 连城县| 江川县| 武义县| 永修县| 郸城县| 澄城县| 囊谦县| 成安县| 襄垣县|