Рефакторинг - какой шаблон использовать в этом примере? - PullRequest
4 голосов
/ 12 августа 2010

У меня есть функция, которая обрабатывает строки из файла Excel. В этой функции у меня есть цикл for. Теперь, когда строка извлечена, мы проверяем различные условия. Если какое-либо условие ложно, мы продолжаем со следующей row.Can этот код можно сделать более структурированным с помощью шаблона?

 foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
                {

                    Product prod = GetProduct(dr);
                    if (prod == null)
                    {
                        IndicateNotInserted(dr, "InvalidProduct");
                        continue; 
                    }



                    if (IsProductExpired())
                    {
                        IndicateNotInserted(dr, "Expired");
                        continue; 
                    }
                    ProcessRow(dr);

Ответы [ 4 ]

2 голосов
/ 12 августа 2010

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

вы передадите ваш Prod первому классу, который проверит достоверность, если он будет недействительным, он сообщит и вернет false. если он был действительным, он возвращал бы проверку достоверности преемника текущего экземпляра (если он был).

тогда ваш код может просто получить Prod и передать его в корневую проверку правильности и продолжить, если он сообщил о ложном.

Это также позволит вам легко добавлять новые валидаторы в будущем, потенциально имея возможность делать это без перекомпиляции, в зависимости от того, как вы реализовали построение цепочки валидаторов.

как-то так: (псевдокод, не проверен / не скомпилирован)

public interface IValidator
{
bool IsValid(Product product);
IValidator Successor{get;set;};
}

public class AbstractValidator : IValidator
{    
    IValidator m_successor=null;
    public abstract bool IsValid(Product product);

    IValidator Successor
    {
    get 
      {
      if(m_sucessor==null)
          return new AlwaysValidSuccessor();
      else
          return m_successor;
      }
    set
       {
       m_successor=value;
       }
    }
}

public class NullValidator : AbstractValidator
{
 public bool IsValid(Product product)
 {
    if (product!=null)
        {
        return Successor.IsValid(product);
        }
    return false;
    }
}

public class ExpiredValidator : AbstractValidator
{
 public bool IsValid(Product product)
 {
    if (product.Expired==false) //whatever you need to do here
        {
        return Successor.IsValid(product);
        }
    return false;
    }
}

тогда вы используете его:

IValidator validatorRoot = new NullValidator();
validatorRoot.Successor = new ExpiredValidator();
// construct the chain with as many as you need
//then use it
if (validatorRoot.IsValid(Prod)==false)
{
     continue;
}
1 голос
/ 12 августа 2010

Лучший способ исправить это - определить ваши запросы так, чтобы они не возвращали недействительные и устаревшие продукты.

0 голосов
/ 12 августа 2010

В сочетании с Сэмом Холдером, в зависимости от того, насколько универсальной вам нужна эта система проверки, вы можете обернуть любую из обязанностей декоратором, чтобы можно было обернуть проверку проверки общим поведением, которое объединяет более одной проверки.

0 голосов
/ 12 августа 2010

Не могли бы вы вместо этого использовать корпус переключателя ?

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