2

NRules SimpleRule のコードは、次のルールを定義します。

public class PreferredCustomerDiscountRule : Rule
{
    public override void Define()
    {
        Customer customer = null;
        IEnumerable<Order> orders = null;

        When()
            .Match<Customer>(() => customer, c => c.IsPreferred)
            .Collect<Order>(() => orders,
                o => o.Customer == customer,
                o => o.IsOpen,
                o => !o.IsDiscounted);

        Then()
            .Do(ctx => ApplyDiscount(orders, 10.0))
            .Do(ctx => LogOrders(orders))
            .Do(ctx => orders.ToList().ForEach(ctx.Update));
    }
        ...
}

&& 演算子を使用する代わりに、条件が個別のパラメーターである理由を知りたいです。つまり、次のように同じ効果がありますか?

public class PreferredCustomerDiscountRule : Rule
{
    public override void Define()
    {
        Customer customer = null;
        IEnumerable<Order> orders = null;

        When()
            .Match<Customer>(() => customer, c => c.IsPreferred)
            .Collect<Order>(() => orders,
                o => o.Customer == customer && o.IsOpen && !o.IsDiscounted);

        Then()
            .Do(ctx => ApplyDiscount(orders, 10.0))
            .Do(ctx => LogOrders(orders))
            .Do(ctx => orders.ToList().ForEach(ctx.Update));
    }
        ...
}
4

2 に答える 2

1

2 つの定義は同じことを行う必要があります。Collectメソッドはの配列を想定していExpression<Func<T, bool>>ます。最初の条件は 3 つの個別の条件に分割され、2 番目の条件は 1 つの条件のみを使用します (And-combined)。

どちらを好むかは好みの問題だと思います。しかし、最初のものを使用すると、どの条件が関連しているかが明確になり、条件を簡単に削除または追加できます (// のコメントを使用)。

于 2015-06-01T11:33:35.187 に答える