C 一年后我对它的看法

我在一年前因需要将RedPhone项目从Android移植到iOS而首次接触Objective-C。大约一个月前我负责的部分(后端:声音,网络,加密部分)已经完成。我们正等着外部的安全审查,同时在内部继续完成UI工作的过程中并未发现任何后端的bug(言外之意开发质量高)。在RedPhone最终发布后,我对于这次工作中哪些做错了,基于android和ios的代码都有哪些不同等等做了讨论。今天想探讨一下去年过程中关于Objective-C的一些体验。

一年前我从未接触过Objective-C.(一行代码也没看过)我是名C#开发。现在我认为自己是名中级Objective-C开发:

虽然还有很多知识上的漏洞但我在现在使用这门语言已算是得心应手。比如,大家都知道不能把nil赋给数组和其他的集合类型,但就在上周我还不知道可以直接插入NSNull来实现。当然了,我只是假设大家只是不会把nils赋给某个集合。(意味着大部分人也不知道这个workaround)

当我讨论语言时,我听起来会倾向于比较挑剔,所以请记住这篇文章不是指控Objective-C无法有效的处理问题。这篇文章是关于我使用Objective-C的经验,它和其他语言不同的地方,以及我遇到的问题。这是我的观点,因为编程领域充满了关于哪种语言更好的完全对立的观点(e.g. 动态 vs 静态类型编程语言),你可以相信,这仅仅是以一对多。一个相关的引用:

仅有两种语言:一种是大家抱怨的,另一种是没人使用的。 —— 概述

Object-C是C语言的超集,所以很自然的让我注意的第一件事是它哪里和C不同。基本上你在以Obj-C风格写代码时唯一做的类似C的事情(C-ish stuff)是使用头文件和使用前进行类型声明。

奇怪的是,Objective-C使我想起的更多的不是C而是Visual Basic 6。至少,是在我每日使用所遇到的问题上。Obj-C和VB6两者都 喜欢让程序保持运行下去(即使出错了,译者注)。这是不是个奇怪的现象?程序可能会错过打破当前状态的问题。另外,两种语言使用引用计数来清理内存,这会随着你的深入造成更多内存泄露。永远警惕引入循环引用。最后,两者没有泛型类型。把这些话都直直的装入你的脑子里,否则你接下来的日子会很难过。

还有另一件Obj-C与VB的包袱,例如,在Objective-C中许多对象有 “core foundation”、 “new style” “NeXTSTEP”的形式,而自动引用计数技术早在两年前就已渗透到整个社区了,当然了,还有C的子集。所以,大多数情况下我们可以忽略这些历史包袱,但它们的出现,我并不是暗示说Obj-C与VB是相同的编程语言,它们有很大不同,首先,语法就有很大的不同。

语法

Objective-c的语法很特别。传递一个消息(如调用个方法),你需要用方括号把接收消息的对象以及消息括起来。消息由参数名和值组成,因此不能像 list.Insert("test", 0)这样写,而是这样 [mutableArray insertObject:@"test" atIndex:0]。

当调用方法时给每个参数取个名字可以使代码非常清晰,但是不可避免的增加了代码量。总的来说这是件好事。另一方面,我认为让方括号在目标对象之前开着,而不是在目标对象之后(像Java, C#, C++)是个错误。这使你更难确定你在一个表达式的位置,并且使一个简单的序列变成了深层嵌套。扩展一个表达式是个反复的事情,因为你必须回到行首添加 [。 当前输入 ] 时XCode会尝试猜测 [ 的相对位置,但是它老是搞错以致变得更糟。

幸运地是,Objective-c有些语法糖可以让你在一般情况下摆脱嵌套。点记法 可以让你重写简单的getter表达式,如[a value] 重写为 a.value。setter, 数组索引,字典查找也有类似的语法糖。他们确实为减少冗长的代码创造了奇迹。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5fc0ca8a7e6128c88f83e506ce0b4c87.html