2009-03-18 5 views
2

ハッシュテーブル/ディクショナリを使用しているとき、私は時々キーを指定する方法に苦労します。例えばハッシュテーブルまたはディクショナリキー名を保存する場所

:私は(この例ではPythonを使用して)簡単な辞書、

foo = {'bar': 'baz', 'foobar': 'foobaz' } 

を作成する場合、私は、キー値を持つ(他のモジュールで)値にアクセスすることができます(foo['bar'])とbazを取り戻します。

Dr. Evilの言葉では、「かなり標準的です。」

残念ながら、キーに静的な文字列を使用すると、このディクショナリを使用するすべてのモジュールがその実装に緊密に結合されます。もちろん、これは他のキータイプ(Enum、オブジェクトなど)を使用する場合にも適用できます。とにかくそれをスライスすると、辞書にアクセスするすべてのモジュールはキーの値を知る必要があります。

これを解決するには、通常、静的定数文字列値(または言語で使用可能な場合は列挙型)をキーに使用し、それらをローカルクラス/モジュールまたは別のモジュール/クラスに公開するか、したがって、辞書キー自体の変更はすべて1つの場所に保存されます。

これは通常、次のようになります。

BAR_KEY = 'bar' 
foo[BAR_KEY] = 'foobar' 

は、辞書の使用は、その実施に必ずしもカップルモジュール/クラスがないようなキーを指定するのがより良い方法はありますか?

注:これに対処するいくつかの回答(例:property-to-reference-a-key-value-pair-in-a-dictionary)がありましたが、トピックではこの問題に具体的に対処できていないようです。答えは役に立ちましたが、より広い範囲の経験が必要です。

答えて

2

プロパティを含むクラスを作成してみませんか?これは(私が知っているところから)Pythonでうまくやっていますし、他の言語でもうまく動作します。名前をリファクタリングすることは、今日のツールでも簡単です。

+0

良い点は、キーが常に既知で定数であれば、プロパティを持つクラス/構造体に入れる方が良いでしょう。 – CodingWithSpike

+0

さて、私は通常、辞書が複数の(3+)モジュールで使用されているときにそうします。しかし、もし私がちょうどあるモジュールから別のモジュールに単純な辞書を渡しているのであれば、ちょっと残酷すぎるように見えませんか?あなたは多くの不動産クラスで終わるかもしれません:) – bedwyr

+1

@bedwyr、確かにPythonのための過剰なものではありません(Jensenの答えを見てください)。構造体が定義されているため、物事をもっと理解しやすくします。 (もちろん、あなたはそれを動的に型付けされた言語で混乱させることができます...) – strager

0

個人的には、あなたの方法を使用します。それはかなり賢明で、シンプルで、実際の問題を解決します。

0

私は通常同じことをします。キーが常に同じになる場合は、そのキーを保持する言語にかかわらず、「定数静的」にします。

1

辞書キーを保持する別のクラスを作成することがあります。これにより、独自の名前空間と、キーがconst文字列にあるという定期的な利点、つまりタイプミスのリスクがなく、コード補完が得られ、文字列値を変更するのが簡単です。別のクラスを作成したくない場合は、const文字列を持つだけの名前空間以外のすべての利点が得られます。

つまり、あなたはsoft codingの領土に近づいていると思います。辞書のキーが変更された場合は、辞書を使用して変更するコードで問題ありません。

2

オブジェクトを渡していて既知のキーがある場合は、常にオブジェクトに属性を追加することをお勧めします。 IMO、辞書の使用例は、キーが何であるかわからないときです。

Pythonは簡単です:

foo.bar=baz 

Javaはほとんど同じです:

class Foo { public String bar="baz"; } 

ザ・Pythonのパフォーマンスプロパティの検索だけで辞書引きとJavaであるため、ほとんど同一でありますパフォーマンスは良いでしょう。

関連する問題