代码之家  ›  专栏  ›  技术社区  ›  Val

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

  •  10
  • Val  · 技术社区  · 16 年前

    使用属性调用

    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 回复  |  直到 16 年前
        1
  •  2
  •   Franci Penov    16 年前

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

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

    Rules.GetProcess() 方法,将返回 Process 对象, RequiresAproval

        2
  •  3
  •   Antony Koch    16 年前

    首先,您需要围绕属性逻辑包装get{},经验法则(无论如何,对我来说)应该是一个方法可以更改类的内容,或者执行某种业务逻辑,而属性则公开关于类的信息。

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

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

    return _amount < threshold;
    
        3
  •  2
  •   Aaron Hawkins    16 年前

        4
  •  2
  •   Community Mohan Dere    9 年前

    根据 Properties vs. Methods MSDN的指导原则(对于visualstudio的旧版本来说是无可否认的),在您的案例中,方法可能比属性更合适(假设规则比阈值更复杂)。

    在这个问题上多做一点探索,就会发现以下几点:

    • 一 excellent answer
    • blog post 从比尔·瓦格纳(有效C#的作者)关于什么条件应该是真的才能使用一个属性
    • 链接到几个开源规则引擎( NxBRE 和 Drools.NET )因此,您可以看到实现业务规则的替代方案。
        5
  •  1
  •   Bernhard Hofmann    16 年前

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