我试图在程序中实现'需求'类型系统。在我看来,这看起来很简单,但实际上使其足够抽象以提供有用,证明比预期更困难。设计一个需求满意结构
这里就是我试图做...
enum Condition {
Not, Exists, Exceeds
}
abstract class Requirement {
// base class
Condition Condition { get; set; }
}
class ScoreRequirement : Requirement {
// a specific 'score' is required
}
class TraitRequirement : Requirement {
// a specific 'trait' is required
}
class SatisfyingObject {
// this is the class that has to satisfy the requirements
IDictionary<Trait, int> Traits { get; set; }
}
如果我知道,必须在代码时间满足确切的东西,这是很简单的。但目标是让人们稍后添加要求。还有其他类型也会从Requirement
中派生出来。
因此,一个需求可能像这样工作...
var obj = new Item {
Requirements = new List<Requirement> {
new ScoreRequirement { Trait = "One", Score = 2, Condition = Condition.Exceeds }
}
}
所以这个概念看起来很简单。在一个对象,你会打电话..
var satisfying = // get the satisfying object;
if(satisfying.Satisfies(obj.Requirements))
return true;
我遇到的问题是真的如何编写代码的Satisfies
方法 - 具体我不知道如何将它涉及到Condition
参数。我希望人们能够设置一些相当通用的“要求”,但背后的逻辑对我来说非常混乱。由于这些需求在设计时并不知晓,所以我不能真正编写它们中的任何一个。
有什么建议吗?
谢谢!我会看看你的例子,并尝试理解它。我无法使用给定示例的原因是因为规则必须存储在数据库中,因此它们必须是可序列化的 - 并且它们在运行时也不知道。它们被最终用户添加到系统中。 – Ciel 2011-04-05 16:22:49
@Ciel,那么您应该查看EntLib验证块,因为您可以将验证规则存储在代码以外的区域中。它有一种方法可以通过开箱即用的Config文件来实现,但可以通过一些工作扩展到使用数据库。任何更高级的,你需要看看使用完整的业务规则引擎。大多数人的学习曲线也非常陡峭。 – Josh 2011-04-05 16:27:50
此外,您的代码只有一个更改编译。带有名称的'AddRule'的用法不能马上使用。相当不错的代码'从内存'! – Ciel 2011-04-05 16:31:05