使用属性或方法在C#中公开业务规则?

时间:2010-03-11 15:47:43

标签: c# properties methods

我正在编写一个类来封装一些业务规则,每个规则都由一个布尔值表示。该类将用于处理InfoPath表单,因此规则通过使用XPath操作在全局XML数据结构中查找值来获取当前程序状态。将这些规则暴露给调用者 - 属性或公共方法的最佳(最惯用)方法是什么?

使用属性调用

Rules rules = new Rules();
if ( rules.ProjectRequiresApproval ) {
    // get approval
} else {
    // skip approval
}

使用方法调用

Rules rules = new Rules();
if ( rules.ProjectRequiresApproval() ) {
    // get approval
} else {
    // skip approval
}

规则类将规则公开为属性

public class Rules() {
    private int _amount;
    private int threshold = 100;

    public Rules()  {
        _amount = someExpensiveXpathOperation;
    }

    // rule property
    public bool ProjectRequiresApproval {
        get { return _amount > threshold }
    }
}

规则类将规则公开为方法

public class Rules() {
    private int _amount;
    private int threshold = 100;

    public Rules()  {
        _amount = someExpensiveXpathOperation;
    }

    // rule method
    public bool ProjectRequiresApproval() {
        return _amount > threshold;
    }
}

一个人的优点和缺点是什么?

5 个答案:

答案 0 :(得分:3)

首先,你需要围绕属性逻辑包装get {},而经验法则(对我而言)应该是方法可以改变类的内容,或执行某种业务逻辑,而财产则公开有关该类的信息。

对于您的使用,我会建议一个属性,因为值已经存在,并且您正在创建已知的派生属性。

此外,您的代码可以重构为

return _amount < threshold;

答案 1 :(得分:2)

根据MSDN上的Properties vs. Methods指南(不可否认,对于较旧版本的Visual Studio),听起来方法可能比您的情况下的属性更合适(假设规则比阈值更复杂)。 / p>

在这个问题上更多地探讨了以下内容:

  • 来自Ken Browning的excellent answer关于属性与方法的一般性
  • 来自Bill Wagner(有效C#的作者)的blog post关于使用财产应该是什么条件
  • 链接到几个开源规则引擎(NxBREDrools.NET),以便您可以看到实施业务规则的替代方案。

答案 2 :(得分:2)

我同意Antony Koch。当我需要执行一个改变类状态的复杂计算时,我使用方法。如果类的当前状态需要简单的计算或数据检索,其中数据已经存在于该状态并且不需要更改,则属性似乎更合适。

答案 3 :(得分:2)

这一切都归结为将语义传达给消费那种商业逻辑的人。

属性是特定对象的内在值。您的示例中的Rules是业务逻辑引擎,因此它公开的任何属性都应该应用于该引擎的状态和行为,而不是应用于它处理的数据。因此,ProjectRequiresApproval()是引擎应用于外部实体的操作。

另一方面,如果有Rules.GetProcess()方法,则会返回Process个对象,RequiresAproval可以是该对象的属性。

答案 4 :(得分:1)

这是一个真实的例子吗?我问,因为我发现规则对象可能有一个数量和一个阈值是奇怪的。我提到这个是因为我认为这是答案的一部分。我认为你的规则是一个命名空间,一个项目是一个对象,在我看来,它是否需要批准才是Project类的一个属性。