トップ «前の日記(2007-07-08) 最新 次の日記(2007-07-11)» 編集

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|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|11|
2011|05|
2012|01|

2007-07-09 [長年日記]

% [雑談] 誰か、関数型言語脳に冒された人間のために有効な、ユニットテストの書き方を教えてください

世の中のユニットテストフレームワークってさ、関数型脳に厳しいよね。 だって、テストのコードを抽象化すればするほど、どこで失敗してるのか判別できなくなるんだもの(泣

でもさ、やっぱり同じようなコードが何度も何度も何度も何度も出てくると、どうしたってひとまとめにしたくなるじゃん。 でもそうするとテストの結果が把握しにくくなる。 でも重複したコードを放っとくと、やっぱり気持ち悪い。 でもそうすると結果が……(以下無限ループ)

% [雑談][Ruby] until とか unless って直感的ですか?

よく Ruby では if not ではなく unless と書こう……みたいな主張を聞く気がするんだけど、正直わしとしてはどうにも unless やら until やらに馴染めない。

特に and や or が絡んでくると、もういけない。 っていうか、and や or が絡んだ条件を unless 使ってまともに書けた試しがない。 もしかして、そういう条件のときは unless 使うのが間違ってる?という気もするけど、それならもう if not で良いじゃないの。 きっとゴルファーな人とかも、文字数違わないからどっちでも良いって言うよ (ってか、むしろ if ! の方が短いとか言いそう)。 や、while not より until の方が短かいのは確かだけど。

まあ、そんなわけで、わしには unless や until の存在意義が理解できないんだけど、実際何であるんだろうね。 個人的には、他人に読ませるコード書くときとかに、unless 使った方が良いんだろうか?などと無駄に葛藤を覚えてしまうので、こんなもん無い方が幸せなんだけど。

……こういうこと思うわしってオールドタイプなのかなあ。

% [Ruby] Ruby 使っててちょっとイラっとすること

一言で言うと、ファイルの命名規則が気に食わない。

irb(main):001:0> require 'pathname'
=> true
irb(main):002:0> path = Pathname.new 'hoge'
=> #<Pathname:hoge>
irb(main):003:0> require 'tempfile'
=> true
irb(main):004:0> temp = Tempfile.new 'hoge'
=> #<File:/tmp/hoge.3080.0>
irb(main):005:0> require 'fileutils'
=> true
irb(main):006:0> Fileutils.cd 'hoge'
NameError: uninitialized constant Fileutils
        from (irb):6

ショボーン。 いやまあ、クラス名で憶えろよって話はあるんだけどさ。 でも普通は require を先に書くわけだし、fileUtils とか file_utils とかってなってれば、間違えないと思うんだよなー。

本日のツッコミ(全11件) [ツッコミを入れる]
% cooldaemon (2007-07-09 17:41)

▼ユニットテスト<br>重複コードを蛇蝎の如く嫌うのは、オブジェクト脳の人でも同じだと思います。<br>私は、出力メッセージで工夫するよう心がけてます。<br><br>▼until や unless<br>各所で批判的意見は出てますが<br>Perl Best Practices で Damian Conway 先生が<br>unless と until は、厳禁だと言ってます。<br><br>私は、単純な時は、! で否定しますし<br>複雑な時は、unless で否定します。<br><br>例えば・・・<br>unless is_AAAA?<br>より<br>if !is_AAAA?<br>の方が短くて好きですし<br>if !is_AAAA? || !is_BBBB?<br>より<br>unless is_AAAA? && is_BBBB?<br>の方が読みやすくて好きです。<br><br>好みの問題かと・・・。

% jijixi (2007-07-09 17:55)

> 私は、出力メッセージで工夫するよう心がけてます。 <br>やっぱそれしかないですかねえ。<br><br>> if !is_AAAA? || !is_BBBB? <br><br>> unless is_AAAA? && is_BBBB? <br><br>この辺の変換が私にはさっぱりできないんですよね(苦笑<br>結局、if で書いちゃう。

% きむら(K) (2007-07-09 18:05)

オールドタイプだろ、お前もと云われればそうかもしれませんが、<br>わしも unlessはだめですねえ。単純な式が一つならまだいいんですけど。<br><br>elsif に対応する unlesif とかがないので、やっぱいらねー<br>と思っちゃいますね。<br><br><br>> unless や until の存在意義<br>Larry Wallのポリシー以外の何がありましょうや?<br> >意義というか理由

% jijixi (2007-07-09 18:31)

> Larry Wallのポリシー以外の何がありましょうや? <br><br>それかー!!<br>くそー、言語学者めw

% shiro (2007-07-10 07:49)

Gauche付属のテストフレームワークも、"failしたテストの行番号を表示したら?" ってリクエストを受けることがあるんですが、高階関数使ってパラメタライズしまくってるとテスト関数自体の位置ってのは意味無いんですよねぇ。今のところはやっぱり「メッセージで工夫してね」ってことにしています。

% jijixi (2007-07-10 08:39)

マクロがある言語なら、何かうまい方法がありそうな気が……と思ったんですが、具体的には思いつきませんでした。<br>気のせいかも知れません。

% shiro (2007-07-10 11:55)

マクロも結構トリッキーで。以前、Cのプリプロセッサマクロの__FILE__や__LINE__みたいのを実現しようとしたんですが、今のアーキテクチャだとマクロ定義時点での行番号やファイル名になってしまって、マクロ使用時のそれらが取れないという…Cやm4のマクロは置き換えセマンティクスだけど、LispやSchemeのそれはどっちかというとcall by value的なのでその差が出てるんじゃないかと思います。

% jijixi (2007-07-10 16:27)

あ、"うまい方法が…" と思ったのは __FILE__ とかのことじゃなく、テストのメッセージを自分で考えなくても、自動的にそれなりにわかりやすいようにできないかなーという話です。<br>まったく検討してない思い付きな例ですけど…<br><br>(test* "test hoge" "hoge"<br> (foo-func [foo-var]<br> [bar-var]))<br><br>…とか書いとくと、エラーになったときのメッセージに foo-var, bar-var の値が使われる……みたいな感じで。<br>や、マクロ書けない人間なんで、これがうまくできるかどうか判断できないんですけど(苦笑

% soutaro (2007-07-10 17:58)

naiveには、<br><br>(define-syntax test**<br> (syntax-rules ()<br> ((_ a b) (test* 'actual a b))))<br><br>(test** (+ 1 2) 4)<br><br>みたいな感じでしょうか?これで、何も書かなくても、(+ 1 2)とテストしたい式が表示されるようにはできます。gauche.testを使って、レポートを採点していたときはこんな感じでやってました。<br><br>もちろん、shiroさんが気にされてるような複雑なテストだと残念なことになりますが。

% shiro (2007-07-11 02:53)

「テストすべき式をメッセージに取り込む」としなかったのは、テストが高階化されたらやっぱり役に立たないからです。__FILE__を持ち出したのは、その機能があるとメッセージ自体に「実質的なテスト式の場所」を埋め込むマクロを書けるからなのです。<br>高階化されたテストの例としては、Gaucheのext/charconv/test.scmなど:<br>http://gauche.cvs.sourceforge.net/gauche/Gauche/ext/charconv/test.scm?view=markup<br>いろんなエンコーディング間の変換を総当たりで試すために高階化してます。<br>こういう場合は結局いちいちメッセージを組み立ててやらないとどうしようもないかなあと。

% jijixi (2007-07-11 08:50)

うーん、やっぱり色々ややこしくて、一筋縄ではいかない問題みたいですねえ。

お名前:
E-mail:
コメント:

トップ «前の日記(2007-07-08) 最新 次の日記(2007-07-11)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com