OOP への道:if と別れる50の方法《06》The Java™ Tutorials の事例から

記事一覧if 篇for 篇配列 篇

Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
The Java™ Tutorials の事例から
#1: SP による伝統的な解法

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

■ 概要

if/switch への未練を断ち切るのは容易ではありません。

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

The if-then-else Statement

The Java™ Tutorials では、次の《事例》を紹介しています。

class IfElseDemo {
    public static void main(String[] args) {

        int testscore = 76;
        char grade;

        if (testscore >= 90) {
            grade = 'A';
        } else if (testscore >= 80) {
            grade = 'B';
        } else if (testscore >= 70) {
            grade = 'C';
        } else if (testscore >= 60) {
            grade = 'D';
        } else {
            grade = 'F';
        }
        System.out.println("Grade = " + grade);
    }
}

テストの成績に合わせて、5段階評価を与えます。

grade ¶ 新英和中辞典第6版 (研究社)
  • 3 《米》 (生徒の)成績(点), 評点,評価 《★【解説】 次の 5 段階評価が普通: A (Excellent 秀), B (Good 優), C (Fair,Average,Satisfactory 良), D (Passing 可), F (Failure 不可); D 以上が合格》.

OOP による解法への準備

OOP による解法を示す前に、前述した事例を再考します。

■ 事例:16進表記

前述した《事例》をクラスを用いて再構成すると、次のようになります。「指折り数えて何番目になるか」というメッセージを忠実に再現すると、次のようになります。

class HexDemo(object):
    def __init__(self, hex):
        self.hex = hex
        
    def index(self, s):
        for n, e in enumerate(self.hex):
            if s == e:
                return n
        else:
            return -1

インスタンス属性 self.hex が保持する各各要素(長さ1の文字列)e を順にたどりながら、条件式 s == e を満たすときのオフセット n をリターン値とします。一致するものがないときには、-1 をリターン値とします。

各要素を順にたどりながら、条件を満たすときの値を得ることが「指折り数えて何番目になるか」に相当します。

これを実行すると、次のような結果が得られます。

def ex2():
    demo = HexDemo("0123456789ABCDEF")
    for e in "0123456789ABCDEF@":
        print("Hex = %2d"%demo.index(e), ":", e)

>>> ex2()
Hex =  0 : 0
Hex =  1 : 1
Hex =  2 : 2
Hex =  3 : 3
Hex =  4 : 4
Hex =  5 : 5
Hex =  6 : 6
Hex =  7 : 7
Hex =  8 : 8
Hex =  9 : 9
Hex = 10 : A
Hex = 11 : B
Hex = 12 : C
Hex = 13 : D
Hex = 14 : E
Hex = 15 : F
Hex = -1 : @
■ 事例:5段階評価
尺取虫大辞林第二版 (三省堂
  • シャクガ科のガの幼虫。広葉樹の葉を食害するものが多い。細長い芋虫で、人が指で布地の寸法を測るような独特の歩き方をするのでこの名がある。オギムシ。しゃくとり。
class IfElseDemo(object):
    def __init__(self, score):
        self.score = score
        self.grade = "ABCD"
        
    def index(self, s):
        for n, e in enumerate(self.score):
            if s >= e:
                return self.grade[n]
        else:
            return "F"

各要素を順にたどりながら、条件を満たすときの値を得ることが「指で寸法を測るといくつになるか」に相当します。

これを実行すると、次のような結果が得られます。

def ex1():
    demo = IfElseDemo([90, 80, 70, 60])
    for e in range(0, 101, 10):
        print("Grade = %s"%demo.index(e), ":", e)

>>> ex1()
Grade = F : 0
Grade = F : 10
Grade = F : 20
Grade = F : 30
Grade = F : 40
Grade = F : 50
Grade = D : 60
Grade = C : 70
Grade = B : 80
Grade = A : 90
Grade = A : 100

Tips

》作業中です《

Last updated♪2009/07/27