2013-08-20 66 views
1
I have some class: 

public class AddressViewModel 
{ 
    public string Index { get; set; } 
    public string Area { get; set; } 
    public string StreetName { get; set; } 
    public string Home { get; set; } 
    ... 
} 

string specialCharacters = @"[email protected]#$%^&*_+|{}:""<>?[];'/=\№"; 

而且我有檢查方法:檢查屬性值重構

private bool CompareCharacters(string specialCharacters, AddressViewModel x) 
    { 
     if (x.Index.Any(specialCharacters.Contains) || 
      x.Area.Any(specialCharacters.Contains) || ...) 
      return false; 
     else 
      return true; 
    } 

我如何重構這種方法嗎?我不喜歡「if」語句執行

回答

2

據我理解你的問題,你期望的行爲是檢查你的屬性是否包含在specialCharacters字符串的字符。如果不是這樣,我的歉意...

無論如何,我會用正則表達式來達到目的。大多數在specialCharacters中列出的字符應該爲正則表達式轉義。因此,代碼看起來像:

string specialCharacters = @"\~|!|\@|\#|\$|%|\^|\&|\*|_|\+|\||\{|\}|:\""|\<|\>|\?|\[|\]|;|'|/|=|\\|№"; 

public bool ValidateCharacters(string pattern, AddressViewModel model) 
{ 
    var reg = new Regex(pattern); 

    return reg.IsMatch(model.Index) == false && reg.IsMatch(model.Area) == false; 
} 

我做的名字有些重構和我寧願讓這個方法AddressViewModel的成員函數。此外,有關.Net框架支持驗證的文章非常好,例如this

4

那麼你可以只是有一個return語句開始:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x) 
{ 
    return !x.Index.Any(specialCharacters.Contains) && 
      !x.Area.Any(specialCharacters.Contains); 
} 

需要改變通話之間specialCharacters?如果沒有,你可以將它作爲參數刪除,只需要一個私有常量字段。您可能還需要提取,比較了字符串的私有方法,讓你可以只要致電:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x) 
{ 
    return ValidateCharacters(x.Index) && 
      ValidateCharacters(x.Area); 
} 

或者,如果你有很多的字符串,你甚至可以(在微小的性能開銷)創建用params參數和使用方法:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x) 
{ 
    return ValidateCharacters(x.Index, x.Area, x.StreetName, x.Home, ...); 
} 
+0

謝謝你,喬恩。 – zrabzdn

+0

當談到與布爾分配財產,是否有任何正當的理由來選擇'!(x || y)'超過'!x &&!y'或者它只是個人偏好? – Jonesopolis

+0

@Jonesy:如果可能,我寧願避免使用包圍。我發現它更易於閱讀。 –