为什么Objective-C没有命名空间?

12
为什么Objective-C没有命名空间?它似乎是一个简单的功能,可以使一些类名更易读(例如AVMutableVideoCompositionLayerInstruction),并且去掉类名前缀中无意义的字母。这主要是因为向后兼容吗?实现命名空间比看起来更困难吗?

就我个人而言,我不会比起NSArray更喜欢NeXTSTEP::Array。虽然有些人可能觉得前缀很傻,但我认为名称中不包含任何符号字符的事实很好地融入了Objective-C语法中句子的结构。 - w-m
@w.m:但是你应该将其读作“Nextstep数组”,而不是“Nextstep冒号冒号数组”,就像你读取objectAtIndex: i一样,读作“索引为i的对象”,而不是“索引为冒号i的对象”。就NS-类而言,这一点无关紧要。如果将它们移动到新的命名空间,所有现有的Cocoa软件都将被破坏。 - JeremyP
2
此外,您不需要每次都将其引用为 Nextstep::Array,只需使用 using Nextstep; 一次,然后将其引用为 Array除非存在歧义,然后您需要完全解决它。这实际上会使代码更清晰、更易读。 - devios1
2
为什么要使用NextStep,而不是只用NS作为命名空间?使用NS; 然后只需使用Array和MutableArray看起来很好。为了向后兼容,编译器可以将命名空间转换为前缀。 - Amogh Talpallikar
1
顺便说一句,在回想起来,原因可能很明显:Swift。 - zoul
2个回答

11

我不知道答案,但我怀疑“比看起来更难”可能就是答案。你需要在编译器和链接器中引入支持,以一种不破坏现有软件的方式进行。显然,这是可能的(C ++已经做到了),但工具链团队肯定有更高的优先事项。例如,在最近的过去,我们已经出现了垃圾收集、GCD、块和Objective-C 2.0,所以我们不能说他们什么都没做。

命名空间支持是我非常希望引入到Objective-C中的东西。


4
我不知道你是否想知道是否有官方决定。但是像许多其他功能一样,命名空间是一种选择,是语言贡献者做出的选择。PHP最近才引入了Namespace,例如Java使用类似命名空间的包或Python使用模块。
我认为命名空间实现上存在开销,主要是因为Objective-C是动态类型的,因此在运行时必须进行一些检查来解析命名空间、解析默认行为等等。我可以想象,因为Objective-C也用于嵌入式环境(即iPhone),速度非常重要。
你需要在我的所有说法中加上一个大的IMHO ;D
更新:
我发现这个非常有趣的讨论http://clang-developers.42468.n3.nabble.com/Adding-namespaces-to-Objective-C-td1870848.html#a1872744在clang开发者网站上,解释了为什么在Obj-C中实现命名空间绝对是非常棘手的。

5
我认为,只要为类名提供命名空间支持就足够了。这些类名将以某种方式进行名称混淆,以便在运行时几乎没有开销。 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接