在C#.NET中如何更好地设计类并针对我的情况使用设计模式

时间:2019-03-23 07:34:11

标签: c# api-design

这是使用WPF的桌面应用程序。

要点1-,我创建了不同类型的规则(为它们编写逻辑),这些规则属于5类类别(绝对位置准确度,属性验证,数据完成,逻辑,拓扑完整性)。每个分类的类别都相同。在这里,捆绑包是不同类型数据的分组。大约有10种类型的捆绑包。

第2点-我有一些数据必须根据上述规则进行验证。每当数据因不符合任何规则而失败时,应使用详细信息进行标记,例如哪个规则失败,该规则属于哪个类别,哪个捆绑包以及失败的数据等。

在用户界面侧

第3点-,我将为用户提供选项,供他选择要检查的规则。用户可以在任何类别,任何捆绑包下选择多个规则。

  1. 套装1
    • 绝对位置精度:
      • 规则1
    • 属性验证
      • 规则1
      • 规则2
    • 数据完成
      • 规则1
      • 规则2
      • 规则3
    • 逻辑
      • 规则1
      • 规则2
      • 规则3
    • 拓扑完整性
      • 规则1
      • 规则2
      • 规则3
      • 规则4
      • 规则5
      • 规则6
      • 规则7
  2. 套装2
    • 绝对位置精度:
      • 规则1
      • 规则2
      • 规则3
    • 属性验证
      • 规则1
      • 规则2
    • 数据完成
      • 规则1
      • 规则2
      • 规则3
      • 规则4
    • 逻辑
      • 规则1
      • 规则3
    • 拓扑完整性
      • 规则1
      • 规则2
      • 规则3
      • 规则4
      • 规则5
      • 规则6
      • 规则7
      • 规则8
      • 规则9
      • 规则10

规则数量因类别而异。有些类别可能有5条规则,有些可能有20条规则,有些可能有40条规则。

选择用户后,我会将选择的内容传递给将执行实际规则的类,并将结果返回给UI。

**问题-1 **我想知道这种情况下我应该使用哪种框架,例如工厂模式(基于规则的包和类别以及规则选择来创建规则)。还是有其他更好的方法,以便将来在任何类别下,如果我不得不添加更多新规则,那么它的灵活性就可以,并且我可以在代码库的最小位置进行更改。

**问题-1 **基于用户的选择(BundleType,规则类别和实际规则)来决定执行哪个规则时,如何避免使用if条件或Switch case语句。因为我可能总共有100多个规则。还有其他选择吗?使用反射。或其他更好的方法。

对于点1-,我创建了一个接口IBaseRule,它具有execute()方法以及一些其他属性,这些属性描述了RuleType,RuleSubType等。 并且还为RuleType的每个类别创建了一个抽象类(从IBaseRule接口派生)(此处仅实现RuleType属性,其余部分作为摘要提及,由相应类别的具体RuleClasses实现。):

  1. 公共抽象类AbsolutePositionalAccuracyRule:IBaseRule
  2. 公共抽象类AttributeValidationRule:IBaseRule
  3. 公共抽象类DataCompletionRule:IBaseRule
  4. 公共抽象类LogicalRule:IBaseRule
  5. 公共抽象类TopologicalIntegrityRule:IBaseRule

// 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;
        }
    }

0 个答案:

没有答案