Objective-C编程:学习C和/或Smalltalk会有帮助吗?

时间:2010-11-30 15:17:32

标签: objective-c c smalltalk

Objective-C是一种面向对象的编程语言,它将Smalltalk样式的消息传递添加到C编程语言中。我理解学习Smalltalk可能与学习Lisp对一个人的知识有益的方式相同,但我想知道学习Smalltalk特定的概念是否会帮助我更完整地理解Objective-C,因为Smalltalk在其“origin”中的作用故事”。如果是这样,具体是什么?

假设一个人已经知道C编程,我们可以从Smalltalk学到什么?显然,Objective-C中的很多概念都不在C语言中(即消息传递,接口,协议,动态类型,委托,反射;它是面向对象的!)但是派生自Smalltalk。

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

7 个答案:

答案 0 :(得分: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的引用是为了比较。

答案 1 :(得分:5)

从Smalltalk你可以学习真正面向对象的编程。像java,c#和Delphi这样的混合体似乎没那么好。经过十年的杂交,我的编码风格在Smalltalk几个月后得到了显着改善。

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

答案 2 :(得分:3)

我不得不同意Knodel的一个例子,看看这个

[someObject message] 并看到

someObject消息。

你看到Objective-C使用相同的“定位”,是的,它来自Smalltalk。 学习Smalltalk总是很好的时间投入。并且这个区域的含义是100%smalltalk将一些消息发送到一个Object或一个本身有一些MetaClass的类。

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

是的,你最好知道C和Smalltalk能够充分利用Objective-C。

答案 3 :(得分:2)

免责声明:我不知道Smalltalk。

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

答案 4 :(得分:2)

是的,Objective-C的Objective部分与Smalltalk非常相似。如果您首先学习Smalltalk,Objective-C的一些概念将更容易,并且发送消息的语法将不那么令人震惊。但是,我不认为Smalltalk比Objective-C更容易学习,当然,如果你已经知道C,那么你也不会这样,所以你不妨直接学习Objective-C。

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

在没有SmallTalk背景的情况下,习惯于将消息传递给对象而不是调用方法非常容易。但是,SmallTalk看起来不像C(SuperCollider变体除外),语言甚至将代码块和其他疯狂的东西视为第一类对象:例如在SuperCollider中{i < 5}.while({ // do stuff })这种行为并未转移到Objective-C上,可能只会让你感到困惑。