3

私は現在、ロイヤリティの支払いを管理するシステムをモデル化しています。ロイヤルティは次のように単純です。

  • 収益の 15% を著者 A に支払う

または次のいずれかのように複雑です。

  • 作成者 B に、売上の 1000 個までは収益の 15%、その後は収益の 12% を支払う
  • また、販売数が 1000 までの場合、販売ごとに著者 B に 1.50 ドルを支払う

また:

  • 最初の 1,000 ドルの収益について著者 C に収益の 15% を支払い、その後、収益の 12% を支払う

つまり、支払いは、販売ごとの定額または収益のパーセンテージのいずれかです。支払いの条件は、販売数量または収益に基づく場合があります。私は、支払い範囲と支払い値の型を指定することによって、このすべての柔軟性を包含するクラス (舞台裏のデータベース テーブルに密接に対応する) を設計しようとしました。ただし、このクラスでやりすぎて、将来追加のシナリオに対応する必要が生じた場合に追い詰められるのではないかと心配しています。代替設計アプローチの提案を求めています。

public class PaymentRule
{
    // I'm not 100% comfortable with this, as this will
    // really be an Int32 value for quantity sold ranges
    public decimal RangeMinimum { get; set; }
    public decimal? RangeMaximum { get; set; }

    // This will always be a decimal value, but may represent
    // a dollar amount or percentage depending on the context
    public decimal PaymentValue { get; set; }

    // Specify a type for the range: QuantitySold or Revenue
    public string RangeType { get; set; }

    // Specify a type for the value: AmountPerEachSold or RevenuePercentage
    public decimal ValueType { get; set; }

    public decimal CalculateRoyaltyDue(int quantitySold, decimal revenue)
    {
        // ...
    }
}

任意の提案をいただければ幸いです。

2012 年 5 月 9 日更新:

これらのルールは、SQL Server データベースに永続化する必要があることに注意してください。

4

2 に答える 2

1

仕様パターンを確認してください。この複雑なルール仕様の缶は、まさにそれを支援するために設計されたものです。

コンピュータ プログラミングでは、仕様パターンは特定のソフトウェア設計パターンであり、ブール論理を使用してビジネス ルールを連鎖させることで、ビジネス ルールを再結合できます。

仕様パターンは、他のビジネス ルールと組み合わせ可能なビジネス ルールの概要を示します。このパターンでは、ビジネス ロジックのユニットは、抽象集約 Composite Specification クラスからその機能を継承します。Composite Specification クラスには、ブール値を返す IsSatisfiedBy という関数が 1 つあります。インスタンス化後、仕様は他の仕様と「連鎖」され、新しい仕様は保守が容易でありながら高度にカスタマイズ可能なビジネス ロジックになります。さらに、インスタンス化の際、ビジネス ロジックは、メソッドの呼び出しまたは制御の反転によって、その状態が変更され、永続化リポジトリなどの他のクラスのデリゲートになる場合があります。

于 2012-05-09T20:10:13.990 に答える
-1

拡張メソッド、linq 式、メソッド chining、名前付き引数を組み合わせた流暢なインターフェイスを構築しようとします。おそらく次のようなものです。

var revenue = 12000;
var ruleA = Rules.PayAuthor(15).PercentOf(revenue)
var ruleB = Rules.PayAuthor(15).PercentOf(revenue).UpTo(soldUnits:1000).Then(12).PercentOf(revenue)

var royalltyA = Royallty.For(ruleA, whenSoldUnitsIs: 1500);
var royalltyB = Royallty.For(ruleB, whenSoldUnitsIs: 1500);
于 2012-05-09T21:14:36.667 に答える