leechael.orgHome

OO in PHP (4)

蔡学镛先生著的 JAVA 夜未眠 是一本好书,这是我看过 O'Reilly Taiwan 所提供的数篇文章后的第一感觉。这里推荐蔡学镛先生的一篇文章,希望有助于大家能够更好地思考 OO 的使用:【言程序】思考OO

需要注意的是,看这篇精彩的文章需要翻墙。

OO in PHP

如果你也是一个 PHP Programmer:你知道怎么用 PHP 写程序,自信 PHP 已经入门了;你知道 Project Babel 并倾慕于加入对 OO 支持后的 PHP 的代码;你知道 Zend FrameworkCakePHP 这般的 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: To Be or Not To Be

印象中国内并没有多少人会提及 Unobtrusive JavaScript(低调的 JavaScript/不乱入的 JavaScript, 前者是在国内一 blog 看见的翻译,后者是对岸的一位设计师 Othree 的翻译)。本来这也不是很大的问题,倡导 CSS/JavaScript/HTML 代码分离是很多设计师们倡导的事情。有一篇 The seven rules of Unobtrusive JavaScript 说了七点 Unobtrusive JavaScript 要注意到的事情:

  • 不作任何假定。
  • 找到你的 JavaScript 在 HTML 代码中的接入点及与其的关系
  • 将遍历 (Traversing) 留给专家(利用 CSS 来找寻你需要的元素)
  • 了解浏览器和用户
  • 了解事件(Events)
  • 不与其他代码冲突
  • 为下一个开发者工作

在看到最后一点后,一些东西就不再奇怪了。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 的衡量,没有什么区别。