トップ «前の日記(2005-08-10) 最新 次の日記(2005-08-12)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2005-08-11

_ DBE(Development By Example)

今日は仕事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を繋げられて実行できる環境のほうかも。

本日のツッコミ(全1件) [ツッコミを入れる]
_ sumim (2005-08-11 01:56)

私も Smalltalk システムで何かを書くとき、似たような手順をふんでいます。興味深いですね。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|

ジェズイットを見習え