в C # .NET, как улучшить дизайн классов и использовать шаблон проектирования в моей ситуации - PullRequest
0 голосов
/ 23 марта 2019

Это для настольного приложения с WPF.

Точка 1 - Я создал (записал логику) различные типы правил, и эти правила подпадают под 5 типов категорий (AbsolutePositionalAccuracy)Атрибут Аттестация, Завершение данных, Логическое, Топологическая целостность).и там категории одинаковы для каждой связки.здесь связки - это группирование данных различного типа.может быть около 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.

После того, как пользователь выбрал, я передам этот выбор классу, в котором будет выполнено действительное правило, и будет возвращен результатк интерфейсу пользователя.

** Вопрос -1 ** Я хочу знать, для какой ситуации, какой тип фреймворка мне следует использовать, например, шаблон Factory (для создания правил на основе их комплектов и категорий и выбора правил),или есть ли другие, более эффективные способы, чтобы, если в будущем мне придется добавить больше новых правил, по любой из категорий, это будет гибким, и я смогу сделать это с изменениями в минимальных местах в моей кодовой базе.

** Вопрос -1 ** Как можно избежать множественных условий if или оператора Switch case при принятии решения о том, какое правило выполнять, на основе выбора пользователя (BundleType, категория правила и фактическое правило).потому что у меня может быть всего более 100 правил.Есть ли другая альтернатива, например, использование отражения.или другой способ.

Для Точки 1 - я создал интерфейс IBaseRule, который имеет метод execute (), и некоторые другие свойства, описывающие ruleType, RuleSubType и т. д., а также создал абстрактный класс (получен из интерфейса IBaseRule) для каждой категории RuleType (здесь реализовано только свойство RuleType, остальные упоминаются как абстрактные для реализации конкретными RuleClasses для соответствующих категорий.):

  1. открытый абстрактный класс AbsolutePositionalAccuracyRule:IBaseRule
  2. общедоступный абстрактный класс AttributeValidationRule: IBaseRule
  3. общедоступный абстрактный класс DataCompletionRule: IBaseRule
  4. общедоступный абстрактный класс LogicalRule: IBaseRule
  5. общедоступный абстрактный класс Topologicalleute: IBaseRulele::1160 *

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

...