我正在编写一个类来封装一些业务规则,每个规则都由一个布尔值表示。该类将用于处理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;
}
}
一个人的优点和缺点是什么?
答案 0 :(得分:3)
首先,你需要围绕属性逻辑包装get {},而经验法则(对我而言)应该是方法可以改变类的内容,或执行某种业务逻辑,而财产则公开有关该类的信息。
对于您的使用,我会建议一个属性,因为值已经存在,并且您正在创建已知的派生属性。
此外,您的代码可以重构为
return _amount < threshold;
答案 1 :(得分:2)
根据MSDN上的Properties vs. Methods指南(不可否认,对于较旧版本的Visual Studio),听起来方法可能比您的情况下的属性更合适(假设规则比阈值更复杂)。 / p>
在这个问题上更多地探讨了以下内容:
答案 2 :(得分:2)
我同意Antony Koch。当我需要执行一个改变类状态的复杂计算时,我使用方法。如果类的当前状态需要简单的计算或数据检索,其中数据已经存在于该状态并且不需要更改,则属性似乎更合适。
答案 3 :(得分:2)
这一切都归结为将语义传达给消费那种商业逻辑的人。
属性是特定对象的内在值。您的示例中的Rules
是业务逻辑引擎,因此它公开的任何属性都应该应用于该引擎的状态和行为,而不是应用于它处理的数据。因此,ProjectRequiresApproval()
是引擎应用于外部实体的操作。
另一方面,如果有Rules.GetProcess()
方法,则会返回Process
个对象,RequiresAproval
可以是该对象的属性。
答案 4 :(得分:1)
这是一个真实的例子吗?我问,因为我发现规则对象可能有一个数量和一个阈值是奇怪的。我提到这个是因为我认为这是答案的一部分。我认为你的规则是一个命名空间,一个项目是一个对象,在我看来,它是否需要批准才是Project类的一个属性。