最近也是在啃松本的书,越读越喜欢。
作为Ruby语言的作者,其书中对程序语言的看法非常独到。比如拿“面向对象”来说,我在之前看的书里面大多只是讲:类怎么写,继承怎么用,虚函数的作用是什么,诸如此类等等等玲琅满目堆砌了一大堆细节。很少涉及到非常关键的一点:为什么要用面向对象?当然某些书里会含糊其辞地写到,用“对象”的思想对客观事物进行模拟,会让写出来的程序更加合理。“但真的是这样吗?”这是我知道有面向对象以来一直存有的疑问。直到在本书中,读到松本写到的“从实用主义的观点来看,面向对象的精髓就在于对OCP的实践。至于把对象看做物体理解起来比较容易,能够建立现实世界的模型等,这些都只不过是些锦上添花的东西。”(P111),对我来说,这句话犹如醍醐灌顶,很多问题霎时间就明白了。(这里的OCP指的是open-closed principle,指程序对功能扩展要是开放(open)的,而修改则要对外呈现封闭(closed))
这本书里,作者还写到“但是不管过去怎样,现在对面向对象最好的理解是,面向对象编程是结构化编程的延伸。”(P32)。作者认为,我们写程序时,最初所用的结构化编程是非常自然的。但是当时仅能够做到“程序的结构化”,而无法做到“数据的结构化”,也即数据无法随着程序一起“流动”,造成了处理上的困难。而面向对象的出现,使得数据可以与程序捆绑在一起,由此便实现了程序完全意义上的“结构化”。
我无法判断这种思想是对是错,但若是反过来从头看程序语言的演变,由以上思想作为出发点的话,很多事情都变得容易理解了。甚至让我怀疑“面向对象是为了根据现实进行抽象建模而出现的编程思想”这种思路反而才是牵强附会。
另外,这本书里还讨论了其他很有意思的设计,包括“Duck Type”,也即动态类型,还有对多重继承的处理(对比了RUBY、C++、JAVA、SMALLTALK、JAVASCRIPT和LISP等多种语言解决多重继承问题背后的思想,以及优劣所在)等等。实在是让我眼界大开……
当然,我还不敢肯定自己到底理解了作者想表达意思的程度,而无法判断作者所言是否有理,但这种思想碰撞的过程,太让我享受了
惯例也贴一份有趣的程序,用Ruby实现微秒级别的时钟,以前用C时只能调用到毫秒,还以为系统不支持呢。另外本程序也是为了表现Observer模式的思想。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
require "observer" class Tick include Observable def tick loop do now = Time.now changed notify_observers(now.hour, now.min, now.sec, now.usec) sleep 0.000001 end end end class TextClock def update(h,m,s,us) printf "\e[16D%02d:%02d:%02d.%03d.%03d", h, m, s, us/1000, us%1000 STDOUT.flush end end tick = Tick.new tick.add_observer(TextClock.new) tick.tick |