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

iPh*_*per 6 c smalltalk objective-c

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

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

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

Tom*_*mmy 6

Smalltalk是一种非常紧凑的语言,仍然是最纯粹的面向对象语言之一.Objective-C是Smalltalk和C之间的务实折衷,它产生了一些非常大的差异.例如,在Smalltalk中,一切都是一个对象 - 甚至是简单的数字 - 并且对象的每个操作都是通过消息发送.无论名称如何,都以相同的顺序评估消息.例如以下内容:

8 + 9 / 23 + 16 * 8
Run Code Online (Sandbox Code Playgroud)

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

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的引用是为了比较.

  • 那是绝对错误的.要编写好的Objective C,您需要良好的Smalltalk和一点c (2认同)
  • 要编写好的Objective-C,您只需要学习好的Objective-C.我想我们所说的只是两个前兆,唯一需要的是C.如果你能写出好的Objective-C就可以编写C,你不一定能写Smalltalk. (2认同)

Ste*_*ont 5

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

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