注意:虽然我的特定上下文是 Objective-C,但我的问题实际上超越了编程语言的选择。此外,我将其标记为“主观”,因为否则肯定有人会抱怨,但我个人认为这几乎完全是客观的。另外,我知道这个相关的 SO question,但由于这是一个更大的问题,我认为最好将其作为一个单独的问题。请不要在没有完全阅读和理解的情况下批评这个问题。谢谢!
我们大多数人都熟悉存储键值关联的字典抽象数据类型,根据我们选择的语言,我们是否将其称为映射、字典、关联数组、哈希等。字典的简单定义可以概括为三个属性:
- 通过键访问值(而不是通过索引,如数组)。
- 每个键都与一个值相关联。
- 每个键必须是唯一的。
任何其他属性都可以说是针对特定目的的便利或专业化。例如,某些语言(尤其是 PHP 和 Python 等脚本语言)模糊了字典和数组之间的界限,并且确实为字典提供了排序。尽管这很有用,但这样的添加并不是字典的基本特征。在纯粹意义上,字典的实际实现细节是无关紧要的。
对于我的问题,最重要的观察是未定义枚举键的顺序- 字典可以以它认为最方便的任何顺序提供键,并且由客户根据需要组织它们。
我创建了强制特定键排序的自定义字典,包括自然排序顺序(基于对象比较)和插入顺序。很明显,将前者命名为SortedDictionary上的某个变体(我实际上已经实现了),但后者的问题更大。我见过LinkedHashMap和LinkedMap (Java)、OrderedDictionary (.NET)、OrderedDictionary (Flash)、OrderedDict (Python) 和OrderedDictionary (Objective-C)。其中一些更成熟,一些更概念验证。
LinkedHashMap是根据 Java 集合传统中的实现来命名的——“linked”是因为它使用双向链表来跟踪插入顺序,而“hash”是因为它是 HashMap 的子类。除了用户不需要担心这一点之外,类名甚至没有真正表明它的作用。使用有序似乎是现有代码之间的共识,但关于这个主题的网络搜索也揭示了“有序”和“排序”之间的可以理解的混淆,我也有同感。.NET 实现甚至对明显的误称有评论,并建议它应该改为“IndexedDictionary”,因为您可以在排序的特定点检索和插入对象。
我正在设计一个框架和 API,我想尽可能智能地命名这个类。从我的角度来看,索引可能会起作用(取决于人们如何解释它,并基于字典的广告功能),排序不精确并且有太多混淆的可能性,并且链接“是正确的”(向 Monty Python 道歉)。;-)
作为用户,什么名称对您来说最有意义?是否有一个特定的名称可以准确地说明该类的功能?(如果合适的话,我不反对使用稍长一些的名称,例如 InsertionOrderDictionary。)
编辑:另一个很大的可能性(在我下面的回答中讨论)是IndexedDictionary。我不太喜欢“插入顺序”,因为如果您允许用户在特定索引处插入键、重新排序键等,这没有任何意义。