我有我想要能够处理的“规则”的概念。因此,我创建了以下接口:闭包vs课?
public interface IRule<T>
{
Boolean IsSatisfiedBy(T value);
String GetViolationMessage(T value);
}
我曾计划创造了一系列的“规则”的类来表示当前系统所支持,如各种规则:
public class MatchesPatternRule : IRule<String>
{
private readonly Regex _regex;
private readonly String _pattern;
public MatchesPatternRule(String pattern)
{
Verify.IsFalse(String.IsNullOrWhiteSpace(pattern));
_regex = new Regex(pattern);
_pattern = pattern;
}
public Boolean IsSatisfiedBy(String value)
{
return _regex.IsMatch(value);
}
public String GetViolationMessage(String value)
{
return String.Format(RuleMessage.MatchesPatternViolation, _pattern, value);
}
}
然后
public static ValidationContext<String> MatchesPattern(this ValidationContext<String> context, String pattern)
{
context.AddRule(new MatchesPatternRule(pattern));
return context;
}
不过,我现在有20多个规则的计划,以及MatchesPatternRule类可以被很容易地更换:规则将通过各种推广方法,如消耗写作扩展方法为:
public static ValidationContext<String> MatchesPattern(this ValidationContext<String> context, String pattern)
where T : IComparable
{
Verify.IsFalse(String.IsNullOrWhiteSpace(pattern));
Regex regex = new Regex(pattern);
context.AddRule(value => regex.IsMatch(value), value => String.Format(RuleMessage.MatchesPatternViolation, _pattern, value));
return context;
}
好奇哪种方法更好,为什么?两者都很容易被抵制,并最终达到最终结果。任何有识之士将不胜感激!
UPDATE
基于从汤姆的意见,我想我已经选择去同一个中间路线的做法。我将创建一个静态类来保存每个“规则”的扩展方法。这将确保任何给定的规则很容易找到,并将保持我的代码组织,但也减少总体代码量。
public static class MatchesPatternRule
{
public static ValidationContext<String> MatchesPattern(this ValidationContext<String> context, String pattern)
{
return MatchesPattern<T>(context, pattern, pattern, RegexOptions.None);
}
public static ValidationContext<String> MatchesPattern(this ValidationContext<String> context, String pattern, String friendlyPattern)
{
return MatchesPattern<T>(context, pattern, friendlyPattern, RegexOptions.None);
}
public static ValidationContext<String> MatchesPattern(this ValidationContext<String> context, String pattern, RegexOptions options)
{
return MatchesPattern<T>(context, pattern, pattern, options);
}
public static ValidationContext<String> MatchesPattern(this ValidationContext<String> context, String pattern, String friendlyPattern, RegexOptions options)
{
Verify.IsFalse(String.IsNullOrWhiteSpace(pattern));
Regex regex = new Regex(pattern);
context.AddRule(value => regex.IsMatch(value), value => String.Format(RuleMessage.MatchesPatternViolation, _pattern, value));
return context;
}
}