2012-05-19 46 views
5

我有下一段代碼:我應該儘可能避免使用魔術字符串嗎?

internal static string GetNetBiosDomainFromMember(string memberName) 
    { 
     int indexOf = memberName.IndexOf("DC=", StringComparison.InvariantCultureIgnoreCase); 
     indexOf += "DC=".Length; 
     string domaninName = memberName.Substring(indexOf, memberName.Length - indexOf); 

     if (domaninName.Contains(",")) 
     { 
      domaninName = domaninName.Split(new[] { "," }, StringSplitOptions.None)[0]; 
     } 

     return domaninName; 
    } 

我提出一些parsings爲AD,所以我有一些字符串如 「DC =」, 「objectCategory =」, 「LDAP://」,」, 「,」。「誰誰。 我發現上面的代碼要比下面的代碼更易讀:(你可以找到相對的,讓」我知道)

private const string DcString = "DC="; 
    private const string Comma = ","; 

    internal static string GetNetBiosDomainFromMember(string memberName) 
    { 
     int indexOf = memberName.IndexOf(DcString, StringComparison.InvariantCultureIgnoreCase); 
     indexOf += DcString.Length; 
     string domaninName = memberName.Substring(indexOf, memberName.Length - indexOf); 

     if (domaninName.Contains(CommaString)) 
     { 
      domaninName = domaninName.Split(new[] { CommaString }, StringSplitOptions.None)[0]; 
     } 

     return domaninName; 
    } 

即使我可能有‘DC’和‘DC =’,我想在。這個變量或一分爲二,這些:(然後我的問題的名字: 我應該避免魔術字符串儘可能

修訂

一些結論:。

  • 有一些方法可以避免使用字符串,這可能會更好。要實現它可以使用:靜態類,枚舉器,數字常量,IOC容器,甚至反射。
  • 常量字符串可幫助您確保沒有任何拼寫錯誤(在所有引用字符串中都有)。
  • 標點符號的常量字符串沒有任何全局語義。因爲它們是「,」,所以它們更易於使用。對於這種情況,可以考慮使用常數,如果該常數可能在將來發生變化,如變化「,」「。」(有一個常量可以幫助你進行重構,儘管現代工具不需要常量或變量就可以做到這一點)。
  • 如果你只使用它的字符串,你不需要把它變成一個常量。然而,考慮一個常量可以被記錄並顯示在文檔中(如Javadocs)。這對於非重要的字符串值可能很重要。
+1

我想你可能對[this]感興趣(http://programmers.stackexchange.com/questions/142278/are-nullable-types-preferable-to-magic-numbers)主題。 – Torv

+0

我認爲你瞄準MainMa的答案吧? –

+0

是的,你是對的。哦,我建立了[另一個有趣的話題](http://programmers.stackexchange.com/questions/145738/should-a-string-constant-be-defined-if-its-only-going-to-be-used-once ) 爲你。這個主題不回答這個問題,但他們有趣=) – Torv

回答

1

我一定會爲像「DC」和「objectCategory」這樣的實際名稱創建常量,但不能用於標點符號。這一點的目的是確保你沒有任何錯別字,並且你可以很容易地找到所有使用魔法字符串的地方的引用。標點符號並不是真正的一部分。

爲了清楚起見,我假設魔術弦是你必須處理的事情,你沒有選擇讓它們成爲一個常數定義的數字。正如在對你的問題的評論中那樣,如果可能的話,這總是更可取的。但是,如果您必須與其他需要它的系統進行交互,則有時您必須使用字符串。

+0

聽起來不錯,字符串像「,」。 「。」,「/」,「//」,「=」可能會被硬編碼。雖然我想避免像DcString + EqualString這樣的東西。 –

+0

是的,它們沒有任何全局語義。這是考驗。 –

相關問題