GOTOが必要とされるときとは?

GOTOの亡霊 - カレーなる辛口Javaな転職日記さん経由、http://kan-nazuki.livedoor.biz/archives/51276475.htmlさん。



つれづれ の その65に書いたのと似たテーマだったので、タイムリーだな、と思いました。(ていうか、これは自分でも参照を貼りにくくてたまらんですにゃー)。

どうでもいいことですが、なんというか kan-nazukiさんのは、言いたいことは良いのですが、コード例とか文章が悪く、台無しにしてる感じです。

「頭ごなしに否定するのは理知的なプログラマのやることではない」とあおって掴みはOK。

でも良かったのはそこまでで、

gotoで書いた方が極めて簡単に書けるコードも実際にあるわけで

と言いコード例を出してみたものの、即座にご自身で

gotoで書くとしたらこうなる。この例ももちろんgotoなしで十分書けるコードではあるのだけれど。

とダメだししてしまう。――じゃあ、例になってないじゃない、ぉぃぉぃ、とわたしも思わず PC の前で突っ込みの手。これは「せめて一つは具体例を出そうよ」と言われてしまっても しかたがない罠。


どうでもいいことは以上!・・で、件のサンプルコード。

「例外機構で言いじゃん」と言われないようしたら、微妙に不自然な感じのになってしまって、しかも 「gotoっていいねぇ」と思うのにも微妙・・と踏んだり蹴ったりなのだけれど、例外処理 でも 資源管理でもない、そういう狭間の微妙なモノについて、落としどころとなる読みやすい制御構造が欲しい、という気持ちはわかる。

finallyで代替せよという意見もあるけれども、そもそも例外発生の可能性がまったくないコードに対してtry-catch-finallyを書くことには、私はどうしても抵抗を感じてしまう。

そうそう。背中がモゾモゾしますよね。


* * *


結局ある特殊なシチュエーションでは、ある特殊なフロー制御構造があると読みやすいよね、と言う話だと思います。三大制御構造だけじゃ窮屈すぎるし読みにくくなる。メジャーな例だと イテレーションの for とか、switch-case とか。あった方が良いパターンは、もうだいたい作られていると思います。ただ、あまりにレアなケースだと、フロー制御構文のバリエーションを増やして 言語を複雑にするデメリットに対して割が合わなくなるのだと思います。

そういうのに出くわしたとき、「うーん、ちょとイマイチ綺麗に書けないなぁ、ま、でもこれ以上はムリくさいなぁ。ま、いっか」と落としこんじゃうのを良しとするか、反則技くさい フロー制御の最終兵器 goto で、専用のフロー制御を作っちゃうのを良しとするか、それが問題。難しい問題です。


わたしが思うに、goto って制御構造としてプリミティブすぎて、なんか意味づけされてないのが気持ち悪いのですよね*1。そう、プログラマの読みようによって意味が付けられる危うさに対する恐怖というか。制御構文とブロックを基本とする 他の文法からの浮きっぷりも不安を誘います。せめて「このブロックが実行されるか否か」を制御するという、他の制御構文全般のルールには従って欲しいよね?

わたしはそう感じるので個人的には goto は使ってません(でも、これはもう好みの問題だとおもうのです)。

蛇足

ちなみに件のサンプルのようなコードは、わたし的には Smalltalk 的な

SystemValues >> at: key
 | value |

 logger write: 'start'.
 value := (self cache at: key) ifNil: [
            (self database at: key) ifNil: [
                self configFile at: key ]].
 logger write: 'end'.

 ^value

みたいな

条件式 if 実行文

な構文でネストが好きです。意味的に一緒なハズの普通の if(条件式){実行文} だと「ネストが深くなるのが嫌っ!」って思っちゃうのは不思議ですね。


さて、話を戻して、「レア状況に対して、読みやすい制御構造があれば良いよね」に対面したとき、苦渋の選択をする以外の、良い解決作があります。単純です。無ければ自分で作ってしまえばいいのです。と言うわけで、次回の Smalltalk勉強会は

勉強会のお知らせです。今年もSmalltalkを盛り上げていきましょう。

日時: 2009/1/23(金) 19:00- (2,3時間程度)
場所: シンコム・システムズ・ジャパン株式会社
テキスト: 「Smalltalkで学ぶオブジェクト指向プログラミングの本質」
または「自由自在Squeakプログラミング」

詳しくは下記をどうぞ。
http://www.smalltalk-users.jp/Home/gao-zhi/dai5kaismalltalkbenkyoukai

今回は「制御構造を自分で作る」ことを仮のテーマとします。

らしいです。うにゃうにゃ。
(わたしはこの勉強会に出てないので、テーマタイトルからの単なる連想です。全然関係ない話かも^^;)






・・・・ちょっとムリに話を作りすぎたかしら。

*1:ON ERROR GOTO とかは、辞書をハッシュと呼ぶのと似たような気持ち悪さを感じます