Примечание. Хотя мой конкретный контекст Objective-C, мой вопрос фактически выходит за рамки выбора языка программирования. Кроме того, я отметил его как "субъективный", так как кто-то обязан жаловаться иначе, но я лично считаю его почти полностью объективным. Кроме того, я знаю этот связанный вопрос SO, но поскольку это была большая проблема, я подумал, что лучше сделать это отдельным вопросом. Пожалуйста, не критикуйте вопрос, не читая и не понимая его полностью. Спасибо!
Большинство из нас знакомо с словарь абстрактный тип данных, в котором хранятся ассоциации ключевых значений, независимо от того, назовите это картой, словарем, ассоциативным массивом, хешем и т.д. в зависимости от нашего выбора. Простое определение словаря можно суммировать тремя свойствами:
- Доступ к значениям осуществляется с помощью ключа (в отличие от индекса, например массива).
- Каждая клавиша связана со значением.
- Каждый ключ должен быть уникальным.
Любые другие свойства, возможно, являются удобствами или специализациями для определенной цели. Например, некоторые языки (особенно языки сценариев, такие как PHP и Python) размывают линию между словарями и массивами и обеспечивают упорядочение словарей. Насколько это возможно, такие дополнения не являются фундаментальными характеристиками словаря. В чистом смысле фактические детали реализации словаря не имеют значения.
По моему вопросу, самое важное наблюдение заключается в том, что порядок перечисления ключей не определен. Словарь может предоставлять ключи в любом удобном для него порядке, и это зависит от того, чтобы организовать их по желанию.
Я создал пользовательские словари, которые налагают определенные порядки клавиш, в том числе упорядоченные по естественному порядку (на основе сравнения объектов) и порядок вставки. Очевидно, чтобы назвать прежний вариант на SortedDictionary (который я уже реализовал), но последний более проблематичен. Я видел LinkedHashMap и LinkedMap (Java), OrderedDictionary (.NET), OrderedDictionary (Flash), OrderedDict (Python) и OrderedDictionary (Objective-C). Некоторые из них более зрелые, некоторые из них более доказательны.
LinkedHashMap назван в соответствии с реализацией традиций коллекций Java - "связан", потому что он использует дважды связанный список для отслеживания порядка вставки и "хэш", потому что он подклассифицирует HashMap. Помимо того, что пользователю не нужно беспокоиться об этом, имя класса на самом деле даже не указывает, что он делает. Использование упорядоченного похоже на консенсус между существующим кодом, но веб-поиск по этой теме также выявил понятную путаницу между "упорядоченными" и "отсортированными", и я чувствую то же самое. В реализации .NET даже есть комментарий о кажущемся неправильном значении, и предполагается, что вместо этого он должен быть "IndexedDictionary" из-за того, что вы можете извлекать и вставлять объекты в определенную точку в упорядочении.
Я разрабатываю фреймворк и API, и я хочу назвать класс максимально разумным. С моей точки зрения, индексированный, вероятно, будет работать (в зависимости от того, как люди его интерпретируют и на основе рекламируемой функциональности словаря) упорядоченный является неточным и имеет слишком большой потенциал для путаница и связанный "(извинитесь за Monty Python).; -)
Как пользователь, какое имя будет иметь для вас наибольший смысл? Есть ли конкретное имя, которое точно говорит о том, что делает класс? (Я не прочь использовать несколько более длинные имена, такие как InsertionOrderDictionary, если это необходимо.)
Изменить: Еще одна сильная возможность (обсуждаемая в моем ответе ниже) - IndexedDictionary. Мне не очень нравится "порядок вставки", потому что это не имеет смысла, если вы разрешаете пользователю вставлять ключи по определенному индексу, изменять порядок ключей и т.д.