REPL Drive Development

Published on:
Tags: ruby Pry

REPL, 全称Read-Eval-Print-Loop, 通俗的说,就是一个代码交互环境,你输入什么,它执行什么,并把结果打印出来。像Ruby的irb,Node.js的node,CoffeeScript的coffee,都是REPL的工具。

REPL Drive Development这个概念是在不久前迈阿密举行的RubyConf大会上由ConradIrwin提出的:
[视频PPT]

我们听过TDD-测试驱动开发,BDD-行为驱动开发([视频PPT]), REPL Drive Development - REPL驱动开发, 我还是头一次听说。 但是看完视频之后,我明白了, REPL Drive Development并不是要取代TDD/BDD,其实REPL Drive Development在我们日常工作中大多数人都会经常用到。我们在开发一段功能代码之前,在没有写测试代码和功能代码之前(假设你是Rubyist),总会打开我们的irb,或者现在最流行的pry,在里面去尝试一下你对这个方法的一些构想,比如你要写一个数组的排序方法,那么你可能会在irb或pry里去测试下each方法的用法:

pry(main)>  arr = [1,2,3,6,5,7]
pry(main)>  arr.each {|i| puts i}
#or

pry(main)>  arr.sort

尝试完之后,我们就可以去写测试方法或者是功能代码。 通过这个简单的例子,我们明白,其实REPL Drive Development,我们一直在实践,只是之前没有人给我们总结出这个概念而已,而ConradIrwin,带给我们的优秀工具-pry, 就是基于这种理念去开发的。

pry,简单的介绍,是替代irb的工具,但实际上,它不仅仅是个REPL, 它可以作为一个贯穿我们整个开发过程的一个基础工具,源码阅读、构想实践(就是我们上述的例子)、TDD/BDD开发和Debug等,pry都会给我们提供强有力的支持。

帮助你构思代码:

你可以使用pry提供的三个简单的命令:

  1. ls [Class/Module] , 用于列出类或模块里自己定义的方法,不包括继承来的方法

    [1] pry(main)> class User
    [1] pry(main)*   def hello
    [1] pry(main)*     puts 'hello'
    [1] pry(main)*   end  
    [1] pry(main)*   def self.world
    [1] pry(main)*     puts  'world'
    [1] pry(main)*   end  
    [1] pry(main)* end  
    => :world
    [2] pry(main)> ls User
    #<Class:User>#methods: world
    
    User#methods: hello
    
  2. $ (或 show-source) 命令,可以显示一个方法或类的源码。

  3. ? (或 show-doc)命令,可以显示一个方法或类的自定义的文档。

帮助你写Test:

可以安装pry-plus这个gem,可以帮助你去写测试:

  gem install pry-plus

然后:

  require 'pry-rescu/minitest'
  #or

  require 'pry-rescu/rspec'

你就可以使用pry,结合minitest和rspec来写测试了。 详细的代码示例,可以参考RubyConf的视频。
pry提供了下列命令,帮助你写test:

> try-again
> break
> step/next
> play
> edit

查找修改Bug:

pry也可以帮助你去debug代码:

# test.rb

require 'pry'

class A
  def hello() puts "hello world!" end
end

a = A.new

# start a REPL session

binding.pry

# program resumes here (after pry session)

puts "program resumes here."

你可以在你的代码中想打开pry的位置放置binding.pry, 当代码执行到这里的时候,就会打开一个pry session:

pry(main)> a.hello
hello world!
=> nil
pry(main)> def a.goodbye
pry(main)*   puts "goodbye cruel world!"
pry(main)* end

pry还给你提供了用于debug的很多犀利的方法:

> binding.pry
> cd
> up/down
> whereami

当然, 你可以在pry里面使用'help'命令,来了解pry给你提供的众多神奇工具。

> help

总结:

使用Pry可以提高我们的开发效率,更有效的帮助我们完成测试代码,减少bug的产生,也更容易帮助我们debug,快把它用起来吧! 我相信已经有很多Rubyist已经在用它了。

以上就是REPL Drive Development与Pry的介绍,大家可以去看RubyConf的视频,更详细的代码demo都在视频里。

Comments

comments powered by Disqus