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

Val*_*Val 10 c# methods properties

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

使用属性调用

Rules rules = new Rules();
if ( rules.ProjectRequiresApproval ) {
    // get approval
} else {
    // skip approval
}
Run Code Online (Sandbox Code Playgroud)

使用方法调用

Rules rules = new Rules();
if ( rules.ProjectRequiresApproval() ) {
    // get approval
} else {
    // skip approval
}
Run Code Online (Sandbox Code Playgroud)

规则类将规则公开为属性

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

    public Rules()  {
        _amount = someExpensiveXpathOperation;
    }

    // rule property
    public bool ProjectRequiresApproval {
        get { return _amount > threshold }
    }
}
Run Code Online (Sandbox Code Playgroud)

规则类将规则暴露为方法

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

    public Rules()  {
        _amount = someExpensiveXpathOperation;
    }

    // rule method
    public bool ProjectRequiresApproval() {
        return _amount > threshold;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*nov 3

这一切都归结为向使用该业务逻辑的人传达语义。

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

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