OO in PHP (4)
蔡学镛先生著的 JAVA 夜未眠 是一本好书,这是我看过 O'Reilly Taiwan 所提供的数篇文章后的第一感觉。这里推荐蔡学镛先生的一篇文章,希望有助于大家能够更好地思考 OO 的使用:【言程序】思考OO。
需要注意的是,看这篇精彩的文章需要翻墙。
蔡学镛先生著的 JAVA 夜未眠 是一本好书,这是我看过 O'Reilly Taiwan 所提供的数篇文章后的第一感觉。这里推荐蔡学镛先生的一篇文章,希望有助于大家能够更好地思考 OO 的使用:【言程序】思考OO。
需要注意的是,看这篇精彩的文章需要翻墙。
如果你也是一个 PHP Programmer:你知道怎么用 PHP 写程序,自信 PHP 已经入门了;你知道 Project Babel 并倾慕于加入对 OO 支持后的 PHP 的代码;你知道 Zend Framework 和 CakePHP 这般的 Framework,以及 OO 带来的,开发效率的提升;那么,我推荐你阅读 PHP in Action。
好了,对书的推荐到此为止;这里不是 OO 教程,我只在这里谈一谈 OO。OO —— Object-Oriented——是用来干复杂的事情的,它既为我们带来开发效率的提升,在使用恰当的情况下,也可以得到不错的运行效率。自然,我也曾经是 OO 的重度使用者,甚至想在 PHP 代码中尽可能地使用 try {} catch {} 来代替 if {} else {}。但 OO 不是一切。或许先来看看下面的这个描述。
你在一间不大也不小的房间里,房间里除了你以外,还有好几个人,你们是一个 team,协作开发软件,而你是 team leader。你知道 A 君长于界面设计,B 君只会写代码,C 君是一个很有经验的系统维护人员。这天你接到一个 case,你亲自完成策划案后,将结果分开为不同的部分交给你的伙伴们。当然,C 君负责 LAMP 的配置,而这个任务你也不会让对服务器配置一无所知的 A 君负责。
原谅我的词不达意;希望上面的这段东西能够帮助你理解 OO。在这里,ABC 三人就是对象,他们专长于他们懂得的事情,而不懂其他伙伴懂得的事情。当你只需要代码的时候,你不会让 C 君来参与 B 君的工作。
工作很顺利,你的这个小团队扩展到数十人,原来的伙伴也成为了小头目。A 君还是继续负责界面的设计,但随着项目规模的扩大,他现在只负责整体界面的一致性,细节部分由其手下的人员来负责。
不知道用这个来解释继承是否有些勉强呢?
这个团队已经不小了——原本的小房间已经容不下更多人了。由于你们团队的高效、代码的质量很不错,所以财源滚滚,所以你决定换一个更大的工作间。
到这里——一切都完了。假设这个房间是内存,这些工作者是对象——以此类比 OO,你是否有更深刻的了解了呢?
OO 是用来干复杂的事情。PHP 和 Python 都不是很极端 OO 的 Program Language,相对于 JAVA 来说。如果你对某个故事有印象:在屏幕上输出“Hello world!”——那么你一定记得,Hacker 的办法是,“echo 'Hello world!'”——bash script。JAVA 能用一句代码实现吗?不能。但是,JAVA 能比 bash shell 干更多的事情,例如,使用 bash shell 你无法写一个 Gtalk Robot。
实际上,我们需要考虑为什么 PHP 和 Python 并不是极端的 Object-Oriented Program Language:对于脚本语言来说,它们更需要的是 Get Things Done。下一次我将以一个例子来说说使用 OO 提高开发效率应有的思路。
印象中国内并没有多少人会提及 Unobtrusive JavaScript(低调的 JavaScript/不乱入的 JavaScript, 前者是在国内一 blog 看见的翻译,后者是对岸的一位设计师 Othree 的翻译)。本来这也不是很大的问题,倡导 CSS/JavaScript/HTML 代码分离是很多设计师们倡导的事情。有一篇 The seven rules of Unobtrusive JavaScript 说了七点 Unobtrusive JavaScript 要注意到的事情:
在看到最后一点后,一些东西就不再奇怪了。Unobtrusive JavaScript 倡导了一种良好的编码习惯,而实际上,或者说一句不中听的,这是给代码工人的规则。
Plaxo 的 Joseph Smarr 有一个很棒的、关于提高 JavaScript 的 slides: High Performance JavaScript。其中说到: Directly attach onclick, etc. handlers instead using event listeners where appropriate(尽可能地直接使用 onclick 等控制事件而不是事件冒泡).原因很简单,因为 Finding by class/attaching event handlers is slow.例如我需要那些 class 为 pop 的链接在点击后自动打开新窗口,当然我们可以通过编写一个额外的脚本来监控这些链接的点击,但在这些链接中使用 onclick 会让脚本运行得更快,但维护起来也会很麻烦。
而事实上,我们是否需要这般完整的分离代码呢?很大的可能是看这个站点对 JavaScript 的依赖程度。如果是轻度使用 JavaScript 来增强用户体验,Unobtrusive JavaScript 是很好的习惯;如果是那些 Web Application,例如,由于需要更多地考虑 JavaScript 的执行效率,就不必碍于 Unobtrusive JavaScript 的规则,适当地在 HTML 代码中插入 JavaScript 代码也未尝不可。
深究起来,其实这和编程中常见的、关于程序的 scalability 和 performance 的衡量,没有什么区别。