首先,我要说的是我开始使用Visual / Real Basic进行编程,然后又转向Java,因此相当习惯于点语法。但是,当我最终转向Objective-C并习惯了方括号,然后看到了Objective-C 2.0的引入及其点语法时,我意识到我真的不喜欢它。(对于其他语言,这很好,因为这就是它们的用法)。
在Objective-C中,我有三种主要的带有点语法的内容:
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 )