2011-07-21 13 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

したがって、MedicalPremiumNewは、新規ユーザーに対してのみMedicalPremiumを返し、古いユーザーには0を返します。残りの部分はまだ適用されます。代わりにFixedDeductibleSurchageAmountを仮想にするだけです。 –

0

はいあります:the Decorator 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氏のパターンを見てチャンスを持っている場合。いずれにしても素晴らしい本です。

一方、私はあなたの機能をデータであるとみなし、使用された機能をデータベースに保存しなければならないかもしれないと思います。関数テキストを格納する必要はありませんが、実行時にどのメソッドを呼び出すかを決定するのに十分な情報が必要です。あなたはパターンについて尋ねましたが、明らかにここでは戦略パターンがありますが、これは参考にすることができますが、特に役立つかどうかはわかりません。

関連する問題