3

我目前正在建模一个负责管理版税支付的系统。版税可能很简单:

  • 支付作者 A 收入的 15%

或与以下任何一个一样复杂:

  • 向作者 B 支付 15% 的收入,最多售出 1000 件,然后支付收入的 12%
  • 每售出 1000 件,还需向作者 B 支付 1.50 美元

或者:

  • 向作者 C 支付前 1,000 美元收入的 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 类有一个名为 IsSatisfiedBy 的函数,它返回一个布尔值。实例化后,规范与其他规范“链接”在一起,使新规范易于维护,但高度可定制的业务逻辑。此外,在实例化时,业务逻辑可以通过方法调用或控制反转来改变其状态,以便成为其他类(例如持久性存储库)的委托。

于 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 回答