Является ли этот дизайн для проверки данных в классе хорошей идеей? - PullRequest
1 голос
/ 10 июля 2009

У меня есть этот класс, давайте назовем его Refund (потому что так он называется). Я хочу проверить некоторые сведения об этом Возврате и о клиенте, к которому он привязан, и я хочу сделать эти проверки переупорядочиваемыми, потому что первые, которые отключаются, будут сохранены как причина отклонения при Возврате, а также некоторые из вероятно, будет более ресурсоемким, чем другие, и с большей вероятностью будет отключен, поэтому я хотел бы иметь возможность легко изменить порядок их выполнения, чтобы при необходимости можно было снизить производительность.

Все методы проверки возьмут объект Refund и вернут логическое значение, обозначающее, прошла ли проверка или нет. Итак, я подумал, почему бы не создать очередь (или другую структуру данных) для хранения делегатов / лямбда-выражений / анонимных функций, каждая из которых представляет метод проверки? Затем, просто передав Refund в некоторый статический метод Validate (Refund refundToValidate) в некотором классе Validator. Этот метод будет проходить через массив делегатов, вызывая каждого из них по очереди и возвращая false, если один из них выдаст false.

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

РЕДАКТИРОВАТЬ: вот что у меня так далеко ...

public static class Validator
    {


        delegate REFUNDDENIALREASONS validationHandler(BatchRefund refundToValidate);

        public static List<REFUNDDENIALREASONS> ValidateRefund(BatchRefund refundToValidate)
        {
            List<Delegate> Validations = new List<Delegate>();
            List<REFUNDDENIALREASONS> DenialReasons = new List<REFUNDDENIALREASONS>();

            Validations = new List<Delegate>();

            validationHandler blockHandler = ValidateBlocks;
            Validations.Add(blockHandler);

            validationHandler accountHandler = ValidateCustomerAccountStatus;
            Validations.Add(accountHandler);

            foreach (validationHandler v in Validations)
            {
                DenialReasons.Add(v(refundToValidate));
            }

            return DenialReasons;
        }

        public static REFUNDDENIALREASONS ValidateCustomerAccountStatus(BatchRefund refundToHandle)
        {
            REFUNDDENIALREASONS denialReason;

            switch (refundToHandle.RefundCustomer.CustStatus)
            {

                case "C":
                    denialReason = REFUNDDENIALREASONS.None;
                    break;
                case "Y":
                    denialReason = REFUNDDENIALREASONS.AccounthasrecentChargebackNSF;
                    break;
                default:
                    denialReason = REFUNDDENIALREASONS.Fraud;
                    break;
            }

            return denialReason;

        }

        public static REFUNDDENIALREASONS ValidateBlocks(BatchRefund refundToHandle)
        {
            List<CustomerBlock> blocks = refundToHandle.RefundCustomer.Blocks;
            //add new codes to block here
            string[] illegalblockcodes = new string[] { "L1", "C1" };

            foreach (string code in illegalblockcodes)
                if (blocks.Exists(b => b.BkClassCode == code))
                {
                    return REFUNDDENIALREASONS.Fraud;
                }

            return REFUNDDENIALREASONS.None;

        }
    }

Ответы [ 2 ]

1 голос
/ 10 июля 2009

Вы в основном описываете твик шаблона проектирования Chain-of-ответственность . У этого есть свои преимущества и недостатки, но это хороший вариант, если вы хотите гибко добавлять в свою очередь другие операции в любой момент времени.

0 голосов
/ 10 июля 2009

Не обязательно плохая идея. Вы намерены отслеживать, какая проверка не удалась? Если вы используете статический метод, который запускает его через очередь, как вы собираетесь сказать?

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