私はコード内の辞書内であまりにも多くの辞書を使用しています、それはコードのにおいですか?

私は次のような他の辞書コレクションを含む多くの辞書コレクションを使用しています:

Dictionary>()

Dictionary>>()

これらのマップをループして、コード内のパラメータで渡しています。

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

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

12
私はこれがコードの匂いだと思うが、あなたはその多くの自己認識のためにアップヴォートを受ける価値がある
追加された 著者 jwiscarson,
辞書の辞書は2D辞書と呼ばれていますか?
追加された 著者 Shahbaz,
@bertzzie:私は自分自身のことを考えましたが、私は新しいダイヤモンドを磨くのが忙しいので、かなり面白いものを考え出すことはできません:)
追加された 著者 BoltClock,
「ええええええええええええるの? :p
追加された 著者 bertzzie,

5 答え

あなたはそのような制限に遭遇しますか?あなたのプログラムは変更/デバッグが難しいですか?そうなら、リファクタリングしてください。さもなければ、あなたは実用的なプログラマーです。

つまり、私はすぐに改善の余地が見えます。

IDictionary> x;

IDictionary> y = new Dictionary>();
6
追加された
ProductIDのように、私がGuidにもっと意味を与えることができればさらに良いでしょうが、私はできません。
追加された 著者 codecompleting,
@codecompletingその場合は、リファクタリング:)辞書を集約してわかりやすい名前のクエリメソッドを用意してください。多くの仕事ではなく、あなたがそれを幸せに思っていることを知っているでしょう。知っているように、何か気になることがあります。
追加された 著者 sehe,

私はそう言うでしょう、それのために特別にクラスを作成してください。 Dictionary で使用する制限を回避するのではなく、使用法ごとにメソッドを追加する/実装しないことができます。

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

5
追加された

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

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

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

2
追加された

Because Dictionary type is a reference type, you're not in bad situation here, but just for code clarity consider defining a new type, derived from Dictionary> just to shorten the code you're writing and to make it easy readable. The class should look like this:

internal class MyWrapper : Dictionary>
{
}

Or if it's important for you to keep with IDictionary, then go on with composite design by wrapping a Dictionary> instance into the class which implements the IDictionary> and just delegates all the methods to the wrapped Dictionary.

1
追加された

.NET 4.0では、タプルという、より悪用可能なデータ構造の1つが導入されました。

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

1
追加された