2010-06-09 71 views
0

這3種方法中的哪一種可以選擇,爲什麼?哪個設計選擇? - 優缺點

// This is the one I would choose 

class Car { 

} 

class FeeCalculator { 

    public double calculateFee(Car car) { 
     return 0; 
    } 
} 

//在這種情況下,當我們使用ORM框架的問題可能是,我們嘗試調用保存與參數租車

class Car { 

    private FeeCalculator calculator; 

    public double calculateFee() { 
     return calculator.calculateFee(this); 
    } 
} 

class FeeCalculator { 

    public double calculateFee(Car car) { 
     return 0; 
    } 
} 

//在這種情況下,問題上述解決了,但我不喜歡這種設計

class Car { 

    public double calculateFee(FeeCalculator calculator) { 
     return calculator.calculateFee(this); 
    } 
} 

class FeeCalculator { 

    public double calculateFee(Car car) { 
     return 0; 
    } 
} 
+2

爲什麼您首先需要'Car.caclucateFee'?看起來'FeeCalculator'已經可以處理這個任務了 – 2010-06-09 17:54:40

回答

0

我會在第二個主題上使用變體。我會在車上注入一個FeeCalculator(舊的Skool或者通過DI框架--Spring/Guice等),然後讓汽車通過委託來計算費用。然而,我會讓FeeCalculator API不知道Car(否則你有一個循環依賴,你必須從Car暴露你可能不需要的東西)。相反,我會使用FeeCalculator的API來獲取計算的基本輸入數據 - 僱用天數,日費率,客戶折扣計劃等。

3

我爲第一個投票。這樣的計算器不是汽車的一部分,汽車通常沒有計算費用的能力。

第二個設計模型類似車有-A-計算器,第三個選項是接近車是-A-計算器(即使它代表了計算到其他類)。


此外,ORM框架不應該影響模型的體系結構。該模型應該反映「真實世界」,有足夠的專家在任何ORM框架中實現該模型。

0

汽車與計算費用有什麼關係?沒有什麼,很可能。在這方面,我喜歡選項1.