if と別れる50の方法《00》JPL の事例から
Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
JPL の事例から
■ 概要
if/switch 文は多くの問題を抱え、OOP を実践するときの「障害」になります。
伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。
■ 関連記事
- Java プログラマーのための Python 導入ガイド
- 例題で学ぶ Jython/Swing デザインパターン《Jython2.5》改訂版
- ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》改訂版
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
何が問題か
Java 言語の解説書 JPL には、伝統的な switch 文を利用した事例を紹介しています。しかし、switch 文はいくつかの問題を抱え、OOP を実践 するときの「障害」になりがちです。そこで、その問題点を明らかにするとともに、それを解消する術を紹介します。
switch 文の隘路
Python には、構造化プログラミング〔SP; Structured Programming〕を支援する、伝統的な switch 文がありません。そこで、代用表現として、
- if-else で代用する
- 辞書 dict を導入する
などが考えられます。しかし、switch 文に伴うコードの汚染を防ぐ、本質的な問題解決には至りません。そこで、
- OOP を導入する
という第3の選択肢が考えられます。
事例:JPL, p.234
JPL の読者の多くは、以下の事例によって、switch 文を知ることでしょう。
public int hexValue(char ch) throws NonHexDigitException {
switch (ch) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
return (ch - '0');
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
return (ch - 'a') + 10;
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
return (ch - 'A') + 10;
default:
throw new NonHexDigitException(ch);
}
}
》作業中です《
事例:Python3.1
いきなり最終回。まずは「OOP を導入」した解法から紹介します。
def hexValue(ch): return "0123456789ABCDEF".index(ch.upper())
これの何処が「OOP による解法」なのかと、訝しがる人もいるでしょう。その理由は、次項から順を追って説明します。いつの日か、その理由を自分の言葉で説明できたなら「OOP の免許皆伝」です。(^.^)v
《Note》この事例は意味深長です。
def ex(): for e in "0123456789abcdefABCDEF": print(e, ":", hexValue(e)) >>> ex() 0 : 0 1 : 1 2 : 2 3 : 3 4 : 4 5 : 5 6 : 6 7 : 7 8 : 8 9 : 9 a : 10 b : 11 c : 12 d : 13 e : 14 f : 15 A : 10 B : 11 C : 12 D : 13 E : 14 F : 15 >>> hexValue("A") 10 >>> hexValue("@") Traceback (most recent call last): File "", line 1, in File "exSwitch.py", line 55, in hexValue return "0123456789ABCDEF".index(ch.upper()) ValueError: substring not found
Tips
》作業中です《