注:私の特定のコンテキストはObjective-Cですが、私の質問は実際にはプログラミング言語の選択を超えています。また、誰かが文句を言うので「主観的」とタグ付けしましたが、個人的にはほぼ完全に客観的だと思います。また、この関連するSOの質問を知っていますが、これはより大きな問題だったので、これを別の質問にする方がよいと思いました。よく読んで理解せずに質問を批判しないでください。ありがとう!
私たちのほとんどは、選択した言語に応じて、キーと値の関連付けを格納する辞書の抽象データ型に精通しています。これをマップ、辞書、連想配列、ハッシュなどと呼びます。辞書の簡単な定義は、次の3つのプロパティで要約できます。
- 値はキーによってアクセスされます(配列のようなインデックスではなく)。
- 各キーは値に関連付けられています。
- 各キーは一意である必要があります。
その他のプロパティは、間違いなく、特定の目的のための便利さまたは専門分野です。たとえば、一部の言語(特に、PHPやPythonなどのスクリプト言語)は、辞書と配列の間の境界線を曖昧にし、辞書の順序を提供します。これは便利ですが、そのような追加は辞書の基本的な特性ではありません。純粋な意味では、辞書の実際の実装の詳細は関係ありません。
私の質問では、最も重要な観察事項は、キーが列挙される順序が定義されていないことです。辞書は、最も便利な順序でキーを提供する場合があり、必要に応じてキーを整理するのはクライアントの責任です。
自然にソートされた順序(オブジェクトの比較に基づく)や挿入順序など、特定のキーの順序を課すカスタム辞書を作成しました。前者にSortedDictionaryのいくつかのバリアント(実際にはすでに実装済み)という名前を付けるのは明らかですが、後者の方が問題があります。LinkedHashMapとLinkedMap(Java)、OrderedDictionary(.NET)、OrderedDictionary(Flash)、OrderedDict(Python)、およびOrderedDictionary ( Objective-C)を見てきました。これらのいくつかはより成熟しており、いくつかはより概念実証です。
LinkedHashMapは、Javaコレクションの従来の実装に従って名前が付けられています。二重リンクリストを使用して挿入順序を追跡するため「リンク」、HashMapをサブクラス化するため「ハッシュ」です。ユーザーがそれについて心配する必要がないという事実に加えて、クラス名は実際にはそれが何をするかを示していません。順序付きを使用することは既存のコード間のコンセンサスのように見えますが、このトピックに関するWeb検索でも、「順序付き」と「並べ替え」の間の理解できる混乱が明らかになり、同じように感じます。.NET実装には、明らかな誤称についてのコメントもあり、順序付けの特定のポイントでオブジェクトを取得および挿入できるため、代わりに「IndexedDictionary」にする必要があることを示唆しています。
フレームワークとAPIを設計していて、クラスにできるだけインテリジェントな名前を付けたいと思っています。私の見解では、インデックス付けはおそらく機能し(人々がそれをどのように解釈するかによって、また辞書の宣伝された機能に基づいて)、順序付けは不正確であり、混乱する可能性が非常に高く、 「すぐに」リンクされます(Monty Pythonに謝罪します) )。;-)
ユーザーとして、あなたにとって最も意味のある名前は何ですか?クラスが何をしているのかを正確に表す特定の名前はありますか?(必要に応じて、InsertionOrderDictionaryのような少し長い名前を使用することを嫌いではありません。)
編集:もう1つの強力な可能性(以下の私の回答で説明)はIndexedDictionaryです。ユーザーが特定のインデックスにキーを挿入したり、キーを並べ替えたりすることを許可しても意味がないため、「挿入順序」はあまり好きではありません。