if と別れる50の方法《00》JPL の事例から

記事一覧if 篇for 篇配列 篇

Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
JPL の事例から

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

■ 概要

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

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

何が問題か

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》この事例は意味深長です。

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

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

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

》作業中です《


Last updated♪09/07/09