最近在看《Flash ActionScript 3 殿堂之路》,觉得作者还是非常专业和非常用心的。
说作者专业,因为这本书的作者不仅仅能够在书中指出没有程序设计经验(特别是没有OO经验)的新手应该注意的事项,还能指出一些ActionScript3与Java以及C#的区别,以便于Java或C#程序员更高效的利用这本书。因为对于从Java或C#迁移过来的程序员而言,他们有丰富的OO经验,需要学习的仅仅是语言之间的差异以及新的框架与库。
不过我想说的是,为什么没有ActionScript3与JavaScript的对比呢?它们都是ECMAScript,都为前端开发人员所用,一个是Flash/Flex方向,另外一个是Ajax方向。就我个人而言,我有相当的C#与JavaScript经验,然而ActionScript3与JavaScript更相似,我当然是希望拿JavaScript作对比的。ActionScript3与C#作对比只能停留在一个比较表面的层次,要说到关联数组、函数对象这些只有JavaScript才能作对比,C#根本没这些概念。
另外书中关于ActionScript3与Java以及C#的对比,也停留在很表面的编码方式的对比上。作者很强调这本书是“面向原因(why-oriented)”的,因此在ActionScript3的教学方面更倾向于揭示本质而非介绍编码方式。然而我并不确认这是因为作者对Java以及C#的认识仅仅在于编码方式的层面,还是他认为揭示Java以及C#本质与ActionScript3本质的差异就扯得太远了,反正这本书缺乏这方面的内容。
我举一个例子,书中讲到ActionScript3的基本数据类型是immutable的,因此虽然还是以引用方式存在,但是一旦要改变其值就不是在原对象上作改变,而是新建一个对象保存新的值然后把引用指到新的对象。书中的对比并没有提到C#中的string其实也是immutable的,事实上任何一个对.NET CLR本质有一定了解的人都知道string是通过immutable来模拟值类型特性的,这是和ActionScript3的做法比较类似的。更深入的知识,例如ActionScript3是否也像Java或C#那样子使用拘留池(intern)来为字符串对比提供便利,这书里面好像也没说到(全书我还没看完)。例如((new String("abc")) == (new String("abc")))的结果是true还是false呢?这就涉及到拘留池的问题了。
说作者用心,是因为这本“面向原因”的书确实为所谓的“语言迷”(就是很喜欢研究语言风格以及底层实现的人)提供了深入学习ActionScript3的途径,同时还顾及了其他各种读者群体,例如完全的编程新手,或者是从其它OOP语言迁移过来的程序员。
说实在的,我觉得这样一本书对于语言迷而言更有善一些,因为我一翻开书就能够确定“嗯,这个作者很pro,至少他是懂很多东西才来写书的,不像某些国产书那样作者完全是不懂装懂的”,然后我会确定我想要读这本书。对于新手而言,可能还是“案例导向(case-driven)”的方式更好一些。因为我自己也时常考虑写书的事情,想着如何将自己的经验浓缩为case study,然后发现这并不是一件简单的事情,因此挺佩服国外那些“案例导向”的书的作者的,特别是Manning的In Action系列的书。
事实上,虽然作者写了新手可以跳过某某章节,然而对于如饥似渴的读者而言,又怎么可能随便忽视掉书上的知识。不过确实有看不懂,那怎么办?那就比较容易让人有挫折感(frustrated),这就不太好了。“案例导向”的好处就是,即使读者基础不好,他跟着case一步一步做下去,或发现case的应用程序的功能逐步完善,这样就有成就感了。就算他连打字都会打错吧,但他总能够直接打开源代码查看两个version之间的差异吧,一看就发现果然如书上所说稍微用一点新技术新version上的功能确实就比旧version的要好了,这样他就信服了。
无论如何,这本书都算是一本高质量的国产书,也算是国内第一本深入讲解ActionScript3的书籍,因此我很乐意在豆瓣上给它五星。如果将来翻译为英文版发布,我也会去Amazon写review给它个五星,哈哈。
P.S.大家还可以参考一下aw对此书的书评。