2013-10-07 38 views
1

我在採訪中被要求實施業務規則是代理鏈是否合適

需求變更。他們總是這樣:

  1. 評估20%的費用低於$ 100,000的任何數額。
  2. 評估10萬美元至500,000美元之間任何金額的10%費用。
  3. 評估5%的費任何量高於$ 500,000

計算費用的任意量x。

例如:給定600,000美元的發票,費用應該是65,000美元。

給定50,000美元的發票費用應該是10,000美元。

給定200,000美元的發票,費用應該是30,000美元。

我用CofR,但面試官然後問,如果他們超過3個條件,像他們n我會創建n類來處理每個請求。

他們是一個更好的方法來解決這個問題,因爲寫了一個非常長的遞歸函數來檢查每個條件。

回答

2

當鏈的成員有明顯不同的規則時,CoR會有所幫助,但在這種情況下,所有規則基本相同(如果金額超過X,則收取一定的百分比)。而不是獨立的階級,只是有一個結構類似類,用於保存的最低金額和百分比,以及另外一個,查找相應的費用:

class FeeSchedule { 
    static class Entry implements Comparable<Entry> { 
     int threshold; 
     int percentage; 

     int compareTo(Entry other) { 
      // sort by percentage, descending 
     } 

    SortedSet<Entry> feeTable; 

    int calculateFee(int invoiceAmount) { 
     for(Entry e : feeTable) 
      if(invoiceAmount > e.threshold) 
       return (invoiceAmount * e.percentage); 

     // error condition; return 0? 
    } 
} 
+0

你在這裏得到了令人敬畏的邏輯,但是如何獲得每個條目的百分比。我似乎無法就此作出結論。 – Ayodeji

+0

@Ayodeji這是一個基本的草圖。吸氣劑,構造劑等 – chrylis

2

我猜測,面試官暗示像責任鏈模式這樣的事情對於像這樣的問題有點過分設計。還有一種觀點認爲,你的實現類實際上會有相同的責任,因爲他們都會根據給定的輸入計算一個數量,只是使用不同的參數。

我可能會用兩個簡單的類來做到這一點。人們可以根據輸入值計算百分比費率,並且可以使用此費率返回費用金額。

如果您需要添加第四個條件,您只需將其添加到包含費率計算的類中即可。對於這樣一個簡單的問題,我不明白爲什麼它需要比這更復雜。

編輯:

我正沿着相同的路線思想爲@chrylis在那裏會是通過處理率的有序列表來進行計算的一類。

class Rate { 
    int rangeSize; 
    double commission; 

    Rate(int rangeSize, double commission){ 
     this.rangeSize = rangeSize; 
     this.commission = commission; 
    } 

    int computeForAmount(int amount) { 
     if (amount <= 0) { 
      return 0; 
     } 
     return (int) (Math.min(amount, this.rangeSize) * this.commission); 
    } 
} 

class FeeCalculator { 

    List<Rate> rates = Arrays.asList(
      new Rate(100, 0.2), 
      new Rate(400, 0.1), 
      new Rate(500, 0.05)); 

    int calculateCommission(int startingAmount) { 
     int commission = 0; 
     int remainingAmount = startingAmount; 

     for (Rate rate : this.rates) { 
      commission += rate.computeForAmount(remainingAmount); 
      remainingAmount -= rate.rangeSize; 
     } 

     return commission; 
    } 

} 

我承認,我並不完全高興通過調用rate.rangeSize打破封裝,但它確實表明我試圖闡明設計。

+0

能否請你放下你的解釋在僞代碼什麼的,我似乎並不瞭解你提出的邏輯。謝謝。 – Ayodeji

+0

我明白了,這完全消除了我的遞歸,並且使得它比程序更加面向對象。 @chrylis點現在更清晰。哥們,謝啦。新包包。 – Ayodeji

0

我認爲在這種情況下,一個簡單的策略模式應該足夠了。喜歡的東西:

interface FeeAssessor { 
    public double assessFee(double invoice); 
} 

FeeAssessor feeAssessor = new FeeAssessor() { 
     // logic goes here 
    }; 

double calculateFee(double invoice) { 
    return feeAssessor.assessFee(invoice); 
} 

對於您提出了一個簡單的商業邏輯,我認爲這將是容易實現這一切一個assessFee()函數內。你可以實現不同的(簡單的)並根據需要換出「戰略」對象。如果費用評估算法取決於彼此獨立的獨立多個變化因素,那麼您可以進一步將它們分成多個策略方法。