2011-11-24 4 views
12

は、私のような他の辞書のコレクションが含まれている辞書のコレクションの多くを使用しています:私はコード内の辞書内で多すぎる辞書を使用していますが、それはコードのにおいですか?

Dictionary<Guid, List<string>>() 

Dictionary<Guid, Dictionary<Guid, List<string>>>() 

私はこれらのマップをループし、自分のコード内のパラメータの周りにそれらを渡しています。

このコレクションの性質を実際に拡張することはできないので、これは悪い考えです。

クラスでこれらを囲む方がよいでしょうか?

+3

これはコードの匂いだと思いますが、その多くの自意識のために – jwiscarson

+3

は「ヨウドッグ..」と言うことが許されていますか? :p – bertzzie

+2

@bertzzie:私は自分自身のことを考えましたが、私は新しいダイヤモンドを磨くのに忙しいので、合理的に面白いものを考え出すことはできません:) – BoltClock

答えて

6

このような制限がありますか?あなたのプログラムは変更/デバッグが難しいですか?そうなら、リファクタリングしてください。さもなければ、あなたは実用的なプログラマーです。私はすぐに改善の余地見ることができる、と述べた

:あまりの痛みと、それは後でもたらし、それは初めに思えるほど素敵なタプル導入

IDictionary<Guid, List<string>> x; 

IDictionary<Guid, IDictionary<Guid, List<string>> y = new Dictionary<Guid, IDictionary<Guid, List<string>>(); 
+0

ProductIDのように私がGuidにもっと意味を与えることができればもっと良いでしょうが、できません。 – codecompleting

+2

@codecompletingその場合、リファクタリング:)辞書を集約してわかりやすい名前の素敵なクエリメソッドを用意するだけです。多くの仕事ではなく、あなたがそれを幸せにしていることを知っているでしょう。あなたが気づいているように、何かがあなたを悩ませているのと同じです。 – sehe

5

私は「はい」と言いますが、それ専用のクラスを作成します。 Dictionaryを使用して見つかった制限を回避するのではなく、使用法ごとにメソッドを追加する/実装しないことができます。

あなたは木のような構造がほしいと思うように聞こえます。

1

は、.NET 4.0、1、さらに乱用可能なデータ構造、賢明に使うべきです。

ディクショナリは、クラスを作成する代わりに、接着剤としてではなく、素早く要素にアクセスできるため、ここではあまり悪くありません。それらの辞書がある計算や何かのためのメソッドでローカルで使われていても、それらをパラメータとして渡すときにあまり明確でないなら、あなたの辞書の使い方に間違いはないと私は信じています。そのような場合は、クラスを作成する必要があると思います。

1

ディクショナリタイプは参照タイプなので、ここでは悪い状況ではないが、コードを分かりやすくするために、Dictionary<Guid,List<string>>から派生した新しいタイプの定義を検討してください。 。

internal class MyWrapper : Dictionary<Guid, List<string>> 
{ 
} 

それとも、IDictionary<Guid, List<string>>とちょうど委譲するすべてのメソッドへの実装クラスにDictionary<Guid, List<string>>インスタンスをラップすることにより、複合デザインで上に行く、その後、IDictionaryで維持することが重要だ場合:クラスは次のようになります。ラップされた辞書。

2

少なくとも、クラス内の「臭いのある」データ構造をラップして、クライアントコードなしでデータを照会/変更するためのクリーンなAPIを提供することで実装をカプセル化することができます。

その後、いつでもデータ構造の実装を変更することができます。これをやっていないなら、10〜100倍のクライアントコードがあると後悔するかもしれませんし、リファクタリングにはあまりにも高価です。

カプセルがきれいに保たれていれば、それがうまくいくと感じるという事実は本当に関連していないことがわかります - コードが必要とするものを実行し、維持できる限りそれにはるかに多くの時間を投資しているわけではありません。(私は汚れたコードを主張しているわけではありませんが、商業的な現実と理論的な完成を達成したいという欲求とのバランスを取らなければなりません - コードがうまく動作し、問題を引き起こさないならば、改善するか、それをリファクタリングする代わりに、単にクラスにカプセル化し、クライアントから汚れた実装を分離するだけで、リスクを中和するだけで十分です)

関連する問題