OOP への道:if と別れる50の方法《06》The Java™ Tutorials の事例から
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