2009-06-08 73 views
2

讓我們說我有一個文本框或任何其他形式的要求輸入社會安全號碼的輸入。我想指出,SSN是我現在簡單想到的一個純粹的例子。 該輸入自然會作爲字符串初始存儲。是否接受Object作爲參數可接受?

string s = Console.ReadLine(); 

讓我們說我想要一個驗證SSN的方法,它可以在我的代碼中用於各種場合。哎呀,我甚至可能會調用一個尚未由用戶輸入確定的變量。

這是可以接受的嗎?

public bool IsValidSSN(Object SSN) 
{ 
int mySSN; 
    if(Int.Parse(SSN == false) 
    { 
    mySSN = Convert.toInt32(SSN); 
    } 
... 
} 

或者你會傢伙堅持,我問一個特定的數據類型,如

public bool IsValidSSN(int SSN) 
{ 
... 
} 

,併爲此我需要將輸入轉化爲正確的數據類型之前我調用該方法就可以了。

順便說一句:我不問如何做一個適當的IsValidSSN代碼:)我只是想給我一個例子,當我說:我可以接受對象數據類型作爲參數,或者我應該儘量避免它?

回答

7

如果你必須接受一個對象,我會至少有重載類型參數的方法的重載。然後將這些對象變體輸入到這些方法中。

public bool IsValidSSN(object ssn) { 
    ... 
    IsValidSSN(Convert.ToInt32(ssn)); 
    ... 
} 

public bool IsValidSSN(int ssn) { 
    ... 
} 
2

它完全取決於您的設計以及您希望進行驗證的位置。它從根本上取決於你的整體架構和你的類層次結構。無論這樣做都沒有錯,只要確保它符合你的建築設計。

0

在上面的例子中,創建一個類型化的IsValidSSN要容易得多。一般來說,我發現打字減少了錯誤和靈活性。

在這種情況下,靈活性如果最重要,那麼使用Object可能是最好的選擇,但期望在日誌中面對一些強制衝突異常。

對於所有其他情況,請嚴格鍵入,或將其寫入python。

0

就我個人而言,我會做一個SSN類,並能夠問SSN是否有效。在業務邏輯中有代表校長的類很重要。例如,這非常重要,您可能會對需要更多驗證的東西(如信用卡類)做些什麼。如果你可以避免它並且在業務邏輯中交付一些作爲原語的東西,那麼處理對象並不是最好的,因爲原語也不好(你的架構使得SSN1 + SSN2 = SSN3完全有效,即使在商業邏輯中,它也是無稽之談)。

1

在這種情況下,我看不出在接受對象方面的價值。想想你如何期待這個功能的工作。 (顯然你沒有,因爲你發佈的代碼不起作用)。我想,你打算是這樣的:

if (SSN is string) 
    SSN = Convert.toInt32(SSN); 
else if (SSN is TextBox) 
    SSN = Convert.toInt32(SSN.Value); 
else /* etc */ 

這是怎麼回事優於:

bool isValidSSN(int SSN) { /* real valuation code */ } 
bool IsValidSSN(String SSN) { return isValidSSN(Convert.toInt32(SSN)); } 
bool IsValidSSN(TextBox SSN) { return isValidSSN(Convert.toInt32(SSN.Value)); } 

重載的方法更簡單,更快,因爲他們更多的是什麼,從運行時間做決定編譯時間。

+0

那麼整個SSN代碼只是一個我編寫的例子,而我想通過我的問題。這更多的是提供我的想法,而不是工作代碼的例證。 謝謝你的例子 – CasperT 2009-06-08 22:48:07

0

在這種情況下,我會說這是不可接受的。如果輸入有破折號或其他分隔字符(例如:### - ## - ####),該怎麼辦?你顯然不能將該值解析爲一個整數,但該值仍然有效。如何使用正則表達式來確保值是您所期望的。

在使用「對象」類型作爲參數方面,這在許多情況下是完全有效的。事實上,它是用來在整個.NET框架(看事件委託):

public void Control_MouseOver(object sender, MouseEventArgs e){} 

這將是拳擊/拆箱,這是真正的變量進行「常規」操作的唯一途徑的簡單情況直到.NET 2.0。

您還可以使用泛型來解決此問題,而無需投射。如果您創建的接口實現類似INumeric(我不知道這是實際接口)還是IComparable,您應該能夠以更優雅的方式執行操作:

public bool IsValidSNN(INumeric SSN) {}

相關問題