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