Oh 脳《118》続・アナログ思考 Java からディジタル思考 Jython への扉を開く

記事一覧Oh 脳: after ZERO《其之佰拾捌》

続・アナログ思考 Java から
ディジタル思考 Jython への扉を開く

《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2009/06/15

セミナーの枕で紹介した小ネタ集です。息抜きや話題作りにどうぞ (^.^)

■ 関連記事
From: 	ひよ子のきもち 
件名:	《セミナー通信》受講者のみなさんへ@2009/06/24
日付: 	 2009/06/24 11:03

------------------------------(きりとれません)------------------------------
先週末に配信する予定が、Jython2.5.0 のリリース(good news)やら、ネットワークの不調(bad news)やらで、今日までずれ込んでしまいました。2か月余(βリリース以降)も待たされましたが、Jython2.5rc4 を経て、ようやく Jython2.5.0 がリリースされたわけです。

そこで、Jython2.5 対応版として(Jython2.5b3 以降)過去の記事に加筆、再構成したものを段階的に公開しています。

http://d.hatena.ne.jp/kotsubu-chan/20031130
・例題で学ぶ Jython/Swing デザインパターン
http://d.hatena.ne.jp/kotsubu-chan/20090419
Java プログラマーのための Python 導入ガイド

Jython2.5 対応版の次は、IronPython2.6 対応版の記事も近々公開予定です。


... zap ...

《何が問題か》続・アナログ思考からディジタル思考への扉を開く

Python には、伝統的なC言語風の for 文や悪名高い switch 文がありません。それには理由があります。その理由のひとつは、これらが「コードの汚染」を誘発するからです。


「for/switch を用いずに」コードを書いてくださいという課題を与えたとします。Java のコードを反面教師にして、Jython で置き換えるのです。すると、for を while に、switch を if に置き換えただけというコードに遭遇します。これは、見かけ倒しで、本質的な問題は解消されません。


話を進める前に、ひとつ注意しておきたいのは、Python にも for 文はあります。しかし、これはC言語風の for 文とは異質のものです。たまたま同じ綴りなので「同列に」比較され、事態はさらに混沌とします。言語によっては、foreach として、for とは「一線を画する」ことを強調したものもあります。


for/switch がコードを汚染する様子は、何度も紹介してきました。今回は、Java プログラマーにありがちな FAQ を取り上げます。確かに、後に導入された拡張 for 文を使えば、Jython 版と同等の表現が可能です。ここでも、同じ綴りを採用したがために、これらを「同列に」比較するという迷宮の扉を開きかねません。ときに、拡張 for 文を使っていながら、伝統的なスタイルに「先祖返り」しているコードを見掛けたりします。これは「CD の上にレコード針を降ろす」ようなものです。どうやら、アナログ思考からディジタル思考へのパラダイムシフトが遅々として進まないのは「地デジ化」だけではなさそうです。


閑話休題。拡張 for 文を使ったリファクタリング後のコードは、Python の for 文で実現されたコードと同様に、コードの汚染を防ぎます。しかし、それまでに数年を要しました。いち早く Jython を導入したのは、Java の言語拡張を待っていられなかったからです。同様に(近い将来に採択されるであろう)Java の言語拡張を待たずに、Jython ではその恩恵に浴する…なども、効能のひとつです。もちろん、JRuby/Groovy なども、選択肢のひとつです。


参考までに、旧いセミナー資料を抜粋します。これは、Java に拡張 for 文が導入される前に作成したものです。早速、Jython2.5.0 で動作を確認しています。受講者のみなさんも「CD の上にレコード針を降ろすようなコード」を記述していないか、以下を参考に、自分診断してみてください。

$ cat note_foreach.py 
## ----------------------------------------
s = list("ABC"); print s,"\t# list"

## ----------------------------------------
print "-"*20,"while: C-like ... ignore 'e'"
i = 0
for e in s:                     # (x_x) too bad
    print s[i]; i += 1

print "-"*20,"for: C-like ... ignore 'e'"
for i,e in enumerate(s):         # (x_x) too bad
    print s[i]

print "-"*20,"for: Jython"
for e in s:
    print e

## ----------------------------------------
print "="*40

## ----------------------------------------
from java.util import Vector

s = list("ABC")
v = Vector(s); print v,"\t# Vector"

print "-"*20,"Vector: Java-like ... ignore 'e'"
for i,e in enumerate(v):         # (x_x) too bad
    print v[i]

print "-"*20,"Vector: Jython"
for e in v:
    print e

$ jython2.5.0 -i note_foreach.py 
['A', 'B', 'C'] 	# list
-------------------- while: C-like ... ignore 'e'
A
B
C
-------------------- for: C-like ... ignore 'e'
A
B
C
-------------------- for: Jython
A
B
C
========================================
[A, B, C] 	# Vector
-------------------- Vector: Java-like ... ignore 'e'
A
B
C
-------------------- Vector: Jython
A
B
C
  • -

Oh 脳《119》続々・アナログ思考 Java からディジタル思考 Jython へ - 続・ひよ子のきもち に続く…。