Ruby最佳实践
![](https://img3.doubanio.com/icon/u3770153-22.jpg)
这篇书评可能有关键情节透露
先讲个冷笑话,大句哥哥突然讨厌夏天,因为夏天热,衣服穿的薄,所以被人嫌齐了,因为大家都不喜欢句透。。。
===
第一章讲的是测试,与普通的单测的介绍不太一样,由于ruby的语义贴近自然语言,本章也侧重于介绍如何让测试更容易理解。虽然有很多优秀的第三方测试框架(比如RSpec https://github.com/dchelimsky/rspec ) ,不过作者还是选择了原生的Test::Unit来阐述他的思想,(作者后面也提到尽可能熟悉标准库,应该优先使用标准库,然后才是第三方库,不过如果是我,我还是会用RSpec来测,设计超棒的DSL真是让人百看不厌百试不爽啊)。作者花了一些篇幅演示了用ruby去实践TDD,并就一些测试中的常见技巧作为子话题一并列出,比如Test Exception, Test Suite, Mocks and Stubs, Test Helper等等。
第二章讲"Rubyish API"的设计。主要有两点,其一,从Ruport的Table方法的设计切入,介绍了几种argument的设计,简单的Standard ordinal arguments, Ordinal arguments with an optional argument, 复杂一点的Pseudo-keyword arguments 和 Treating arguments as Array。顺便提一句,下文的rdoc设计中推荐使用:call-seq:来修改接口的文档,否则后两种方法直接看很难看出传入的参数。其二,Code Blocks,作者举的例子是大名鼎鼎的Enumerable模块。传入code block的使用方法也有好几种,比如用于pre/post-processing,As Dynamic callbacks(这个比较常用吧); for Interface Simplification。剩下的比如使用attr访问器,方法命名?!的区别,自定义操作符就是小篇幅一笔带过了。总的说来,这张还是挺出彩的,脉络清晰,后劲有点不足,感觉还有很多没有讲。
第三章标题是"Mastering the Dynamic Toolkit", 讲了BlankSlate以及方法定义删除绑定等行为、eval/instance_eval、method_missing、send、dual-purpose accessors、singleton(也有的书叫做eigenclass(吧?))、open class、alias、hooks and callbacks(method_added等等),各种基本功吧,砍瓜切菜可以看过去。果不其然介绍了camping的R方法。另外介绍的追踪open class新加的方法、追踪子类添加的方法、追踪Mixin的方法,也是很实用的debug技能。更多知识推荐《ruby元编程》。因为主要介绍了黑魔法,作者在结尾小结中也给出了自己的建议: just make a mental note of what you've learned here, and then wait until some code jumps out at you and seems to be begging to be cleaned up using one of the techniques shown here.
第四章是文本文件的处理,果然到写笔记时才发现看的不认真,没啥印象,不过也没啥好说的,额。。。
第五章介绍函数式编程。通过lazy.rb来介绍了延迟加载的技术,LDAP验证的例子为我们介绍了用module_function与extend self来达到类似class method语法的技术,rgb2hex的例子为我们介绍了memoize这种以空间换时间的技术(使用Hash.new),顺便推荐了Memoizable这个Mixin 。Infinite Lists其实也是一种lazy的变种,作者也是写了个raw的版本后推荐了lazy_stream类库。Higher-Order Procedures这个函数式特性ruby语言可以通过Block来实现,ruby甚至有个%w[].map(&:capitalize)这样的语法糖来等价调用 %w[].map { |x| x.capitalize }
第六章介绍ruby的debug技巧。irb、test、log轮着用。各种inspect方法用来搜索实例中我们想要的信息。可以自定义的#inspect方法,然后用Kernal#p来输出。rescue里面打印错误然后reraise,可以搞出更多信息来。
第七章不想看,好累
第八章剖析了Haml,来介绍了一个开源项目的各种细节,看得人很燃啊,从目录结构到rake, 从README到Library,还有Executables, Tests, Examples, Rdoc主要介绍了三个标记:nodoc:, :call-seq:, :section:,最后写了下Gem的打包,以及依赖管理,基本上是新手要开源一个ruby库的一定要读的佳作啊。
附录A 介绍了1.8和1.9的向后兼容,其实现在用1.8的人不多了(吧?突然记起来osx默认带的好像就是1.8,好忧伤),降级其实也不是什么技巧吧,不过作者还是他希望最好能平滑地同时兼容两个版本的ruby, 现在要3了啊喂!
附录B介绍了10个作者随便列举的好库,pp是个加强版的Kernal#p, open-uri给Kernal#open打了patch, date用于时间处理,strscan适合用来进行语法解析,作者举了json解析的例子,digest加密,介绍了rails的authenticate方法;还有加强版的数学库mathn ;好用的csv;基于文件系统的事务库pstore, 还有json, erb
附录C介绍Ruby Worst Practices.没有什么特别眼前一亮的东西
总的说来,看下来还是挺有收获的
===
第一章讲的是测试,与普通的单测的介绍不太一样,由于ruby的语义贴近自然语言,本章也侧重于介绍如何让测试更容易理解。虽然有很多优秀的第三方测试框架(比如RSpec https://github.com/dchelimsky/rspec ) ,不过作者还是选择了原生的Test::Unit来阐述他的思想,(作者后面也提到尽可能熟悉标准库,应该优先使用标准库,然后才是第三方库,不过如果是我,我还是会用RSpec来测,设计超棒的DSL真是让人百看不厌百试不爽啊)。作者花了一些篇幅演示了用ruby去实践TDD,并就一些测试中的常见技巧作为子话题一并列出,比如Test Exception, Test Suite, Mocks and Stubs, Test Helper等等。
第二章讲"Rubyish API"的设计。主要有两点,其一,从Ruport的Table方法的设计切入,介绍了几种argument的设计,简单的Standard ordinal arguments, Ordinal arguments with an optional argument, 复杂一点的Pseudo-keyword arguments 和 Treating arguments as Array。顺便提一句,下文的rdoc设计中推荐使用:call-seq:来修改接口的文档,否则后两种方法直接看很难看出传入的参数。其二,Code Blocks,作者举的例子是大名鼎鼎的Enumerable模块。传入code block的使用方法也有好几种,比如用于pre/post-processing,As Dynamic callbacks(这个比较常用吧); for Interface Simplification。剩下的比如使用attr访问器,方法命名?!的区别,自定义操作符就是小篇幅一笔带过了。总的说来,这张还是挺出彩的,脉络清晰,后劲有点不足,感觉还有很多没有讲。
第三章标题是"Mastering the Dynamic Toolkit", 讲了BlankSlate以及方法定义删除绑定等行为、eval/instance_eval、method_missing、send、dual-purpose accessors、singleton(也有的书叫做eigenclass(吧?))、open class、alias、hooks and callbacks(method_added等等),各种基本功吧,砍瓜切菜可以看过去。果不其然介绍了camping的R方法。另外介绍的追踪open class新加的方法、追踪子类添加的方法、追踪Mixin的方法,也是很实用的debug技能。更多知识推荐《ruby元编程》。因为主要介绍了黑魔法,作者在结尾小结中也给出了自己的建议: just make a mental note of what you've learned here, and then wait until some code jumps out at you and seems to be begging to be cleaned up using one of the techniques shown here.
第四章是文本文件的处理,果然到写笔记时才发现看的不认真,没啥印象,不过也没啥好说的,额。。。
第五章介绍函数式编程。通过lazy.rb来介绍了延迟加载的技术,LDAP验证的例子为我们介绍了用module_function与extend self来达到类似class method语法的技术,rgb2hex的例子为我们介绍了memoize这种以空间换时间的技术(使用Hash.new),顺便推荐了Memoizable这个Mixin 。Infinite Lists其实也是一种lazy的变种,作者也是写了个raw的版本后推荐了lazy_stream类库。Higher-Order Procedures这个函数式特性ruby语言可以通过Block来实现,ruby甚至有个%w[].map(&:capitalize)这样的语法糖来等价调用 %w[].map { |x| x.capitalize }
第六章介绍ruby的debug技巧。irb、test、log轮着用。各种inspect方法用来搜索实例中我们想要的信息。可以自定义的#inspect方法,然后用Kernal#p来输出。rescue里面打印错误然后reraise,可以搞出更多信息来。
第七章不想看,好累
第八章剖析了Haml,来介绍了一个开源项目的各种细节,看得人很燃啊,从目录结构到rake, 从README到Library,还有Executables, Tests, Examples, Rdoc主要介绍了三个标记:nodoc:, :call-seq:, :section:,最后写了下Gem的打包,以及依赖管理,基本上是新手要开源一个ruby库的一定要读的佳作啊。
附录A 介绍了1.8和1.9的向后兼容,其实现在用1.8的人不多了(吧?突然记起来osx默认带的好像就是1.8,好忧伤),降级其实也不是什么技巧吧,不过作者还是他希望最好能平滑地同时兼容两个版本的ruby, 现在要3了啊喂!
附录B介绍了10个作者随便列举的好库,pp是个加强版的Kernal#p, open-uri给Kernal#open打了patch, date用于时间处理,strscan适合用来进行语法解析,作者举了json解析的例子,digest加密,介绍了rails的authenticate方法;还有加强版的数学库mathn ;好用的csv;基于文件系统的事务库pstore, 还有json, erb
附录C介绍Ruby Worst Practices.没有什么特别眼前一亮的东西
总的说来,看下来还是挺有收获的