2017-02-07 1 views
4

Работайте на C# 4.5. Мой сингл синтаксиса так много, если в других сериях кажется, что запах кода, нужен способ избежать этого запаха. Любая помощь будет приемлемой. СпасибоКак избежать повторения, если код остаточного кода еще

public bool CheckValidCustomer() 
{ 
    return _checkManager.IsCustomerPersonal(_customer) ? IsValidPersonalCustomer() : IsValidCompanyCustomer(); 
} 

private bool IsValidCompanyCustomer() 
{ 
    if (_checkManager.IsValidFinancialInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Financial Info."; 
     return false; 
    } 

    if (_checkManager.IsValidCompanyInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Company Info."; 
     return false; 
    } 

    if (_checkManager.IsValidStakeHolderInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Stake Holder Info."; 
     return false; 
    } 

    if (_checkManager.IsValidResponsiblePersonInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Responsible person Info."; 
     return false; 
    } 


    if (_checkManager.IsValidScreeningInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Screening Info ."; 
     return false; 
    } 

    if (_checkManager.IsValidMyNumberUpload(_customer) == false) 
    { 
     ProcessMessage = "Please Check My Number Upload Info."; 
     return false; 
    } 

    if (_checkManager.IsValidIdUpload(_customer) == false) 
    { 
     ProcessMessage = "Please Check Id Upload Status."; 
     return false; 
    } 

    if (_checkManager.IsValidCustomerStatus(_customer) == false) 
    { 
     ProcessMessage = "Please Check Customer Status."; 
     return false; 
    } 

    return true; 
} 

private bool IsValidPersonalCustomer() 
{ 
    if (_checkManager.IsValidPersonalInfo(_customer)==false) 
    { 
     ProcessMessage = "Please Check Personal Info."; 
     return false; 
    } 

    if (_checkManager.IsValidFinancialInfo(_customer)==false) 
    { 
     ProcessMessage = "Please Check Financial Info."; 
     return false; 
    } 

    if (_checkManager.IsValidCompanyInfo(_customer)==false) 
    { 
     ProcessMessage = "Please Check Company Info."; 
     return false; 
    } 

    return true; 
} 
+0

Реализовать "ValidateCompanyCustomer" какой-то в чеке менеджера. Внедрите каждый «IsValidCompanyInfo» в качестве валидатора «Стратегия». Каждая стратегия валидатора может реализовать метод «Проверить». Тогда менеджер проверки будет иметь IEnumerable стратегий проверки достоверности, с которыми он проходит. Затем вы также сможете протестировать каждую стратегию валидатора отдельно. – bgura

+4

Это не так, если/else. Это просто заявления. – mason

+3

, так как это ** рабочий код **, StackOverflow не подходит для размещения этого вопроса. Это относится к [CodeReview] (http://codereview.stackexchange.com): http://codereview.stackexchange.com/help/on-topic – Claies

ответ

3

Вы можете использовать шаблон правила проверки. Avoiding many if blocks for validation checking

Создать набор правил валидации. И пробегайте их по одному. Если какое-либо одно правило проверки не выполняется, полная проверка не выполняется (в зависимости от бизнес-правил).

Вы также можете обратиться к WPF Data Binding Validation (Проверка данных -> Процесс проверки), чтобы получить идеи для разработки собственного механизма правил проверки.

2

Мои предложения:

  1. Создание базового класса Customer и два подкласса PersonalCustomer/компанииОбслуживание. Валидация должна выполняться в рамках этих классов - они знают их детали реализации.
  2. В базовом классе клиента есть элемент, который является цепочкой действий по проверке, каждый элемент действия в цепочке возвращает значение Enum в качестве результата проверки (успех o4 конкретной ошибки)
  3. У базового класса Customer есть метод Validate, который вызывает каждый действие валидации в цепочке и возвращает, если проверка не выполнена
  4. Каждый подкласс реализует подробное действие валидации и регистрирует его в цепочке валидации. Больше нет checkmanager. вызывающий может просто вызвать _customer.Validate(), и не нужно беспокоиться о том, какой тип клиента есть.
  5. Уровень представления для отображения перечисления (в основном код ошибки) для некоторых конкретных строк пользовательского интерфейса, это можно сделать с помощью массива/hashset - не более if/else или switch.
0

Вы могли бы сделать что-то вроде этого ...

private bool IsValidCompanyCustomer() 
{ 
    var companyValidationRules = new Dictionary<string, Func<Customer, bool>> 
    { 
     { "Please Check Financial Info.", _checkManager.IsValidFinancialInfo}, 
     { "Please Check Company Info.", _checkManager.IsValidCompanyInfo}, 
     { "Please Check Stake Holder Info.", _checkManager.IsValidStakeHolderInfo}, 
     { "Please Check Responsible person Info.", _checkManager.IsValidResponsiblePersonInfo}, 
     { "Please Check Screening Info.", _checkManager.IsValidScreeningInfo}, 
     { "Please Check My Number Upload Info.", _checkManager.IsValidMyNumberUpload}, 
     { "Please Check Id Upload Status.", _checkManager.IsValidIdUpload}, 
     { "Please Check Customer Status.", _checkManager.IsValidCustomerStatus}, 
    }; 

    var failedRule = companyValidationRules.Where(d => !d.Value(_customer)) 
              .Select(d => d.Key) 
              .FirstOrDefault(); 
    if (!string.IsNullOrWhiteSpace(failedRule)) 
    { 
     this.ProcessMessage = failedRule; 
     return false; 
    } 

    return true; 
} 

private bool IsValidPersonalCustomer() 
{ 
    var companyValidationRules = new Dictionary<string, Func<Customer, bool>> 
    { 
     { "Please Check Personal Info.", _checkManager.IsValidPersonalInfo}, 
     { "Please Check Financial Info.", _checkManager.IsValidFinancialInfo}, 
     { "Please Check Company Info.", _checkManager.IsValidCompanyInfo}, 
    }; 

    var failedRule = companyValidationRules.Where(d => !d.Value(_customer)) 
              .Select(d => d.Key) 
              .FirstOrDefault(); 
    if (!string.IsNullOrWhiteSpace(failedRule)) 
    { 
     this.ProcessMessage = failedRule; 
     return false; 
    } 

    return true; 
} 

}

Смежные вопросы