6

Objective-C 是一种面向对象的编程语言,它在 C 编程语言中添加了 Smalltalk 风格的消息传递。我知道学习 Smalltalk 可能就像学习 Lisp 对一个人的知识一样好,但是我想知道学习 Smalltalk 特定的概念是否会帮助我更全面地理解 Objective-C,因为 Smalltalk 在其“起源”中的作用故事”。如果有,具体是什么?

假设已经了解 C 编程,我们可以从 Smalltalk 中学到什么?显然,Objective-C 中有很多概念是 C 中没有的(即消息传递、接口、协议、动态类型、委托、反射;它是面向对象的!),而是派生自 Smalltalk。

编辑:我在问题中添加了 C 编程语言,因为普遍的共识是学习 C 比学习 Smalltalk 更好地利用时间(当涉及到 Objective-C 编程时)。

4

7 回答 7

6

Smalltalk 是一种非常紧凑的语言,并且仍然是最纯粹的面向对象语言之一。Objective-C 是 Smalltalk 和 C 之间的一种务实的折衷,这带来了一些非常实质性的差异。例如,在 Smalltalk 中,一切都是对象——甚至是简单的数字——并且对对象的每次操作都是通过消息发送来实现的。消息以相同的顺序进行评估,而与它们的名称无关。因此,例如以下内容:

8 + 9 / 23 + 16 * 8

以严格的从左到右的顺序进行评估,因为运算符“+”、“/”和“*”对语言没有特殊含义,它们只是传递给数字对象的消息。

Objective-C 将 Smalltalk 风格的对象添加到 C 中,但也是 C 的严格超集,保留了 C 的原始类型和内置运算符。因此,在 Objective-C 中,正常的数学运算顺序将应用于上面的表达式——首先进行除法和乘法运算,然后进行加法运算。

学习 C 对于彻底理解 Objective-C 是绝对必要的。Objective-C 是 C 的严格超集,并且尽可能明确地使用完全相同的语法和语义。它将对象的概念移植到 C 上,因为 C 能够保留指向事物的指针,而无需知道如何对事物应用任何操作。然后,它扩展了 C 语法以提供一种将消息发布到对象以及声明和实现对象可能接收的消息的方法。

许多 Objective-C 运行时的一般设计,尤其是与 Cocoa 结合使用时,直接来自 Smalltalk,包括选择器的概念、使用元类作为类实例的工厂、继承的层次结构和系统、模型-视图-控制器(Smalltalk 原创,尽管现在几乎无处不在)的划分以及标准集合和对象上定义的许多消息。

在我的脑海中,Smalltalk 的流量控制系统也有很大不同,并且有一个相似但微妙不同的“块”概念(尽管大多数较新的实现已经使两者保持一致)。Apple 实际上已经实现了块作为 C 级别的扩展,Objective-C 对象上的许多新方法都使用了该扩展。

总而言之,Goldberg Smalltalk-80 这本书写得非常好,易于阅读,语言非常简单,您只需两三章就可以学习整个语言。大多数复杂性都被运行时中可用的对象所吞噬,显然这些东西不会转移。对您的好处是,关于对象和运行时的意识形态内容最终与印刷中的细节非常分离。相反,C 使诸如流控制和算术之类的东西成为一种语言特性,这意味着在您真正感觉到自己知道发生了什么之前,需要更多的语法和阅读内容。

所以,总而言之:Smalltalk-80 书(紫色的)绝对值得一读,非常有用,但不一定完全相关。在任何情况下,学习 C 都是必不可少的;我对 K&R 的引用是为了比较。

于 2010-11-30T17:58:30.117 回答
5

从 Smalltalk 你可以学习真正的面向对象编程。像 java、c# 和 Delphi 这样的混合体似乎做得不太好。经过十年的混合,我的编码风格在使用了 Smalltalk 几个月后有了显着改善。

作为 iPhone 开发人员,您可能对库的设计和使用的概念比对语法更感兴趣。c 在那里不会有任何帮助(尽管您需要了解一些基础知识)。用 Objective C 编程感觉更像用 Smalltalk 编程。Smalltalk IDE 远优于 Objective C 的 IDE,它可以帮助您更好地理解面向对象的代码是如何工作的,以及如何构建它。在 Smalltalk (IDE) 中保持代码整洁和良好重构比在任何其他面向对象语言中要容易得多。可可库设计得非常好,至少与 java 或 .net 库相比是这样。它们似乎比 Squeak Smalltalk 的形状要好一些。

于 2010-11-30T20:19:46.267 回答
3

我不得不不同意 Knodel 只是一个例子看到这个

[someObject 消息] 并查看

someObject 消息。

您会看到 Objective-C 使用相同的“定位”,是的,它来自 Smalltalk。学习 Smalltalk 始终是一项很好的时间投资。这方面的含义是 100% smalltalk 向本身具有某些 MetaClass 的 Object 或 Class 发送一些消息。

是的,学习 C 很适合知道如何使用 Objective-C 的一部分,但习惯 OO 不是 C 教的。所以了解 C 和 Smalltalk 可以更容易地使用 Objective-C。但是,Objective-C 不仅仅是“力量”来自类库的语言。所以花时间在上面肯定是很好的花时间。

是的,您最好了解 C 和 Smalltalk 以充分利用 Objective-C。

于 2010-11-30T15:41:26.030 回答
2

免责声明:我不知道 Smalltalk。

我相信你的 Obj-C 技能会从学习 Smalltalk 中受益,但在我看来,你的时间会花在学习 C 上要好得多。作为在钻研 C 之前学习 Obj-C 的人,从 Smalltalk 中获取的概念很容易理解拿起,从 C 中获取的概念要困难得多。

于 2010-11-30T15:30:17.063 回答
2

是的,Objective-C 的 Objective 部分与 Smalltalk 非常相似。如果你先学习 Smalltalk,Objective-C 的一些概念会更容易,发送消息的语法也不会那么令人震惊。但是,我不认为 Smalltalk 一定比 Objective-C 更容易学习,如果你已经了解 C,肯定不会,所以你不妨直接学习 Objective-C。

话虽如此,Smalltalk 是一种很好的语言 IMO,值得学习。

于 2010-11-30T15:43:10.323 回答
0

我认为学习Objective-C的最佳背景是C。如果您了解C,您将很容易熟悉面向对象的编程并用Objective-C编写。

就个人而言,我认为向我们学习 Smalltalk 并不是一个好主意。

于 2010-11-30T15:30:02.887 回答
0

如果没有 SmallTalk 背景,习惯于将消息传递给对象而不是调用方法非常容易。然而,SmallTalk 看起来一点也不像 C(除了 SuperCollider 变体),而且该语言甚至将代码块和其他疯狂的东西视为一流的对象:例如在 SuperCollider{i < 5}.while({ // do stuff })这种行为并没有出现在 Objective-C 中,并且很可能就像我一样迷惑你。

于 2010-11-30T15:35:55.423 回答