组织机构DSL之二:参考资料(ruby hacking guide )的阅读笔记

说来惭愧,虽然我很久前就声明自己加入了RHG的中文翻译团队,但是最近因为项目和部门工作的原因,迟迟没能进入状态。重新拾掇起RHG,是在读了《Programming Ruby》和《Ruby Cookbook》关于metaprogramming以及《acts_as_statemachine》的源代码以后,我在前些天的blog中也预告了准备整理一下组织机构模型和权限模型的DSL,但实际接触Ruby的metaprogramming代码后,我发现自己还是太天真了些,这个DSL一定要整理,不过,要等我把ruby的元编程理论掌握了之后。
在重新拾起RHG后,中文翻译团队已经将书的第一部分全部翻译完毕了,因此,我可以从头来阅读(和修订)中文稿了。今天看到了chaofan,问他RHG中文第一章的图是否有人做了,他说要问DreamHead。DreamHead已经去了Thoughtsworks,而且看他的blog,工作很开心,再此先祝贺一下。

不谦虚的说,虽然目前没能完全掌握元编程技术,但已经跟几天前的我不可同日而语了。呵呵。我也想明白了,大家可能不光需要的是组织模型的DSL,更希望我能够把考虑该DSL的过程写下来。其实,说写给别人看,是个幌子。这些年的写作经验告诉我,真正受益的,是我自己。举个例子说,若干个月前,我花时间整理了javascript Hacking Guide 系列,并重点提炼出javascript的内存模型。在公司内部,真正认为这个东西有用的人为数不多(,当然对某几个人来说(如老梁)用处还是蛮大的,他负责的EditGrid的Ajax实现部分,从我的内存模型中受益颇多)。而我,要想看某个家伙写的js库,如老梁写的,或者prototype的,或者ExtJs的,都会先找出并温习一遍我整理好的内存模型。这就是写作给我带来的好处。

在第一章中,作者举了很多的ruby程序片断,教给读者ruby语言的最常用特性,对我而言,读过《programming ruby》后,本章内容已经不是太新颖,感觉重要的是,我原先认为Class 的superclass是Object,读此章并写代码验证后,发现错了,Class的super 是Module,Module的super 才是Object。另外,关于顶层(top level)的描述部分也颇有意思,打开irb之后,输入self,返回的是“main”,这才理解了其中的顶层的确省含义。

第二章,RHG中规中矩的讲对象,对象的3大构成要素:1 标识 2 方法 3 实例变量。比较吸引眼球的部分,是对各个结构体的剖析,从中,你可以看到为了节约内存,ruby做出了种种的努力,例如 Fixnum的实现和symbol的实现,再比方,通用的RBasic结构体以及RClass结构体、类型转换宏的使用、union的使用,还有generic_iv_table的get 和set方法等。

第3章讲hashtable的实现,在《programming ruby》中,用Symbol的好处已经讲了不少了,这里主要讲解了些Symbol的内部机制,看本章的关键,是把几个结构体看懂: st_table,st_table_entry 。。。我看了一会,感觉没有意思,就跳过了,等以后有时间补上吧。

第4章,先给大家讲了个小噱头,叫作对象的singleton 方法,我开始想到的是类的静态方法,后来仔细考虑,才发现自己错了,作者其实讲解的是: class << obj 这部分的实现。读者了解了object的singleton类是如何和object attach在一起之后,作者才开始深入讲 Class的Class的实现(也就是我们平常说的metaclass部分)。记得有人在javaeye上写作者画出了八卦图,现在想,作者用的这种图真是不太直观,不如《programming ruby》中的图看上去舒服,嘿嘿。后面的include和extend部分还没有看,初步估计,看了以后还会对《programming ruby》中的相应部分加深理解。

总结一下,看Acts_as_statemachine的源代码,感觉要想写这么一个DSL的插件,还是很考验作者对ruby内存对象模型的掌握能力的,重点要看的部分是:include 和extend的使用、Module的嵌套与作用域、对象与类对象、对象方法和类方法的关系与实现等。

写一个扩展话题,通过对Acts_as_statemachine的使用,我发现它的使用方法是在某个Model的子类中进行定义,但是如果同一个类有不同的实例,每个实例有不同的状态迁移关系,acts_as_statemachine好像就不能用了。举个例子:公安的缺陷管理和质检的缺陷管理流程,是缺陷(Defect)这个model类的不同的实例,不应该为这两个实例生成新的类(如:class GongAnDefect < Defect),因为明天我可能会考虑为税务增加自己的Defect处理流程,大后天我又考虑为技术中心添加新的Defect处理流程。组织模型的DSL实现也会遇到类似的问题,谁有好点的处理方法呢?


应该会有解决办法的,豆爹,加油啊,努力啊,我很看好你吆~~~~~(在没有人鼓励的情况下,我总是这样对自己说。嘿嘿)

你可能感兴趣的:(JavaScript,编程,Ajax,Ruby,八卦)