2011-08-02 84 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

这些对我来说都不是很好。我不知道你的系统的要求是什么,但我会在这里查看更大的图片,看看是否有更好的方法来完成此操作。至于这里的重构,我不打扰,并没有真正为改变的风险增加任何大的好处。