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