首先让我说我开始使用 Visual/Real Basic 进行编程,然后转向 Java,所以我相当习惯于点语法。然而,当我终于转向 Objective-C 并习惯了括号,然后看到 Objective-C 2.0 的介绍和它的点语法时,我意识到我真的不喜欢它。 (对于其他语言来说这很好,因为它们就是这样滚动的)。
我在 Objective-C 中有三个主要的点语法问题:
Beef #1: 这让您不清楚为什么会出错。例如,如果我有以下行:
something.frame.origin.x = 42;
然后我会得到一个编译器错误,因为something 是一个对象,你不能使用对象的结构作为表达式的左值。但是,如果我有:
something.frame.origin.x = 42;
然后编译就好了,因为something 本身就是一个结构,它有一个 NSRect 成员,我可以将它用作左值。
如果我采用此代码,我需要花一些时间来弄清楚something 是什么。它是一个结构吗?它是一个对象吗?但是,当我们使用括号语法时,它会更清晰:
[something setFrame:newFrame];
在这种情况下,something 是否是一个对象绝对没有歧义。引入歧义是我的第一个问题。
Beef #2: 在 C 中,点语法用于访问结构的成员,而不是调用方法。程序员可以覆盖对象的setFoo: 和foo 方法,但仍然可以通过something.foo 访问它们。在我看来,当我看到使用点语法的表达式时,我希望它们是对 ivar 的简单赋值。 情况并非总是如此。考虑一个调节数组和表格视图的控制器对象。如果我打电话给myController.contentArray = newArray;,我希望它会用新数组替换旧数组。然而,最初的程序员可能已经覆盖了setContentArray:,不仅设置了数组,还重新加载了tableview。从这条线上,没有迹象表明这种行为。如果我看到[myController setContentArray:newArray];,我会想“啊哈,一个方法。我需要去看看这个方法的定义,以确保我知道它在做什么。”
所以我认为我对 Beef #2 的总结是你可以用自定义代码覆盖点语法的含义。
3 号牛肉:我认为它看起来很糟糕。作为一名 Objective-C 程序员,我完全习惯于使用括号语法,所以阅读并看到一行一行漂亮的括号,然后突然被foo.name = newName; foo.size = newSize; 等打破,这让我有点分心。我意识到有些东西需要点语法(C 结构),但这是我唯一一次使用它们。
当然,如果您是为自己编写代码,那么请使用您喜欢的任何内容。但是,如果您正在编写计划开源的代码,或者您正在编写一些您不希望永远维护的东西,那么我强烈建议您使用括号语法。当然,这只是我的看法。
最近针对点语法的博文:http://weblog.bignerdranch.com/?p=83
对上述帖子的反驳:http://eschatologist.net/blog/?p=226(原文章支持点语法:http://eschatologist.net/blog/?p=160)