[译] Objective-C 中的点符号一定是恶魔吗?

消息的点符号不仅仅是 Objective-C 代码的味道。我告诉你,它是恶魔😈!

更新:我最近改变了主意!请参阅我的文章《我接受的点符号...》

......是的,这是夸张的说法。在有点符号的项目中,我确实能与点符号共存。但我不会自己写。以下是我避免在代码中使用点符号的三个原因:

1、点符号混淆了对象和结构体

告诉我,下面的代码是做什么用的?

foo.bar = 10;

在 C 语言中,这段代码的作用显而易见:foo 要么是一个结构体,要么是一个联合体。它在给 foobar 字段赋值 10

在引擎盖下,编译器会编写代码来计算 foo 的内存偏移量,然后将值 10 写入计算出的地址处的存储空间。速度非常快,而且非常轻便。

Objective-C 是 C 语言的严格超集,因此所有这些也适用于 Objective-C 代码。或者不适用。......你说不清楚,对吧?

2、点符号掩盖了消息传递

因为点符号是消息传递的语法糖,所以你可以写出这样的代码:

NSMutableArray *a = NSMutableArray.array;

当然,这已经超出了恶魔的范畴。但为什么呢?"因为数组不是属性,而是方法"。哦,所以用括号还是用点取决于这个东西是不是属性?但不管用哪种方式,都是传递消息!为什么还要添加第二种消息传递语法呢?

在 Objective-C 中加入点符号,让人联想到苹果公司的某个人说:

Java is such a popular language. Our square brackets freak out Java programmers. Let’s replace brackets with dots; it’ll look just like Java which will increase adoption of Objective-C.
Java 是一种如此流行的语言。我们的方括号吓坏了 Java 程序员。让我们用点符号来取代方括号吧;这样看起来就像 Java 了,这样就能提高 Objective-C 的采用率。

但在接触 Objective-C 之前,我并不是一名 Java 开发人员。我是一名 C++ 开发人员。而且是用 C++(几乎是 C 的超集)。

foo.bar = 10;

foo 可以是一个类、一个结构体或一个联合体,但无论如何,这都是成员访问。

但是,对象如何访问自己的成员呢?在 C++ 中,您可以编写

this->qux = 10;

但更常见的做法是省略 this->,直接写成

qux = 10;

因为 qux 是一个具有类作用域的成员变量。

现在来看看 Objective-C。在点符号这个邪恶的新大陆上,你经常会看到这样的情况:

self.qux = 10;

其中 qux 是一个属性。一个典型的 Objective-C 新手错误就是说:"好吧,这个 self. 是多余的",然后把它改成这样:

qux = 10;

编译和运行都没有任何问题。那么,有什么值得大惊小怪的呢?

问题在于,在前一种情况下,我们是向 qux 方法发送信息。而在后一种情况下,我们是直接给 qux 实例变量赋值。这是两种截然不同的情况!对于标量,这可能无关紧要,但对于对象,尤其是在编写正确的内存管理时,这就大不相同了。

现在看看如果不使用点符号号会怎样:

[self setQux:10];

没有歧义。这显然是一条消息。

3、点符号助长了违反 "得墨忒耳定律(Law of Demeter) "的行为

你经常看到这样的代码吗?你多长时间写一次?

foo.bar.baz.qux = 10;

这有什么问题吗?让我重写一下,去掉 .,让信息更明确:

[[[foo bar] baz] setQux:10];

那些抱怨方括号符号 "看起来怪怪的 "的人,会举出这样的例子来说明方括号符号有多难读。

问题是,无法阅读是有原因的:它违反了 "德墨忒尔定律"。

如果你对 "德墨忒尔定律 "还不熟悉,它是指让物体之间过于熟悉,从而污染了物体之间的清晰界限。这里有一个快速记忆的方法:你可以挑你的朋友。你可以挖鼻子。但你不能挖你朋友的鼻子。

所有这些拼凑在一起的括号都是一个线索,表明你可能在不属于你的地方(你朋友的鼻子里)窥探。这是一种代码气味,表明责任可能放错了地方。但现在,圆点符号可以让你继续使用这种臭烘烘的违规行为,而且看起来还不错!

轮到你了!

由于我看到的几乎所有 Objective-C 代码都使用点符号,我意识到自己在逆流而行。好吧,除非你算上几个大腕,比如 Big Nerd Ranch 和 Cocoa Is My Girlfriend

问题: 同意吗?同意吗?不同意?您怎么看?请在下面留言。
但也请参阅我的后续文章《我接受的点符号...》

译自 Jon Reid 的 Is Dot Notation in Objective-C 100% Pure Evil?
侵删

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容