这是使用WPF的桌面应用程序。
要点1-,我创建了不同类型的规则(为它们编写逻辑),这些规则属于5类类别(绝对位置准确度,属性验证,数据完成,逻辑,拓扑完整性)。每个分类的类别都相同。在这里,捆绑包是不同类型数据的分组。大约有10种类型的捆绑包。
第2点-我有一些数据必须根据上述规则进行验证。每当数据因不符合任何规则而失败时,应使用详细信息进行标记,例如哪个规则失败,该规则属于哪个类别,哪个捆绑包以及失败的数据等。
在用户界面侧第3点-,我将为用户提供选项,供他选择要检查的规则。用户可以在任何类别,任何捆绑包下选择多个规则。
规则数量因类别而异。有些类别可能有5条规则,有些可能有20条规则,有些可能有40条规则。
选择用户后,我会将选择的内容传递给将执行实际规则的类,并将结果返回给UI。
**问题-1 **我想知道这种情况下我应该使用哪种框架,例如工厂模式(基于规则的包和类别以及规则选择来创建规则)。还是有其他更好的方法,以便将来在任何类别下,如果我不得不添加更多新规则,那么它的灵活性就可以,并且我可以在代码库的最小位置进行更改。>
**问题-1 **基于用户的选择(BundleType,规则类别和实际规则)来决定执行哪个规则时,如何避免使用if条件或Switch case语句。因为我可能总共有100多个规则。还有其他选择吗?使用反射。或其他更好的方法。
对于点1-,我创建了一个接口IBaseRule,它具有execute()方法以及一些其他属性,这些属性描述了RuleType,RuleSubType等。 并且还为RuleType的每个类别创建了一个抽象类(从IBaseRule接口派生)(此处仅实现RuleType属性,其余部分作为摘要提及,由相应类别的具体RuleClasses实现。):
// Interface
public interface IBaseRule
{
string RuleType { get; }
string RuleSubType { get; }
string ShortDescription { get; }
string LongDescription { get; }
IRuleErrorCollection Execute();
}
// Abstract Class
public abstract class AbsolutePositionalAccuracyRule : IBaseRule
{
public string RuleType
{
get { return "qcRuleTypeAbsolutePositionalAccuracy"; }
}
public abstract string RuleSubType
{
get;
}
public string ShortDescription
{
get { return "Check for the positional accuracy"; }
}
public string LongDescription
{
get { return "Check for the positional accuracy"; }
}
public abstract IRuleErrorCollection Execute();
}
// Concrete Class
public class CheckProjectionRule : AbsolutePositionalAccuracyRule//, IBaseRule
{
public static string Alias { get { return "Check Projection"; } }
private string _bundleName;
private IFeatureClass _pFeatClass;
private int _targetSrId;
public CheckProjectionRule(string bundleName, IFeatureClass featureClass, int targetSrId)
{
_bundleName = bundleName;
_pFeatClass = featureClass;
_targetSrId = targetSrId;
}
override public string RuleSubType
{
get { return "Check Projection Rule"; }
}
override public IRuleErrorCollection Execute()
{
RuleErrorCollection errorRuleColl = new RuleErrorCollection();
errorRuleColl.Add("Error Details");
return errorRuleColl;
}
}