Qui*_*lor 10 api-design objective-c naming-conventions chdatastructures data-structures
注意:虽然我的特定上下文是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.我真的不喜欢"插入顺序",因为如果允许用户在特定索引处插入键,重新排序键等,则没有意义.
我投票给OrderedDictionary,原因如下:
除了在一个实例中,"索引"从未在Cocoa类中使用.它总是显示为名词(NSIndexSet,NSIndexPath,objectAtIndex:等)."Index"作为动词出现时只有一个实例,它位于NSPropertyDescription的"索引"属性上:isIndexed和setIndexed.NSPropertyDescription大致类似于数据库中的表列,其中"索引"是指优化以加快搜索时间.因此,如果NSPropertyDescription是Core Data框架的一部分,那么"isIndexed"和"setIndexed"将等同于SQL数据库中的索引.因此,将其称为"IndexedDictionary"似乎是多余的,因为数据库中的索引是为了加快查找时间而创建的,但是字典已经具有O(1)查找时间.然而,称它为"IndexDictionary"也是一个用词不当,因为Cocoa中的"索引"指的是位置,而不是订单.这两者在语义上是不同的.
我理解你对"OrderedDictionary"的关注,但先例已经在Cocoa中设置了.当用户希望保持一个特定的顺序,他们使用 "命令": - [的NSApplication orderedDocuments] - [NSWindow orderedIndex] - [的NSApplication orderedWindows]等,所以,约翰·皮里大多正确的想法.
但是,您不希望将插入字典作为用户的负担.他们会想创建一个字典一次,然后让它保持适当的顺序.他们甚至不想按特定顺序请求对象.订单规范应在初始化期间完成.
因此,我建议使OrderedDictonary成为一个类集群,具有InsertionOrderDictionary和NaturalOrderDictionary以及CustomOrderDictionary的私有子类.然后,用户只需创建一个OrderedDictionary,如下所示:
OrderedDictionary * dict = [[OrderedDictionary alloc] initWithOrder:kInsertionOrder];
//or kNaturalOrder, etc
Run Code Online (Sandbox Code Playgroud)
对于CustomOrderDictionary,您可以让它们为您提供比较选择器,甚至(如果它们运行10.6)块.我认为这将为未来扩展提供最大的灵活性,同时仍保持适当的名称.