if と別れる50の方法《02》OOP による解法(思考回路を switch)

記事一覧if 篇for 篇配列 篇

Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
OOP による解法(思考回路を switch)

《著》真樹育未・後藤いるか・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第0版♪1988/10/12 ● 第1版♪1993/05/23 ● 第2版♪2003/05/25

■ 概要

if/switch 文は多くの問題を抱え、OOP を実践するときの「障害」になります。

伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。

事例:JPL, p.234

JPL の読者の多くは、以下の 事例 によって、switch 文を知ることになるでしょう。

承前

■ 思考回路を switch:OOP による解法

def hexValue(ch):    # step 4
    return "0123456789ABCDEF".index(ch.upper())    # 大文字小文字は無視してかまわないから、
                                                   # 指折り数えて何番目になるか教えてくれますか?

これの何処が「OOP による解法」なのかと、訝しがる人もいるでしょう。その理由を、これから順を追って説明します。いつの日か、その理由を自分の言葉で説明できたなら「OOP の免許皆伝」です。(^.^)v

《Note》この事例は意味深長です。

意味深長大辞林 第二版 (三省堂
  • 奥深い意味をもっていること。裏に別の意味が隠されていること。また、そのさま。

OOP の知識がなくても、このコードは記述できます。「釣りはフナに始まりフナに終わる」とも言われます。初心者が書いた稚拙なコードの断片と、熟達者が書いた洗練されたものと、一見しただけでは区別できないことがあります。ピカソの絵を見て「あれならウチの子供の方が上手い」というのと同じです。試しに、このコードの断片を見せて「どこが OOP による解法」なのか、身の回りの誰かに質問してみてください。その人の造詣の深さを垣間見ることができるかもしれませんよ。(^.^)

造詣大辞林 第二版 (三省堂
  • 学問・芸術・技術などについての深い知識やすぐれた技量。

オブジェクト指向の基本


》作業中です《

■ メッセージの送受信

オブジェクト指向の原則は「オブジェクトにメッセージを送る」こと(メッセージ送受信)です。Smalltalk と違って、メッセージをそのまま表現できないプログラミング言語では、代用表現(メソッド呼び出しやイベントなど)を用います。


電子メールに例えると、受取人 to: が文字列なら、件名 subject: はメソッド呼び出し index(ch.upper()) で、メールの内容がメソッドの本体に相当します。

step4 の意味(意義)を、オブジェクト指向の基本に沿って読み解くと、文字列インスタンス "0123456789ABCDEF" は「大文字小文字は無視してかまわないから、指折り数えて何番目になるか教えてくれますか?」というメッセージを受信したことになります。

コードの断片に ch.upper() とあるのは「大文字小文字は無視してかまわない」という日本語のメッセージを、プログラミング言語 Python で代用表現したにすぎません。同じ内容を英語で表現する違いと同様に、Java では違った表現になりますが、意図は同じです。

コードの断片に index(...) とあるのは「指折り数えて何番目になるか」というメッセージを、Python で代用表現したにすぎません。同意語 find(...) による表現も可能ですが、意図は同じです。index finger(人差し指)にもあるように、また、inch や寸など洋の東西を問わず、長さの単位として指を基準にするのも人間の知恵のひとつです。

digit ¶ 新英和中辞典第6版 (研究社)
  • 1 (手・足の)指.
  • 3 (個々の)アラビア数字 《0‐9 のうちのひとつ; 本来指で数えた》.

ラテン語「指」の意; digital

受取人に日本語が通じなければ、英語のメールを送る必要があるかもしれません。受取人が to: "0123456789abcdef" なら、メーセージ表現の一部を ch.lower() に代えるでしょう。受取人が変わっても同じ内容のメッセージが有効になる(意味が通じる)ためには、これを抽象表現に代える必要があります。それは、受講者のみなさんへの宿題にして、話を進めます。

ポリモフィズムの導入

この段階でもまだ、これの何処が「OOP による解法」なのかと、納得できない人もいるでしょう。真の理解に到達するには「ポリモフィズム」に関する知識が必要になります。後の記事「ポリモフィズムの導入」でも、この事例の意味(意義)について再考します。

Tips

》作業中です《
■ 受講者への課題

日本語(全角文字)による十六進表記を考案して、10進数に変換するにはどうしますか?

「0・1・2・3・4・5・6・7・8・9・A・B・C・D・E・F」
「零・壱・弐・参・肆・伍・陸・漆・捌・玖・?・?・?・?・?・?」

たとえば、こんな具合にです。

Last updated♪2009/07/10