2011-12-14 2 views
0

У меня есть код для проверки:Как я могу упростить код проверки проверки?

public IDictionary<string, string> ValidateForDeletion(Account ac) 
     { 
      var account = _accountRepository.GetPkRk(ac.PartitionKey, ac.RowKey); 
      if (account == null) 
      { 
       _errors.Add("", "Account does not exist"); 
       return _errors; 
      } 
      if (_productRepository.GetPk("0000" + ac.RowKey).Count() != 0) 
      { 
       _errors.Add("", "Account contains products"); 
       return _errors; 
      } 
      return _errors; 
     } 

Все, что я вижу там много много «возвращающих _errors» линии. Есть ли способ, которым я мог бы убрать код и сохранить функциональность? Я видел один пример использования урожая, но не уверен, могу ли я использовать его для этого метода.

+0

Вы используете MVC? – Marc

+0

Как насчет метода извлечения для всех проверок проверки? –

+0

Поскольку вы добавляете ошибки в список, я бы предположил, что вы не хотите возвращаться после первого совпадения, а скорее возвращаете коллекцию всех ошибок проверки. Кроме того, '_errors', похоже, не определяется в методе. Это глобальная переменная, к которой вы обращаетесь? Если да, то зачем вообще возвращать его? –

ответ

1
public IDictionary<string, string> ValidateForDeletion(Account ac) 
{ 
    var account = _accountRepository.GetPkRk(ac.PartitionKey, ac.RowKey); 
    if (account == null) 
    { 
     _errors.Add("", "Account does not exist"); 
    } 
    else if (_productRepository.GetPk("0000" + ac.RowKey).Count() != 0) 
    { 
     _errors.Add("", "Account contains products"); 
    } 
    return _errors; 
} 

Это позволит избавиться от ваших многочисленных заявлений возвратных

0

Ну вы всегда можете вытащить дополнительный хлам в свой собственный метод:

public IDictionary<string, string> ValidateForDeletion(Account ac) 
{ 
    var account = _accountRepository.GetPkRk(ac.PartitionKey, ac.RowKey); 
    return BuildErrorsList(account); 
} 

private IDictionary<string, string> BuildErrorsList(Account account) 
{ 
    if (account == null) 
    _errors.Add("", "Account does not exist"); 
    if (_productRepository.GetPk("0000" + ac.RowKey).Count() != 0) 
     _errors.Add("", "Account contains products"); 
    return _errors; 
} 

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

+0

Благодарим за редактирование, Пол. Вот что я хотел написать :-) –

0
public IEnumerable<ValidationResult> ValidateForDeletion(Account ac) 
{ 
    var account = _accountRepository.GetPkRk(ac.PartitionKey, ac.RowKey); 
    if (account == null) 
    { 
     yield return new ValidationResult("Account does not exist"); 
    } 
    if (_productRepository.GetPk("0000" + ac.RowKey).Count() != 0) 
    { 
     yield return new ValidationResult("Account contains products"); 
    } 
} 
0
  1. Это не идеально, что ваш метод изменения состояния (_errors поле) в то же время возвращение на поле - это делает его немного запутался. Обычно у вас либо есть метод, который изменяет состояние (изменение _errors) или есть функция, которая возвращает результат.

  2. Метод ValidateForDeletion возвращает после первого отказа, а не добавляет все ошибки в словарь. Вы уверены, что это правильное поведение?

Если бы рефакторинга это, я бы, вероятно, избавиться от побочных эффектов ValidateForDeletion «s (изменения к полям) и его возвращают IEnumerable<string>. Я также хотел бы выполнить полный набор валидаций. Очевидно, что это будет иметь последствия для вызывающего кода, поэтому вам нужно будет убедиться, что вы ничего не сломаете.

public IEnumerable<string> ValidateForDeletion(Account ac) 
{ 
    var account = _accountRepository.GetPkRk(ac.PartitionKey, ac.RowKey); 
    if (account == null) 
    { 
     yield return "Account does not exist"; 
    } 

    if (_productRepository.GetPk("0000" + ac.RowKey).Count() != 0) 
    { 
     yield return "Account contains products"; 
    } 

    return; 
} 
0

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

Например, я проверка, чтобы увидеть, если учетная запись может быть удалена, я могу использовать интерфейс IValidateDelete на счете, который имеет этот метод:

bool account.IsValidForDeletion(ref ValidationErrors validationErrors); 

Тогда я могу назвать его и передать в моей пустой проверке метод ошибок. Если результат верен, вам хорошо идти. Если он неверен, он добавит ошибку проверки во внутренний список объекта ValidationErrors.

public bool IsValidForDeletion(ref Validationerrors validationErrors) 
{ 
// 
if (something is valid) 
{ 
    return true; 
} 

validationErrors.AddError("Something is wrong, this cannot be deleted"); 

return false; 
} 

Теперь вы можете запустить через все ваши методы, как это:

public ValidationErrors ValidateABunchOfStuff() 
{ 
    ValidationErrors errors = new ValidationErrors(); 

    account.IsValidForDeletion(errors); 
    product.IsValidForDeletion(errors); 
    cake.IsValidForDeletion(errors); 

    return errors; 
} 
Смежные вопросы