2012-02-29 83 views
8

硬編碼字符串。當我在看我的代碼,我喜歡寫東西..使用了很多代碼

if (role == "Customer") 
{ 
    bCustomer = true; 
} 
else if (role == "Branch") 
{ 
    bIsBranch = true; 
} 

或者

foreach(DataRow as row in myDataSet.Tables[0].Rows) 
{ 
    row["someField"]=somefield.Tostring() 
} 

你們幹什麼呢?什麼時候可以做,什麼時候不應該這樣做?如果有的話會是更好的方法來寫這個,如果有的話?

感謝您的意見:我想我應該加什麼如果(爲了這個例子的目的)我只使用這個角色比較一次?做一個全新的班級還是一個更好的主意嗎?我也應該有一個名爲「常量」的類是多個持有特定常量的類,例如「角色」類?

+0

很難給出一個明確的答案,但在第一個例子,我想嘗試重構它如果適用於使用多態。在第二種情況下,我可能會圍繞DataTable創建一個包裝類,它的列名稱是字符串常量,因此它們有一箇中心位置。所有消費者只使用包裝類而不使用DataTable。 – 2012-02-29 15:32:11

回答

23

不可以。請勿使用「magic strings」。相反,用常量創建一個靜態類,如果可以的話創建一​​個枚舉。

例如:

public static class Roles 
{ 
    public const string Customer = "Customer"; 
    public const string Branch = "Branch"; 
} 

用法:

if (role == Roles.Customer) 
{ 

} 
else if (role == Roles.Branch) 
{ 

} 

這裏有一個good discussion on various solutions

+0

我不明白爲什麼這是'魔術串'的一個實例?從維基:「一個神奇的字符串是一個輸入,一個程序員相信再也不會在外部和否則激活隱藏功能,該程序可能會提供意見,讓在大多數情況下,預期的響應的用戶然而,如果用戶確實。實際上無辜地提供預定義的輸入,調用內部功能,程序響應通常對用戶而言是非常意外的(因此出現「神奇」)。 – pfries 2012-02-29 16:07:19

+1

我不是維基百科文章的措辭的粉絲,但它是我發現的第一個定義。在軟件中,魔術字符串通常是指開發人員可能很容易錯誤鍵入的字符串值。 – jrummell 2012-02-29 16:09:02

+1

我通常認爲'魔術弦'是標誌的含義或用法是神祕的或者不是不言而喻的。如果不是編譯器,整個C#語言將被定義爲魔術字符串,更不用說所有解釋的動態語言。我總是錯誤地輸入那些東西......實際上,當我記住api而沒有參考時,它確實感覺像是魔法。 – pfries 2012-02-29 16:14:50

0

嗯,在我看來,取決於你的應用程序設計。 我從積極的一面看它 - 如果應用程序按照它應該工作的方式工作,那就很好。恕我直言

2

將硬編碼字符串分別聲明爲常量而不是每次聲明一個新字符串總是更好。它保持代碼清潔並減少由於輸入錯誤而導致的錯誤。

關於應該還是不應該完全取決於場景。

1

我會做一個角色靜態類:

public sealed class Roles 
{ 
    public const string BRANCH = "Branch"; 
    public const string CUSTOMER = "Customer"; 

    public static bool IsCustomer(string role) 
    { 
     return role == CUSTOMER; 
    } 
} 

然後在你的代碼:

bCustomer = Roles.IsCustomer(role); 

或者,這需要多一點的設置,但RoleProvder(取決於網絡或不)提供了很多好方法。

0

多態性是一回事,但在代碼中使用硬編碼字符串並不是很好。定義一個包含字符串的變量並沿代碼使用此變量會更好。這種情況下,如果你需要改變一些東西(相信我你會),你可以改變這個變量的值,並完成(更少的錯誤!)

2

我相信一個更好的方法是使用application settings這意味着你贏了如果「客戶」或「分支」值發生更改,則無需重新編譯您的代碼。魔法值顯然是不好的,這將是一個很好的第一步/遠離他們的選擇。此外,它保持你的值在一個地方,我也相信你可以在運行時不需要重新啓動應用程序reload the settings(儘管我自己沒有嘗試過)。

E.g.:

if (role == Properties.Settings.Default.CustomerRole) 
{  
    bCustomer = true; 
} 
else if (role == Properties.Settings.Default.BranchRole) 
{  
    bIsBranch = true; 
} 
+0

你可以在應用程序設置中爲我顯示一些代碼嗎? – 2012-02-29 15:57:47

+0

在Visual Studio中,右鍵單擊您的項目,選擇Properties-> Settings選項卡。然後單擊以創建默認設置文件(如果不存在)。如果是這樣,那麼在這裏添加你的條目,以使CustomerRole成爲一個值爲「Customer」的字符串等等。然後你可以通過靜態默認實例來引用它們,正如我在示例中所示。請查看此視頻的第一部分:http://www.youtube.com/watch?v = t9WIvYQ1dNU,以及3分50秒英寸。 – Jeb 2012-02-29 16:04:45

0

可維護性的緣故,你應該儘可能正式字符串比較,無論是作爲命名常量或枚舉。程序員的好處是可以本地化更改。即使使用重構工具,查找所有使用字符串的位置也可能很乏味且容易出錯。你今天可能只有一個地方在進行這種比較,但你或未來的維護者可能會將其擴展到代碼的其他部分。而且,課程本身可能會增長,需要分解。隨着時間的推移,這些東西往往會隨着程序的不斷變化而變化

我會簡單地聲明這些字符串接近正在使用他們,但合在一起的常數。除非你知道你需要它,否則不要打擾像角色這樣的新抽象。如果您需要比較的角色數增加或在此類之外需要,則可以創建角色枚舉或角色類,具體取決於比較的複雜程度。

此外,通過使用常量,信號用途的編譯器,讓你獲得一些小的內存管理的好處,其中,由於你的比較是在一個循環中,通常是一個很好的做法。