コードでこのようなルールを表すのは簡単です。まず、あなたはそれをあまりにも複雑にしています。 「そして」と「すべて」は単に「すべて」であり、「1つ以上」と「または」はどちらも「すべて」です。だから、ほんの数述語が必要になります。
abstract class Requirement
{
abstract public bool Satisfied(User user);
}
sealed class Qual1 : Requirement { ... }
sealed class Qual2 : Requirement { ... }
...
sealed class All : Requirement
{
private IEnumerable<Requirement> r;
public All(params Requirement[] r) { this.r = r; }
public All(IEnumerable<Requirement> r) { this.r = r; }
public override bool Satisfied(User user) {
return r.All(x => x.Satisfied(user));
}
}
sealed class Any : Requirement
{
....
だから今はちょうど言っている:
var q1 = new Qual1();
... etc ...
var rule = All(
Any(
All(q1, q2, q3),
All(
Any(q4, q5),
All(q11, q12, q13))),
All(
Any(q6, q7, q8),
Any(q9, q10)));
をそして今、あなたが言うことができます。
if (rule(user)) ...
簡単peasyを。
これはかなり明らかです。彼らはあなたが指定した資格を持っているかどうかをチェックしたいだけです。あなたは技術を何も指定していないので、私はそれを打ち砕いた。私たちはWebAPIを話していますか? –