if (!condition) {} else {} を使うケース ( if (condition) {} else {} が好ましくないケース)
if (!condition) {
// foobar
} else {
// barbaz
}は ! をはずし、中身を入れかえた以下と全く同じ (あたりまえ)
if (condition) {
// barbaz
} else {
// foobar
}一時期、「if の条件に ! がついてはいけない!!」という妄執にとりつかれて一律後者にしていたけど、最近はそんな変な呪いが解けていて、素直に書くようになった。
例えば何度も呼ばれる関数が処理のすすみ具合によって条件分岐をする場合、つまり条件よりも処理の中身の流れのほうが重要だと思われるケースでは、条件の否定肯定にはこだわらず、中身の順番を上から読み下せるように書くようにしている。
例えば以下のように1回目だけ完全に違う処理を走らせたい場合は、条件を否定にして先に走る処理を先に書く
>|javascript||
function foo () {
if (!arguments.callee.called) {
arguments.callee.called = true;
// first
} else {
// second or more
}
}
|
gerry++
gerry++
Apache の mod_rewrite の挙動をテストするやつ
Test::Apache::RewriteRules がうまく動かなくて (プロキシされるほうの apache が何かで起動しない) 泣いたので、ほぼスクラッチから書いたやつをはっとく…… だいぶ前のだけど
- プロキシされるほうのサーバは Apache ではなく HTTP::Server::Simple::PSGI にした。
- インターフェイスが微妙に違う (シンプルにした)
- エラーがでたときに apache の error_log を表示するようにした
- 普通に HTTP::Response が返ってくるのでそれをテストする
- $res->{env} にプロキシされたサーバに送られた Plack の env がほぼそのまま (glob とか Storable できないものを除いて) 入っている
- $res->{backend} に処理したサーバが入っている (デフォルトは default)
- $res->header('Server') =~ /Apache/ とかでプロキシがそのまま処理したことをテストできそう
- $res->{uri} は 30x 系の場合は Location ヘッダが、そうでない場合は 'http://' . $data->{name} . $data->{env}->{REQUEST_URI}; が入る、ので $apache->request('...')->{uri} eq 'http://Backend/foobar/'; とか並べて書ける
あたりが元のやつと違う。しかしテストを走らせまくっているとセマフォのエラーになるのはなんとかならないのかな