著作一覧 |
今日は仕事Rubyでちょこちょこ書いていたのだが、そこで気づいた開発方法ってのは、DBEという感じだ。
TDDに似てるけど違うのは、僕が仕事用にRubyで作るプログラムというのは文字通りシェルスクリプトというか、シェルから実行するタイプのプログラムだから、全部で1ファイルのような作りになる。だから全然、外部インターフェイスみたいなものを考えないところかな。でも、あらためて考えてみるとそれは関係なさそうだし、そんなこともなさそうだ。
たとえば、gzipを使いたいとする。
でも使ったことない。で、リファレンスを見ながら作るのだが、この時、僕が作りたいのはこんなメソッドだとする。
def foo(str) # strをgzip圧縮して返す end
もちろん、ということはTDD風にtest_fooを作って……という方法はあり得るのだが(というか、書いていて気づいたが、そうできるな。なんで、そうしないんだろう? フィードバックの量に関する問題のような気がする)、何しろ使ったことないんだから実際に動くところを見てみたい。
require 'stringio' require 'zlib' buff = StringIO.new gz = Zlib::GzipWriter.new(buff) gz.write('abcdef') gz.finish print buff.string buff.close
で、とりあえずこんなのを作ってみる。
$ ruby gz.rb|gunzip abcdef$
ちゃんと動くじゃん、と確認して、このサンプルプログラムをコピペしてfooを完成させる。
def foo(str) buff = StringIO.new gz = Zlib::GzipWriter.new(buff) gz.write(str) gz.finish ret = buff.string buff.close ret end
もっとも、最初、gz.closeと書いてみたり、
buff.close buff.string end
とか書いてみたりしたのだが。StringIOはStringWriterとは違うと良くわかった。というようにむしろStringIOのほうで引っかかっていたのだった。
追記:close後に取り出せないことに気づいて上に書いたようなことをやってたわけだけどなかださんのとこにStringIO.new(buff = "")
と与えて後からbuff
を取り出す使い方が想定だと書かれている。そのほうがスマートなのでそう書くべきでしょう。
TDDは繰り返しできるから(残るから)、リファクタリングにも利用できる。DBEは、確認した先から実際のプログラムへ移動して行くから残らない。で、なんでこんなことを書いているのかというと、DBEが成り立つ点が、スクリプト言語の良い点なのかな、と思ったのだった(実際は、CでもVBでもJavaでもこういう簡単な確認プログラムを作って取りあえず試すことは良くやるし、普遍的な方法なのだが、部分切り出しがRuby−−もちろんPerlなんかもそうかも知れないが知らないものは知らないわけである−−だと楽だな)。というか、むしろミソは、パイプでgunzipを繋げられて実行できる環境のほうかも。
ジェズイットを見習え |
私も Smalltalk システムで何かを書くとき、似たような手順をふんでいます。興味深いですね。