2011-08-02 78 views
0

有一個類通過每個表有1 string[]變量來定義各種表中的主鍵。例如:這個重構有什麼好處嗎?

static string[] my_table_foo_TablePrimaryKeys = new string[] { "primary_key1", "primary_key2" } 
static string[] my_table_bar_TablePrimaryKeys = new string[] { "user_id", "customer_number" } 

我覺得這是一個有點亂,對我們以後添加第三個表的情況下不易伸長,我們要回到這個類來定義新的第三個表的主鍵。所以,我重構它看起來像這樣:

static Dictionary<string, string[]> tablePrimaryKeys = new Dictionary<string, string[]>() 
    { 
     {"my_table_foo", new string[] { "primary_key1", "primary_key2" }}, 
     {"my_table_bar", new string[] { "user_id", "customer_number" }} 
    }; 

你會認爲這是一個體面的重構改變?爲什麼?

此外,它也是一個小乾淨,在我主要的鑰匙被引用的愚見。例如:

在前一種情況:

DoStuffWithPrimaryKeys(my_table_foo_TablePrimaryKeys, "other stuff", 1000); 

而在後一種情況下:

string[] keys = tablePrimaryKeys["my_table_foo"]; 
DoStuffWithPrimaryKeys(keys, "other stuff", 1000); 

如果有人也想提什麼的原則是「可接受的重構」,如何知道重構可以接受什麼,什麼不可以,那會很好,很有教育意義。

我正在使用C#和.NET 3.5。

+0

如果'my_table_foo'只存在於數據庫中,是不是數據庫所關心的?如果'my_table_foo'有一個匹配的C#類,你有沒有考慮過屬性? –

回答

3

我對這個改變不是太瘋狂。這兩種情況對我來說都是可疑的,但在第一種情況下,至少你可以從編譯器中獲得一定程度的安全性。只要密鑰在變量初始化的地方拼寫正確,只要使用它們,它們就會按預期工作。

重構後,您將在任何地方使用字符串,任何在某處的拼寫錯誤都會導致運行時錯誤。

+0

好點。不幸的是,更高層的體系結構不能因爲複雜的原因而改變,我不會進入這裏,但我試圖通過改進我能做的事情來應對。我認爲字典會給我買一個稍微乾淨的實現,但事實證明它並不能真正爲我節省很多。 –

0

我會說它不會更好或更糟。你只是引入魔術字符串而不是變量名稱。

1

這些對我來說都不是很好。我不知道你的系統的要求是什麼,但我會在這裏查看更大的圖片,看看是否有更好的方法來完成此操作。至於這裏的重構,我不打擾,並沒有真正爲改變的風險增加任何大的好處。