我们现在有属性的"点"符号.我见过各种回和的Forth约点符号主场迎战消息表示法的优点.为了保持反应不受重视,我不会在问题中以任何方式回应.
您对点符号与财产访问的消息符号有何看法?
请尽量将它集中在Objective-C上 - 我提出的一个偏见是Objective-C是Objective-C,所以你喜欢它就像Java或JavaScript一样无效.
有效的评论与技术问题(操作顺序,演员优先,表演等),清晰度(结构与对象性质,赞成和反对!),简洁等有关.
请注意,我是一个严格的质量和可读性的学校,在代码约定和质量至关重要的大型项目上工作(写入曾经读过一千次范例).
不要使用dot作为行为.使用点来访问或设置类似属性的属性,通常是声明为属性的属性.
x = foo.name; // good foo.age = 42; // good y = x.retain; // bad k.release; // compiler should warn, but some don't. Oops. v.lockFocusIfCanDraw; /// ooh... no. bad bad bad
对于刚接触Objective-C的人,我建议不要使用dot作为声明为@property的东西.一旦你对语言有了感觉,那就做对了.
例如,我发现以下内容非常自然:
k = anArray.count; for (NSView *v in myView.subviews) { ... };
您可以预期,clang静态分析器将增强允许您检查点仅用于某些模式或不用于某些其他模式的能力.
首先让我说我开始使用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
是对象,则绝对没有歧义.歧义的引入是我的牛肉#1.
牛肉#2:在C中,点语法用于访问结构的成员,而不是调用方法.程序员可以覆盖setFoo:
和foo
一个对象的方法,但仍然通过访问它们something.foo
.在我看来,当我使用点语法看到表达式时,我希望它们能够简单地分配到ivar中. 这并非总是如此. 考虑一个控制器对象,它调解一个数组和一个tableview.如果我打电话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 )
我是一个新的Cocoa/Objective-C开发人员,我的看法是:
我坚持使用消息符号,即使我从Obj-C 2.0开始,尽管点符号更为熟悉(Java是我的第一语言).我的理由很简单:我仍然不明白为什么他们在语言中添加了点符号.对我来说,这似乎是一种不必要的"不纯"的补充.虽然如果有人能解释它对语言的好处,我会很高兴听到它.
但是,我认为这是一种风格选择,我不认为有正确或错误的方式,只要它是一致的和可读的,就像任何其他风格选择一样(比如把你的开口花括号放在同一行上)方法标题或下一行).
Objective-C点表示法是一种语法糖,它被转换为正常的消息传递,所以在引擎盖下没有任何改变,并且在运行时没有任何区别.点符号绝对不比消息传递快.
在这之后需要一些序言,这是我看到的利弊:
利弊
可读性:点符号比嵌套括号按摩传递更容易阅读
它简化了与属性和属性的交互:使用点符号表示属性,使用消息符号表示方法,可以在synthax级别实现状态和行为的分离
可以使用复合赋值运算符(1).
使用@property
和点符号编译器为您做了很多工作,它可以在获取和设置属性时生成良好的内存管理代码; 这就是苹果公司自己的官方指南建议点符号的原因.
缺点
只允许访问声明的点表示法 @property
由于Objective-C是一个高于标准C(语言扩展)的层,因此点符号并不能确定所访问的实体是对象还是结构.通常,它看起来像是在访问结构的属性.
使用点符号调用方法会丢失命名参数的可读性优势
当混合消息符号和点符号看起来像是用两种不同的语言编码时
(1)复合运算符使用代码示例:
//Use of compound operator on a property of an object anObject.var += 1; //This is not possible with standard message notation [anObject setVar:[anObject var] + 1];
使用与语言本身一致的语言风格是最好的建议.但是,这不是在OO系统中编写功能代码的情况(反之亦然),点符号是Objective-C 2.0中语法的一部分.
任何系统都可能被滥用.所有基于C语言的预处理器的存在足以做出非常奇怪的事情; 只要看看混淆后的Ç大赛,如果你需要看它到底是如何怪异得到.这是否意味着预处理器自动坏了,你永远不应该使用它?
使用点语法访问已在界面中定义的属性,可能会被滥用.潜在滥用的存在不一定是反对它的论据.
财产访问可能有副作用.这与用于获取该属性的语法正交.CoreData,委托,动态属性(first + last = full)都必须完成一些工作.但这会使"实例变量"与对象的"属性"混淆.没有理由为什么属性必须按原样存储,特别是如果它们可以被计算(例如,字符串的长度).因此,无论您使用foo.fullName还是[foo fullName],仍然会进行动态评估.
最后,属性的行为(当用作左值时)由对象本身定义,例如是否采用副本或是否保留副本.这使得以后更容易更改行为 - 在属性定义本身 - 而不是必须重新实现方法.这增加了方法的灵活性,从而导致发生较少(实现)错误的可能性.仍然有可能选择错误的方法(即复制而不是保留),但这是一个架构而不是实现问题.
归根结底,它归结为'它看起来像一个结构'问题.到目前为止,这可能是辩论的主要区别; 如果你有一个结构,它的工作方式与你有一个对象的方式不同.但这一直是真的; 你不能发送一个结构消息,你需要知道它是基于堆栈还是基于reference/malloc.已有的心理模型在使用方面有所不同([[CGRect alloc] init]或struct CGRect?).他们从未在行为方面统一; 你需要知道在每种情况下你正在处理什么.为对象添加属性表示不太可能混淆任何知道其数据类型的程序员; 如果他们不这样做,他们就会遇到更大的问题.
至于一致性; (目标 - )C本身不一致.=基于源代码中的词法位置,用于赋值和相等.*用于指针和乘法.BOOL是字符,而不是字节(或其他整数值),尽管是和NO分别为1和0.一致性或纯度不是语言的设计目标; 这是关于完成任务.
因此,如果您不想使用它,请不要使用它.以不同的方式完成它.如果你想使用它,并且你理解它,那么如果你使用它就没问题.其他语言处理通用数据结构(映射/结构)和对象类型(具有属性)的概念,通常使用相同的语法,尽管事实上一个只是一个数据结构而另一个是一个富对象.Objective-C中的程序员应该具有相同的能力来处理所有类型的编程,即使它不是您喜欢的编程.
我用它来做属性因为
for ( Person *person in group.people){ ... }
比阅读更容易阅读
for ( Person *person in [group people]){ ... }
在第二种情况下,通过将您的大脑置于消息发送模式来中断可读性,而在第一种情况下,很明显您正在访问组对象的people属性.
我也会在修改集合时使用它,例如:
[group.people addObject:another_person];
比...更具可读性
[[group people] addObject:another_person];
在这种情况下的重点应该是将对象添加到数组而不是链接两个消息.
我大部分都是在Objective-C 2.0时代长大的,我更喜欢点符号.对我来说,它允许简化代码,而不是使用额外的括号,我可以使用一个点.
我也喜欢点语法,因为它让我真的觉得我正在访问对象的属性,而不是只是发送一条消息(当然,点语法确实转化为消息发送,但为了出现,点感觉不同).不是用旧语法"调用getter",而是真的感觉我直接从对象中获得了一些有用的东西.
关于这一点的一些争论涉及"但我们已经有点语法,而且它是为了structs
!".这是真的.但(又一次,这只是心理上的)它对我来说基本上是一样的.使用访问点的语法的对象的属性的感觉一样访问一个结构,这或多或少是预期的效果(在我的意见)的成员.
****编辑:正如bbum指出的那样,你也可以使用点语法来调用对象上的任何方法(我没有意识到这一点).所以我会说我对dot-syntax的看法只是为了处理对象的属性,而不是每天发送消息**