ハッシュテーブルまたはディクショナリキー名の保存場所
-
19-08-2019 - |
質問
ハッシュテーブル/ディクショナリを使用しているとき、キーの指定方法に苦労することがあります。
例:単純な辞書を作成する場合(この例ではPythonを使用)、
foo = {'bar': 'baz', 'foobar': 'foobaz' }
キー値(foo['bar']
)を使用して(他のモジュールの)値にアクセスし、baz
を取得できます。
エビル博士の言葉では、<!> quot;かなり標準的、本当に。<!> quot;
残念ながら、キーに静的な文字列を使用すると、この辞書を使用するモジュールとその実装が密に結合されます。もちろん、これは他のキータイプ(列挙型、オブジェクトなど)を使用する場合にも適用できます。とにかくそれをスライスすると、辞書にアクセスするすべてのモジュールはキーの値を知る必要があります。
これを解決するには、通常、キーに静的定数文字列値(または言語で使用可能な場合はEnum)を使用し、ローカルクラス/モジュールまたは別のモジュール/クラスにパブリックに保存します。したがって、辞書キー自体への変更はすべて1つの場所に保持されます。
通常、これは次のようになります。
BAR_KEY = 'bar'
foo[BAR_KEY] = 'foobar'
ディクショナリの使用が必ずしもモジュール/クラスをその実装に結合しないように、キーを指定するより良い方法がありますか?
注:SOでこれに対処するいくつかの応答を見ました(例: property-to-reference-a-key-value-pair-in-a-dictionary )、しかしトピックはそうではなかったこの問題に特に対処してください。回答は役に立ちましたが、より多くの経験が欲しいです。
解決
プロパティのみを含むクラスを作成しないのはなぜですか?これはPython(私が知っていることから)でうまく行われ、他の言語でもうまく機能します。名前のリファクタリングは、今日のツールでも簡単です。
他のヒント
オブジェクトを渡し、既知のキーを持っている場合、常にオブジェクトに属性を追加することを好みます。 IMO、辞書のユースケースは、キーが何なのかわからないときです。
Pythonは簡単です:
foo.bar=baz
Javaはほとんど同じです:
class Foo { public String bar="baz"; }
プロパティの検索は単なる辞書検索であり、Javaのパフォーマンスが向上するため、Pythonのパフォーマンスはほぼ同じです。
辞書キーを保持する別のクラスを作成することがあります。これにより、独自の名前空間が得られるだけでなく、キーをconst文字列に入れることによる通常の利点、つまり、タイプミスのリスクがなく、コード補完が得られ、文字列値を簡単に変更できます。別のクラスを作成したくない場合は、const文字列を持つことで名前空間を除いてすべての利点が得られます。
とはいえ、ソフトコーディングの領域に近づいていると思います。辞書のキーが変更された場合、辞書を使用するコードを変更しても問題ありません。
個人的に、私はあなたの方法を使用します。それはかなり賢明でシンプルで、実際の問題を解決します。
通常は同じことをします。キーが常に同じになる場合は、キーを保持する言語で「定数静的」を作成します。