NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
これは2004年11月4日から2006年2月18日までZopeで運用していたCOREBlogの静的なアーカイブです。 新しい日記は「西尾泰和の日記」で運用しています。

ifだってgotoですよ?

gotoを使って汚く書かくとあまりに読みにくいコードになるせいで、 「gotoは悪」という考え方が蔓延していますよね。 でもそれって手段と目的が入れ替わっているのではないでしょうか。 gotoを使わないことが重要なのではなくて、論理の筋道がわかりやすいことが重要なんですから。 結局のところ、順次実行以外はifだろうがbreakだろうが、すべて実行する位置がジャンプするという意味ではgotoなのですし。

というわけで悪いコードの例。

for id in idList:
	try:
		f=getCacheFilename(id)
		data=file(f).read() # キャッシュから読めるか試す
	except:
		try:
			# キャッシュになかったので外部サーバから読む
			url=getUrl(id)
			data=urlopen(url).read()
		except:
			# それすらもできなかったのでデータはなし
			print "Error", f
			data=None
		
		if data != None: # データが取れていればキャッシュに保存
			file(f, "w").write()
	
	if data != None:
		doSomeProcess(data)
不必要なジャンプがいくつかあります。 より大きなジャンプを使うことで取り除くことができます。 改良案はExtendの中に。



for id in idList:
	try:
		f=getCacheFilename(id)
		data=file(f).read() # キャッシュから読めるか試す
	except:
		try:
			# キャッシュになかったので外部サーバから読む
			url=getUrl(id)
			data=urlopen(url).read()
		except:
			# それすらもできなかったのでデータはなし
			print "Error", f
			continue # データが取れなかったのでこのIDはあきらめる
		
		file(f, "w").write()

	doSomeProcess(data)
データが取れなかったんだからずるずるとループの以下の部分をifで条件分けしながら実行したりせずにさっさとあきらめろ、という話ですね。

[Python]  @2004-12-27 16:47 | Comments (1)
<< 車の練習を | Main | 税金はややこしいから嫌いだ >>

Comments
センセーショナルなタイトルを付けすぎました(反省) by nishio @2004-12-29 18:15

トラックバックが化けていたので削除してリンクして見ました。「if 文と goto文は違います
おっしゃるとおり、if文とgoto文は違います。確かにそのとおりです。タイトルがちょっとセンセーショナルすぎました。すみません。

まぁ、いいたかったことを簡潔に整理すると、
「『gotoがあるソースコードはgotoのないソースコードより汚い』という短絡的な思考をする人がいるけれども、
ifだろうがbreakだろうが、すべて実行する位置がジャンプするという意味ではgotoなのだから、不適切な使い方をすれば汚くなる」
ということです。

不要なifのある実例にPythonコードを使ったのが却って誤解を助長したかもしれませんね。
Pythonにgotoはありません。「gotoを使う/使わない」という話題ですから、
Cのようなgotoを使うことのできる言語を使ってサンプルコードを書いたほうが親切だったかもしれませんね。

このページは静的なアーカイブなので新しいコメントは受け付けておりません。ご意見ご感想はお気軽にメールでどうぞ。coreblog「あっとまーく」nishiohirokazu.org。
Trackbacks

PageView: 1514 Score: 111.25153 このカウンタは2006-03-26 11:05で停止しています。
Powered by COREBlog

NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
Contact me: coreblog"at mark"nishiohirokazu.org
Access counter: This Page:712476 Total:1827187 during 2004/01/23-2006/03/26