インタビュアーは、このような問題に対して一連の責任パターンのようなものが少し過剰に設計されていることをほのめかしていたと思います. また、実装するクラスが実際には同じ責任を負うという議論もあります。それらはすべて、与えられた入力に基づいて、異なるパラメーターを使用して金額を計算するという点です。
私はおそらく2つの単純なクラスでこれを行うでしょう。入力値に基づいてパーセンテージ手数料率を計算し、この率を使用して手数料額を返します。
4 つ目の条件を追加する必要がある場合は、レート計算を含むクラスに追加するだけです。このような単純な問題に対して、これよりも複雑にする必要がある理由がわかりません。
編集:
私は@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
が、それは私が明確にしようとしていた設計を示しています。