2011-07-21 21 views
3

我正試圖找到一種設計模式或最佳實踐,或針對在應用程序中保留業務邏輯版本的問題的其他解決方案。具體而言,我期望找到一種方法來確定哪種邏輯被用來發布保單。用於反向訪問邏輯更改的模式?

我現在有代碼看起來像這樣:

public double FixedDeductibleSurchageAmount() 
{ 
    double percent = FixedDeductibleSurchargePercent(); 
    double base_premium = CollisionPremium() + TheftPremium(); 
    return (base_premium * percent); 
} 

我需要做出改變的業務邏輯,這樣這個功能看起來更像是:

public double FixedDeductibleSurchageAmount() 
{ 
    double percent = FixedDeductibleSurchargePercent(); 
    double base_premium = CollisionPremium() + TheftPremium() + MedicalPremium(); 
    return (base_premium * percent); 
} 

當我碰上麻煩的是現有的政策應該按照以前的邏輯進行評估。有這樣的設計模式嗎?如果不是,有沒有什麼好的方法來實現它?

回答

2

策略模式聽起來最適用。可能你需要一個工廠方法或者一些這樣的方法來接收一個日期來返回適當的策略。

0

您將不得不使用某種形式的附加數據來精確跟蹤哪些算法用於獲取數據;您可能需要更改持久性表示以維護用於派生結果的算法的版本信息。

0

順便說一句,你可能會考慮把MedicalPremium或TheftPremium這樣的東西變成Get-only屬性,而不是無參數函數。他們非常適合這種範式。

有幾種方法可以解決這個問題。一些示例:

1)切換到新代碼並向用戶數據添加標誌,以便MedicalPremium自動爲舊用戶返回0。如果您將數據存儲在XML中,這非常簡單;舊數據不會有標誌,並且不會影響數據的反序列化,因爲XML很靈活。

2)使包含您的函數MedicalPremium的類成爲基類,並使MedicalPremium變爲虛擬。在派生類中重寫它,這是您的新版本。較新的用戶是派生類。舊用戶被創建爲基類。對於舊用戶,它總是返回0.屬性也可以像功能一樣是虛擬的。

+0

實際上,'MedicalPremium()'存在於所有用戶中,我只是簡單地將它加入到這個特定的附加費中,所以對於較老的用戶它不能返回0。他們被稱爲方法,因爲我正處於重新設計的白板階段,所以我只是把它們扔在那裏作爲例子。 –

+0

因此,爲新用戶創建一個返回MedicalPremium的功能MedicalPremiumNew,並且爲舊用戶返回0,並且我所說的其餘部分仍然適用;或者只是使FixedDeductibleSurchageAmount虛擬。 –

0

是的,有:the Decorator Pattern。您可以使用它來擴展具有其他包裝類的類的行爲。在下面的例子中,我將它與Template Method Pattern結合起來,以實現我相信你正在尋找的東西。

public class BaseSurchargePolicy { 
    protected abstract double BasePremium { get; } 
    protected abstract double FixedDeductibleSurchargePercent { get; } 
    public double FixedDeductibleSurchageAmount{ 
     get 
     { 
     return (BasePremium * FixedDeductibleSurchargePercent); 
     } 
    } 

    protected ICollection<string> _ProcessorsUsed; 
    public IEnumerable<string> ProcessorsUsed 
    { 
     get { return ProcessorsUsed; } 
    } 
} 

public class OldSurchargePolicy : BaseSurchargePolicy 
{ 

    protected double BasePremium 
    { 
     _ProcessorsUsed.Add(GetType().Name); 
     return CollisionPremium + TheftPremium; 
    } 
    protected double FixedDeductibleSurchargePercent { get; set; } 

    public double CollisionPremium { get; set; } 
    public double TheftPremium { get; set; } 
} 

public class MedicalSurchargeDecorator: BaseSurchargePolicy 
{ 
    private BaseSurchargePolicy _wrapped; 
    private double _medicalPremium; 
    public MedicalSurchargeDecorator(BaseSurchargePolicy wrapped, double medicalPremium) 
    { 
     _wrapped = wrapped; 
     _medicalPremium = medicalPremium; 
    } 

    protected double BasePremium 
    { 
     get 
     { 
     _ProcessorsUsed.Add(GetType().Name); 
     return _wrapped.BasePremium + _medicalPremium; 
     } 
    } 
    protected double FixedDeductibleSurchargePercent { 
     get { return _wrapped.FixedDeductibleSurchargePercent } 
    } 

} 
+0

我知道如何使用裝飾器,但我不明白他們在這裏如何應用。 –

+0

我添加了一些代碼,顯示了我的想法。 –

0

如果你有機會看看企業架構的Martin Fowler的模式,他談到個別實例方法,這是不完全一樣的,你有什麼,但非常相似。無論如何這是一本很棒的書。同時,我認爲你可能不得不開始考慮你的函數也是數據,並在你的數據庫中存儲哪個函數被使用。您不需要(但可能需要)存儲函數文本,但您確實需要足夠的信息來確定在運行時調用哪種方法。你問到了模式,顯然你有一個戰略模式在這裏,你可以參考,但我不知道它是否會特別有用。