Super Art Studio

Recent site activity

中文首页‎ > ‎杂谈链接‎ > ‎

C VS Objective-C

posted ‎‎Jun 8, 2009 10:14 AM‎‎ by Leo - www.superarts.org -   [ updated ‎‎Jun 19, 2009 4:07 AM‎‎ ]
iPhone新手一个很常见的问题:从C学起,还是Obj-C?
http://www.cocoachina.com/bbs/read.php?tid-5109.html

我认为这包含了几个问题。

1、怎么学iPhone编程?

见仁见智,很多人都是文档派的(参见上面的帖子),我则是例子派的,主张从例子入手。编程不是理论工作,打根基重要性应当让位于经验积累,很多东西做了就明白。当然,这个取决于各人的学习方法和思维习惯,我的建议是,这种问题求人不如求己,自己知道自己的思维习惯先,然后两条路,查文档或找例子。

2、学Objc用不用学C?

我认为这是假命题!为什么?因为很多人讨论的,大部分说的都是都是“学objc用不用看C的书例如谭浩强的再版好几版的那本”,这个问题当然是不用看。为什么?因为Objc的书里已经包含C的知识了。iffor switch算C语音还是objc?我的看法是,C。objc也好,C++也好,都不是和C并行的东西,它们都是C的超集,它们的面向对象的实现(甚至包括C++中的引用)都是基于指针的──这个不难理解,C几乎可以作为和汇编的映射,是很面向底层的语言;设计CPU的人可不会考虑怎样搞笑实现面向对象的问题──所以没有流程控制、数据类型这些属于C的概念,何谈objc的学习。

3、为什么说 learning the entire C language before learning Objective-C is wrong

这个问题,既是语言的问题,也是设计方法的问题,重点在entire这个字上。“学objc之前学习整个的C是错误的”,原因是C的语言特性和设计方法是面向过程的,而objc是面向对象的。因此这个问题其实是:

3改、学习面向对象之前不必学习面向过程

包括fwish提到的那个作者,也包括很多C++、Java、C#的书的作者,基本都是这个观点。但是我的看法是,这个观点是有局限性的,它只适合有某种明确需要的人,比如学习java、c#为了上岗,学习objc为了iphone编程。对于这些人,我认为这个命题是正确的,那大段英文也说得很明白。因此,对在论坛提出LZ这类问题的人,这个命题也都是正确的。

但是,我要说一下问题的另外一面。即使你没有任何编程技术,但是如果你想成为一个“真正”的程序员,一个拥有快速学习能力的人──我始终认为,程序员的真正属性不是编程,而是根据自己的需要,不断学习新的编程技术──那么就不应该跳过“面向过程”这一步,即使它是“过时”的。为什么?第一,LS也都说了,objc也好c++也好,这些面向对象的东西,其实现都是基于C的面向过程的,有意愿理解一项技术背后的实现(比如objc的面向对象机制,为什么调用一个不存在的方法有时会是warning而不是error,为什么要错误在运行时才暴露出来,这难道不是很危险的吗),这种好奇心我认为是很重要的。第二,如果你的目的不是iphone这种特定的、眼前的东西,而是广泛的编程技术,那么你就要知道,在比桌面编程广泛得多的嵌入式领域(尽管iphone、android这类平台的引入,或多或少地模糊了桌面编程和嵌入式编程的区别),很多平台上根本就不存在g++这种C++的编译工具,很多SDK也是用C写成的。(一句说烂了的话,Linux的内核就是用C写的……你要把Linux移植到某个系统上,不可避免地会接触很多,很多行面向过程的代码。)第三,面向对象这种设计方法本身,就不适用于所有问题。以脚本语言而论,既有Python这种“一切皆对象”的语言,也有PHP这种带有浓重C残余意味的语音(面向对象特性在PHP4之后才加入,5中才做得有点面向对象的样子)──讨论OO的适用范围本身话题太大,而且再说下去我就要露出马脚了,暂且打住。但是总而言之,面向对象不是万能的,就像设计模式不是万能的一样,不然所有Java程序员月薪都得2万以上啦。