if と別れる50の方法《02》OOP による解法(思考回路を switch)
Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
OOP による解法(思考回路を switch)
■ 概要
if/switch 文は多くの問題を抱え、OOP を実践するときの「障害」になります。
伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。
■ 関連記事
- Java プログラマーのための Python 導入ガイド
- 例題で学ぶ Jython/Swing デザインパターン《Jython2.5》改訂版
- ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》改訂版
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
事例:JPL, p.234
JPL の読者の多くは、以下の 事例 によって、switch 文を知ることになるでしょう。
《承前》
■ 思考回路を switch:OOP による解法
def hexValue(ch): # step 4 return "0123456789ABCDEF".index(ch.upper()) # 大文字小文字は無視してかまわないから、 # 指折り数えて何番目になるか教えてくれますか?
これの何処が「OOP による解法」なのかと、訝しがる人もいるでしょう。その理由を、これから順を追って説明します。いつの日か、その理由を自分の言葉で説明できたなら「OOP の免許皆伝」です。(^.^)v
《Note》この事例は意味深長です。
オブジェクト指向の基本
》作業中です《
■ メッセージの送受信
オブジェクト指向の原則は「オブジェクトにメッセージを送る」こと(メッセージ送受信)です。Smalltalk と違って、メッセージをそのまま表現できないプログラミング言語では、代用表現(メソッド呼び出しやイベントなど)を用います。
- 真樹育未「オブジェクト指向ってなにができんの?」Computer Today, 1995/11.
電子メールに例えると、受取人 to: が文字列なら、件名 subject: はメソッド呼び出し index(ch.upper()) で、メールの内容がメソッドの本体に相当します。
step4 の意味(意義)を、オブジェクト指向の基本に沿って読み解くと、文字列インスタンス "0123456789ABCDEF" は「大文字小文字は無視してかまわないから、指折り数えて何番目になるか教えてくれますか?」というメッセージを受信したことになります。
コードの断片に ch.upper() とあるのは「大文字小文字は無視してかまわない」という日本語のメッセージを、プログラミング言語 Python で代用表現したにすぎません。同じ内容を英語で表現する違いと同様に、Java では違った表現になりますが、意図は同じです。
コードの断片に index(...) とあるのは「指折り数えて何番目になるか」というメッセージを、Python で代用表現したにすぎません。同意語 find(...) による表現も可能ですが、意図は同じです。index finger(人差し指)にもあるように、また、inch や寸など洋の東西を問わず、長さの単位として指を基準にするのも人間の知恵のひとつです。
受取人に日本語が通じなければ、英語のメールを送る必要があるかもしれません。受取人が to: "0123456789abcdef" なら、メーセージ表現の一部を ch.lower() に代えるでしょう。受取人が変わっても同じ内容のメッセージが有効になる(意味が通じる)ためには、これを抽象表現に代える必要があります。それは、受講者のみなさんへの宿題にして、話を進めます。
Tips
》作業中です《
■ 受講者への課題
日本語(全角文字)による十六進表記を考案して、10進数に変換するにはどうしますか?
「0・1・2・3・4・5・6・7・8・9・A・B・C・D・E・F」 「零・壱・弐・参・肆・伍・陸・漆・捌・玖・?・?・?・?・?・?」たとえば、こんな具合にです。