读《Ruby元编程》之Rails源代码赏析

《Ruby元编程》之Rails源代码赏析笔记。

写在前面

《Ruby元编程》part 2 说的是rails中的元编程,相比part 1 ,这部分的篇幅少了很多。

主要说了这四块:

  • ActiveRecord的组成
  • ActiveSupport的concern模块
  • alias_method_chain
  • 属性方法

来逐一看看。

ActiveRecord的组成

  • 是什么?

ActiveRecord是一个库,用来将Ruby对象映射到数据库中,然后你就可以直接对model进行操作,使用类的对象与数据库交互,不需要通过传统的SQL语句,rails会帮你转化成SQL语句。

  • 依赖和组成

ActiveRecord依赖ActiveSupport,ActiveModel,并且使用ActiveSupport::Autoload来扩展了类。

ActiveRecord::Base是它最重要的类,由一堆模块组装起来,通过extend,include 多个module,获得了大量的实例方法和类方法。

ActiveSupport的concern模块

concern模块是一个最小依赖管理系统,它的诞生,是为了解决包含并扩展类中链式包含的问题。

书中较详细地说明了concern的实现机制,通过覆写内核方法append_features来决定module是否进入祖先链 ,不过这段的代码真不好理解。

alias_method_chain

它的兴起是为了处理别名机制,你可以把它看成是环绕别名的构建器,而这也是它消亡的原因。颇有“成也萧何,败也萧何”的味道。

既然它已经逐渐退出舞台,那么用什么来解决给原方法增加新功能的问题呢?

在第五章中提到的prepend,成了它的替代品。

属性方法

  • 是什么?

    自动创建的访问器。比如你创建了一个类Student,它有name, age字段,可以通过Student.new创建对象,直接对其name, age读写。

    s = Student.new
    s.name = "Tom"
    s.age = 18
    s.save
    s.name #=> Tom
    

    这里name =nameage=, age等方法,就是属性方法,都是ActiveRecord通过查看students表的字段进行创建的。

  • 发展历史

    Rails1.0时,通过幽灵方法来实现属性方法,由于幽灵方法并不是真正的方法,调用时要先完整搜过一遍祖先链,所以Rails2.0时,对属性方法的实现进行了改进。大致的思路是:第一次访问属性时,这个属性是个幽灵方法,ActiveRecord::Base#method_missing会在这时把这个幽灵方法转化为真实的方法,同时method_missing还动态地为数据库中的其他字段创建读,写,查询访问器,下一次再访问时,就会有一个真实的方法器可供访问,不再进入method_missing方法。

一点感触

刚开始看元编程的时候,很激动,像是发现了宝似的,现在看完了,平静了很多。借用书中的一句话:元编程的目的不是为了让代码变得更聪明,而是让代码变得更灵活。

Happy metaprogramming!