2010-11-01 10 views
0
private void ValidateName(string name) // maybe this method should take the Customer object instead? 
{ 
    // validate 
} 
public void ValidateCustomer(Customer c) 
{ 
    ValidateName(c.Name); 
    // Other validations 
} 

Предположим, что если у Клиента есть customerType == CustomerTypes.Internal или что-то, нет необходимости проверять имя.Дизайн: Где положить оператор if?

Вы поместили бы оператор if в метод ValidateName или метод ValidateCustomer?

Редактировать: Я говорю только о части проверки. Не вся проверка.

+1

Trumstedt: Ваш второй вопрос должен быть отдельным вопросом. Это совершенно не связано с вашим первым. – jason

+1

Обратите внимание, что стандартное соглашение об именах для 'enum' должно иметь тип сингулярный, если только это' [Flags] enum'. Таким образом, 'public enum CustomerType', а не' public enum CustomerTypes'. Обратите внимание, что 'CustomerType.Internal' читается более четко, чем' CustomerTypes.Internal', потому что 'Internal' является типом клиента, а не типами клиентов. – jason

+0

@Jason Хорошо, я удалю его и опубликую позже. Спасибо за примечание об условных обозначениях. – KTrum

ответ

2

Если валидация имеет отношение к Customer, я бы поместил ее в ValidateCustomer.

+1

+1, поскольку имя метода ValidateName не дает сигнала о том, что он привязан к Клиентам. – Larsenal

+0

Да, я думаю, это зависит от того, является ли ValidateName специально для Клиента или нет! – KTrum

+0

Я не согласен; Я думаю, что нужно добавить третий метод, поскольку логика исключения определенных типов клиентов - это исчисление, которое применяется только к имени (на основе утверждения «нет необходимости проверять имя»). См. Http://stackoverflow.com/questions/4070111/design-where-to-put-the-if-statement/4070143#4070143. – jason

1

В ValidateCustomer - бизнес-правило основано на клиенте не по имени.

1

Я бы поместил его внутри ValidateCustomer, поскольку эта логика является частью процесса проверки Клиента, который будет применяться ко всем Клиентам ... а не только к имени.

+0

Он говорит: «Нет необходимости проверять имя», а не на необходимость проверки. – jason

+1

@ Джейсон - правда. Но все это часть проверки клиента, которая происходит внутри ValidateCustomer. Метод ValidateName ничего не знает о Клиенте (жизнеспособно, что вы можете вызвать ValidateName для других типов, кроме Клиента). –

+0

Я частично согласен, поэтому я дал предложение, которое я сделал: http://stackoverflow.com/questions/4070111/design-where-to-put-the-if-statement/4070143#4070143 – jason

0

Поскольку вам нужен доступ к типу Customer, его можно разместить только в ValidateCustomer. Если вы поместите его в ValidateName, вам необходимо будет изменить интерфейс для передачи информации о типе.

1

Вы поместили бы оператор if в метод ValidateName или метод ValidateCustomer?

Я не люблю предложения, чтобы положить его в методе ValidateCustomer, так как это исключение, которое относится только к name. Итак, мой ответ на ваш вопрос «ни», и я не предпочел бы следующее:

private void ValidateCustomerName(Customer customer) { 
    if(customer.CustomerType == CustomerType.Internal) { 
     return; 
    } 
    ValidateName(customer.Name); 
} 

private void ValidateName(string name) { 
    // do validation 
} 

public void ValidateCustomer(Customer customer) { 
    ValidateCustomerName(customer); 
    // rest of validation 
} 
+0

Если вы собираетесь чтобы понизить, пожалуйста, объясните. – jason

0

Зависит ли бизнес-логика связана с именами (не «внутренние» имена не должны быть подтверждены) или клиентов (никакие внутренние имена клиентов не подлежат проверке). Если вы поместите его в ValidateName, вам нужно указать, что имя является внутренним.

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