gpt4 book ai didi

objective-c - 命名以可预测顺序存储键的字典结构?

转载 作者:太空狗 更新时间:2023-10-30 03:26:04 24 4
gpt4 key购买 nike

Note: Although my particular context is Objective-C, my question actually transcends programming language choice. Also, I tagged it as "subjective" since someone is bound to complain otherwise, but I personally think it's almost entirely objective. Also, I'm aware of this related SO question, but since this was a bigger issue, I thought it better to make this a separate question. Please don't criticize the question without reading and understanding it fully. Thanks!

我们大多数人都熟悉 dictionary abstract data type存储键值关联,我们是否将其称为映射、字典、关联数组、哈希等,具体取决于我们选择的语言。字典的简单定义可以概括为三个属性:

  1. 通过键访问值(而不是通过索引,如数组)。
  2. 每个键都与一个值相关联。
  3. 每个 key 都必须是唯一的。

任何其他属性都可以说是为了特定目的的便利或专门化。例如,某些语言(尤其是脚本语言,如 PHP 和 Python)模糊了字典和数组之间的界限,并为字典提供了排序。尽管这很有用,但这样的添加并不是字典的基本特征。从纯粹的意义上讲,字典的实际实现细节是无关紧要的。

对于我的问题,最重要的观察是未定义键的枚举顺序 — 字典可以按照它认为最方便的任何顺序提供键,这取决于客户根据需要组织它们。

我已经 created custom dictionaries强加特定的键顺序,包括自然排序顺序(基于对象比较)和插入顺序。很明显,将前者命名为 SortedDictionary 上的一些变体(我实际上已经实现了),但后者问题更大。我看过LinkedHashMapLinkedMap (Java),OrderedDictionary (.NET), OrderedDictionary (闪光灯),OrderedDict (Python)和 OrderedDictionary ( Objective-C )。其中一些更成熟,一些更符合概念验证。

LinkedHashMap 是根据 Java 集合传统中的实现命名的——“链接”是因为它使用双向链表来跟踪插入顺序,而“散列”是因为它是 HashMap 的子类。除了用户不需要担心这一点之外,类名甚至没有真正表明它的作用。使用 ordered 似乎是现有代码之间的共识,但是关于这个主题的网络搜索也揭示了“ordered”和“sorted”之间可以理解的混淆,我也有同感。 .NET 实现甚至对明显的用词不当有评论,并建议它应该改为“IndexedDictionary”,因为您可以在顺序中的特定点检索和插入对象。

我正在设计一个框架和 API,我想尽可能智能地命名类。从我的角度来看,indexed 可能会起作用(取决于人们如何解释它,并基于字典的广告功能),ordered 是不精确的并且有太多的潜力困惑,链接“马上就出来了”(向 Monty Python 道歉)。 ;-)

作为用户,什么名称对您来说最有意义?是否有一个特定的名称可以准确说明该类的作用? (如果合适的话,我不反对使用稍长的名称,例如 InsertionOrderDictionary。)

编辑:另一个很强的可能性(在我下面的回答中讨论)是IndexedDictionary。我不太喜欢“插入顺序”,因为如果您允许用户在特定索引处插入键、对键重新排序等,它就没有意义。

最佳答案

我投票给 OrderedDictionary,原因如下:

"Indexed"从不在 Cocoa 类中使用,除了在一个实例中。它总是作为名词出现(NSIndexSet、NSIndexPath、objectAtIndex: 等)。 “Index”作为动词出现只有一种情况,即 NSPropertyDescription 的“indexed”属性:isIndexed 和 setIndexed。 NSPropertyDescription 大致类似于数据库中的表列,其中“索引”指的是优化以加快搜索时间。因此,当 NSPropertyDescription 成为核心数据框架的一部分时,“isIndexed”和“setIndexed”将等同于 SQL 数据库中的索引。因此,将其称为“IndexedDictionary”似乎是多余的,因为创建数据库中的索引是为了加快查找时间,但字典已经 的查找时间为 O(1)。但是,将其称为“IndexDictionary”也是用词不当,因为 Cocoa 中的“索引”指的是位置,而不是顺序。两者在语义上是不同的。

我理解您对“OrderedDictionary”的担忧,但在 Cocoa 中已经有了先例。当用户想要维护一个特定的序列时,他们使用“有序”:-[NSApplication orderedDocuments]、-[NSWindow orderedIndex]、-[NSApplication orderedWindows] 等。因此,John Pirie 的想法基本上是正确的。

但是,您不想让插入字典成为用户的负担。他们希望创建字典一次,然后让它保持适当的顺序。他们甚至不想按特定顺序请求对象。订单规范应在初始化期间完成。

因此,我建议将 OrderedDictonary 设为一个类簇,其中包含 InsertionOrderDictionary 和 NaturalOrderDictionary 以及 CustomOrderDictionary 的私有(private)子类。然后,用户只需像这样创建一个 OrderedDictionary:

OrderedDictionary * dict = [[OrderedDictionary alloc] initWithOrder:kInsertionOrder];
//or kNaturalOrder, etc

对于 CustomOrderDictionary,您可以让他们给您一个比较选择器,甚至(如果他们运行 10.6)一个 block 。我认为这将为 future 的扩展提供最大的灵 active ,同时仍保持适当的名称。

关于objective-c - 命名以可预测顺序存储键的字典结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1022269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com