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

これらのどちらも私には魅力的ではありません。あなたのシステムの要件は何か分かりませんが、もっと大きな方法でこれを行うより良い方法があるかどうかを見ていきたいと思います。ここでのリファクタリングについては、変更のリスクに対して大きなメリットを実際に加えているわけではありません。

関連する問題