2010-11-01 110 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 2010-11-01 15:24:11

+1

另外需要注意的是'enum'的標準命名約定是除非它是'[Flags] enum',否則該類型是單數的。因此,「public enum CustomerType」,而不是「public enum CustomerTypes」。請注意'CustomerType.Internal'比'CustomerTypes.Internal'更清晰,因爲'Internal'是客戶類型,而不是客戶類型。 – jason 2010-11-01 15:46:38

+0

@Jason好的,我會刪除它,並在以後分開。感謝有關命名約定的註釋。 – KTrum 2010-11-01 15:58:39

回答

2

如果驗證與Customer有關,我會把它放在ValidateCustomer

+1

+1,因爲ValidateName方法的名稱沒有提供與客戶關聯的信號。 – Larsenal 2010-11-01 15:13:18

+0

是的,我想這取決於ValidateName是否專門針對客戶! – KTrum 2010-11-01 15:18:22

+0

我不同意;我認爲應該增加第三種方法,因爲排除某些類型的客戶的邏輯是僅適用於名稱的預期(基於「不需要驗證名稱」的聲明)。請參閱http://stackoverflow.com/questions/4070111/design-where-to-put-the-if​​-statement/4070143#4070143。 – jason 2010-11-01 15:45:02

1

我把它放在ValidateCustomer

1

在ValidateCustomer中 - 業務規則基於客戶而非名稱。

1

我會把它放在ValidateCustomer之內,因爲該邏輯是客戶驗證過程的一部分,將被應用於所有客戶......不僅僅是名稱。

+0

他說「沒有必要驗證名稱」,根本不需要驗證。 – jason 2010-11-01 15:12:45

+1

@Jason - 的確如此。但它是ValidateCustomer內部發生的所有客戶驗證的一部分。 ValidateName方法不知道有關客戶的任何信息(可能需要爲Customer以外的類型調用ValidateName)。 – 2010-11-01 15:16:04

+0

我部分同意這就是爲什麼我給出了我所做的建議:http://stackoverflow.com/questions/4070111/design-where-to-put-the-if​​-statement/4070143#4070143 – jason 2010-11-01 15:16:54

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

如果你要去downvote,請解釋。 – jason 2010-11-01 16:24:02

0

取決於業務邏輯是否是聯繫在一起的名字(沒有「內部」的名稱需要進行驗證)或客戶(沒有內部客戶名稱需要驗證)。如果將其放入ValidateName,則需要指出該名稱是內部的。