言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

長いブロック休むに似たり。

また発見してしまった安直パターン。ブロックというのは Squeak における遅延評価メカニズム、いわゆる無名関数だ。他の言語に比べて大変使いやすく重宝する(単に[]で囲むだけ)。しかし、ここにも落とし穴が。長いブロックを見かけたら、それはよっぽど達人か、よっぽど下手糞なコードである。

今日見かけた糞なコードはこんなの。ファイルを非同期にダウンロードする仕組み、つまり複数のファイルを同時に幾つもダウンロードできるクラスがある。このクラスの使い方は、1) URL を教えるてダウンロード開始 2) 終了したか調べる。3) 終了していれば結果を取得。という三段構えで、1) のときに別のプロセスが起動し、2) と3) を平行プロセスで行い複数ダウンロードを実現する。ここまではまあ良い。

問題は、このクラスを使っている場所が殆ど単一ファイルの為のもので、しかもダウンロードが終わるまでじっと待つ必要がある性質の物だ。このために、1) で折角作ったプロセスは全くの無駄で、単にダウンロードが終わるまで馬鹿みたいに無駄なループを繰り返す。なぜこんな事になっているのかというと、実際にダウンロードする箇所が長いブロックになっていて、再利用しにくく、一つしかダウンロードしなくていい場合でも複数の場合と同じロジックを通らないといけないから。

このクラスの最初の作者に内心罵声を浴びせながらループを書いてしまう怠惰さは良く理解出来るのだが、もう何度も Squeak の中でこのパターンを見ていて、つい日記に書いてしまった。このループを自分でほどくかどうかは定かでは無い。