2

ハッシュ テーブル/辞書を使用しているとき、キーの指定方法に苦労することがあります。

例: 簡単な辞書を作成すると (この例では Python を使用)、

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

キー値 ( foo['bar']) を使用して (他のモジュールの) 値にアクセスし、baz戻ることができます。

Dr. Evil の言葉を借りれば、「かなり標準的です」。

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

これを解決するために、私は通常、キーに静的な定数文字列値 (言語で使用可能な場合は列挙型) を使用し、それらをローカル クラス/モジュールにパブリックに格納するか、別のモジュール/クラスに格納します。したがって、ディクショナリ キー自体への変更は 1 つの場所に保持されます。

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

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

ディクショナリの使用が必ずしもモジュール/クラスをその実装に結合しないように、キーを指定するより良い方法はありますか?

注: SO でこれに対処するいくつかの応答を見てきました (例: property-to-reference-a-key-value-pair-in-a-dictionary ) が、トピックはこの問題に具体的に対処していないようです。回答は参考になりましたが、もっと幅広い経験が欲しいです。

4

5 に答える 5

2

プロパティのみを含むクラスを作成してみませんか? これは (私が知っている限りでは) Python で適切に行われ、他の言語でもうまく機能します。名前のリファクタリングも、今日のツールでは些細なことです。

于 2009-03-18T02:26:03.177 に答える
2

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

Python は簡単です:

foo.bar=baz

Java はほとんど同じです。

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

プロパティのルックアップは単なる辞書のルックアップであり、Java のパフォーマンスの方が優れているため、Python のパフォーマンスはほとんど同じです。

于 2009-03-18T02:32:13.443 に答える
1

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

そうは言っても、ソフトコーディングの領域に近づいていると思います。ディクショナリのキーが変更された場合、ディクショナリを使用するコードが変更されても問題ありません。

于 2009-03-18T02:31:53.867 に答える
0

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

于 2009-03-18T02:27:07.997 に答える
0

私は通常同じことをします。キーが常に同じになる場合は、キーを保持する言語で「定数静的」を作成します。

于 2009-03-18T02:29:02.280 に答える