Совет по шаблону проектирования: проверка правил - PullRequest
2 голосов
/ 04 апреля 2011

Я продаю товары через мой сайт. Недавно нам дали список правил, которые необходимо проверять по каждому заказу, чтобы убедиться, что он не является мошенническим. Поэтому этот список правил / показателей мошенничества будет меняться и расти, поэтому я хочу убедиться, что он легко обслуживается и действительно надежен.

Я думаю, у меня есть резюме class rule, которое реализует каждое из правил.

abstract class Rule
{
    public string Message;
    public bool Success;
    public void CheckOrder(OrderItem currentOrder);
}

class FakeCreditCardNumberRule : Rule
{
   public string Message = "Fake CC Number Rule";
   public void CheckOrder(OrderItem currentOrder)
   {
       currentOrder.CreditCardNumber = "1234-5678-9012-3456";
       Success = false;
   }

}

class ReallyLargeOrderRule : Rule
{
   public string Message = "Really Large Order Rule";
   public void CheckOrder(OrderItem currentOrder)
   {
       currentOrder.ItemsOrder.Count > 100;
       Success = false;
   }

}

Тогда я думаю о наличии класса, который принимает Order object в своем конструкторе и проверяет список правил. Что-то вроде:

class FraudChecker
{
    List<Rule> rules;

    public FraudChecker(OrderItem currentOrder)
    {
        foreach(var rule in rules)
        {
            rule.CheckOrder(currentOrder);
        }
    }
}

Так что я пытался придумать лучшее место / лучший способ заполнить FraudChecker .Rules список и начал думать, что может быть какой-то хороший шаблон дизайна, который делает что-то вроде того, что я делаю.

Кто-нибудь видел шаблон дизайна, который я должен использовать здесь? Или кто-нибудь может подумать о хорошем месте для заполнения этого списка?

-Evan

Ответы [ 3 ]

1 голос
/ 04 апреля 2011

Шаблон спецификации

Я имел дело с очень похожей проблемой.

Я нашел Шаблон спецификации особенно полезным.

Для меня главным преимуществом шаблона является то, что он включает в себя цепочку.

Приведенная выше ссылка обеспечивает базовый обзор, а также ссылки в этой статье, которые также полезны.После, если вы продолжите поиск, вы найдете более подробные примеры.

0 голосов
/ 04 апреля 2011

Я бы, наверное, пошел с моей собственной реализацией enum.Я бы создал такой класс:

public sealed class Rules
{
    public static readonly Rule FakeCreditCardNumberRule = new FakeCreditCardNumberRule ();
    public static readonly Rule ReallyLargeOrderRule  = new ReallyLargeOrderRule  ();   
    //here I would write more

    private static readonly List<Rule> _all = List<Rule> { FakeCreditCardNumberRule, ReallyLargeOrderRule };
    //every time you add new rule to the class you have to add it to the _all list also

    public static IEnumerable<Rule> All
    {
        get
        {
            return _all;
        }
    }

    public static FraudChecker(OrderItem currentOrder)
    {
        foreach(var rule in All)
        {
            rule.CheckOrder(currentOrder);
        }
    }
}

, а затем вы можете использовать его следующим образом:

Rules.FraudChecker(currentOrder);

или

Rules.FakeCreditCardNumberRule.CheckOrder(currentOrder);

Вы можете добавлять каждый новыйПравило для класса Правила.В нем также можно создавать новые методы, которые будут обрабатывать только часть правил и т. Д.

0 голосов
/ 04 апреля 2011

Вы уже использовали шаблон Startegy ... Я думаю, что заводской шаблон может решить вашу проблему.

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...