Это для настольного приложения с WPF.
Точка 1 - Я создал (записал логику) различные типы правил, и эти правила подпадают под 5 типов категорий (AbsolutePositionalAccuracy)Атрибут Аттестация, Завершение данных, Логическое, Топологическая целостность).и там категории одинаковы для каждой связки.здесь связки - это группирование данных различного типа.может быть около 10 типов пачек.
Пункт 2 - У меня есть данные, которые должны быть проверены на соответствие указанным выше правилам.всякий раз, когда данные терпят неудачу из-за несоответствия ни одному из правил, они должны быть отмечены подробностями, например, какое правило не удалось, это правило подпадает под какую категорию, под какой пакет и по каким данным оно не выполнено и т. д.
Точка 3 - на стороне пользовательского интерфейса, я дам пользователю опции, чтобы выбрать, какое правило он хотел бы проверить.Пользователь может выбрать несколько правил для любой категории, под любым пакетом.
- Пакет 1
- Абсолютная точность позиционирования:
- Проверка атрибута
- Завершение данных
- Правило1
- Правило2
- Правило3
- Логическое
- Правило1
- Правило2
- Правило3
- Топологическая целостность
- Правило1
- Правило2
- Правило3
- Правило4
- Правило5
- Правило6
- Правило7
- Связка 2
- Абсолютная точность позиционирования:
- Правило1
- Правило2
- Правило3
- Проверка атрибута
- Завершение данных
- Правило1
- Правило2
- Правило3
- Правило4
- Логическое
- Топологическая целостность
- Правило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 для соответствующих категорий.):
- открытый абстрактный класс AbsolutePositionalAccuracyRule:IBaseRule
- общедоступный абстрактный класс AttributeValidationRule: IBaseRule
- общедоступный абстрактный класс DataCompletionRule: IBaseRule
- общедоступный абстрактный класс LogicalRule: IBaseRule
- общедоступный абстрактный класс 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;
}
}