研读《Ruby元编程》一书

来源:互联网 发布:盗版电子书知乎 编辑:程序博客网 时间:2024/04/29 11:52

      《Ruby元编程》以案例形式循序渐进讲解Ruby对象模型原理和高级应用技巧,堪称动态语言的设计模式。下面是一些评论:


        Paolo Perrotta有超过10年的软件设计和开发经验,发表过上百篇技术文章。他用过Java、C++、C#编程,最后爱上了Ruby。他是较早接受敏捷方法的实践者,在Yoox(一家大型互联网时尚公司)从事管理敏捷团队的工作。他还在欧洲各国教授编程培训课。目前他和女友(还有一只猫)住在意大利,专心钻研Ruby。


        通过这本书,我们还可以了解到为何 Ruby 看起来如此与众不同,它的设计目的,实现方法。我们会了解到 Ruby 中大量的内置方法, 其实不仅仅是魔术方法,它们其实是基于一个很小的理论集合建立起来的公理体系。 Ruby 语言的设计,关键字只是一部分, 基本对象的设计甚至更为重要,基于一组精心设计的接口方法和一个作用域理论,就形成了 Ruby 优雅的语义模型。 程序员在编写 Ruby 代码(甚至是其它动态语言,甚至 objective c)时使用到的各种方法, 都是基于这个很简洁的理论内核推导演绎而成。这里面的魔法非常少,但是完整的描述了动态面向对象的各种设计方法。 甚至可以说,Ruby 是 Samlltalk 族系的 Lisp。读过这本书,我们可以理解,为何 Perl 社区的传奇人物唐凤会评价" Ruby 就是没做广告的 Perl6"。


  一切皆对象 
   
  曾经有个说法,Python 是面向对象的,Ruby 是面向类型的。本书回答了这个问题,Ruby 确实是完全面向对象的, 而且,它在语义上更为纯粹。Ruby 可以用自身的代码完整的解释自己的对象模型,包括核心的基础类和方法。设计 Ruby 语言,包含了设计它核心的对象和对象方法,这在现代的编程语言中是常见的,但是 Ruby 做的特别彻底和优美, Ruby 很好的继承和发扬了 Smalltalk 的思想,它对面向对象模型的抽象,就像 Lisp 对程序语言的抽象一样彻底。 
   
  Ruby 的对象模型中,对象、类、本体类(Eigenclass)、作用域、消息、self 等重要概念, 和它们的实用意义,都在本书得到了阐述。 
   
  作用域的封装、访问、互操作 
   
  Ruby 有严格完整的作用域限制,在本书中有详细讨论,包括不同作用域之间如何互相隔离,又如何在它们之间传递信息。 基于作用域,衍生出了 block ,然后是 lambda 和 proc 的使用、原理、区别。 
   
  扁平化作用域、洁净室、闭包等概念,都在实例中讲解清楚,Python 程序员可以借鉴这些知识,深入了解 yield 和 nolocal 等知识。


     eval 族系 
   
  Ruby 有 eval、instance_eval、class_eval 三个不同的eval函数,它们可以接收字符串或代码块, 这比 Python 的 eval 要复杂,但是从理论高度理解,就会发现它们相当的严谨和简洁。 这些方法可以帮助我们构造或访问特定的作用域,或许会让 Python 程序员想到 yield 的使用。而 Objective C 也已经加入了很多 block 支持。 
   

       Eigenclass ,面向对象和类型约束

       Ruby 引入了 Eigenclass 概念,它优雅的解决了 duck typing 和对象类型之间的矛盾。 instance_eval , class_eval 和 method_missing 等方法,组成了 Ruby 的动太对象操作集。它们使得 Ruby 在类型约束和动态对象之间游走自如。 相对于 Python 的 duck typing 风格和 Java 的静态约束,Ruby 更为平衡, 允许用户自己选择约束与自由的平衡点。相对于在 Java 中使用反射或 Python 中使用约束,Ruby 无论倾向哪一种风格,都不会付出太高昂的编程代价。 

 

        MixIn 和其它类型扩展方法 
   
  类型混入(MixIn)在 Python 中也是重要的元编程技巧,著名的 Python 编辑器 Ulipad 就大量使用了这种技术。Ruby 对 Mixin 的支持更漂亮,也更灵活,这个技术在书中反复使用。 
   
  Ruby 同样继承了 Smalltalk 的 extend(这里指 Smalltalk 的 extend , Ruby 的 extend 则表示了不同的含义) 方法,这个技巧在本书一开始就有介绍,并且反复使用。 
   
  Objective C 虽然没有 Ruby 这样丰富完整的面向对象语义(相对来说,objective c拥有 C 级别的运行效率和底层访问能力),但是学习 Ruby 的各种类型扩展技术, 可以帮助我们更好的理解和运用 Objective C 中的 category 等技术


       符号与文本 
   
  对文本直接 Eval 当然非常灵活,特别是 Ruby 具有 Perl 和 PHP 的变量内插能力, 但是它也有其缺陷,书中详细讨论了这个问题,介绍了一些应对方法。LISP 程序员相信会注意到 Ruby 有在符号和文本之间进行转换的能力,这就像 LISP 宏和 Python 自省的结合,好吧,Ruby 也有自省,而且更强大。 


       属性、访问器与幽灵方法 
   
  属性封装、访问器等概念在多种语言中都有体现,本书用 Ruby 的各种内置方法和设计方法, 向我们展示了这些概念在语义上到底是如何被设计和理解的。学到这些知识,对 Python、 和 C# 等领域的程序员,理解日常工具中出现的 property 技术,也有很大帮助。 
   
  深入阅读 method_missing 相关的知识,不仅可以了解 Ruby 的动态属性和方法技术, 还可以帮助我们深入了解为何 Smalltalk 观点中的对象是消息驱动, 而非表面看来简单的函数执行。Objective C程序员也可以借此更好的理解 KVO、KVA 等技术。 

原创粉丝点击