余録

セミナー受講者の中にも(コンサルティングの現場でも)同様のパラダイムシフトに困惑する場面に遭遇します。この傾向が、同様の著書に起因するのか定かではありません。ただ「そこに書かれてあることを鵜呑みにせず」批判的な目で見る姿勢も必要です。それはもちろん、この記事にも言えますが…。(^^)
switch でも問題解決できるなら、OOP を導入するまでもなく、SP でも事足ります。それが目的ではなく、手段のひとつに過ぎないことを忘れる滑稽さには「ワインバーグの金槌の法則」が見事に当てはまります。

テストケース

動作を確認するために、次のようなテストケースを用意しました。

## ---------- test case ----------
cards = []
for number in range(1, 13+1):
    cards.append(Card(Card.SPADE  , number))
    cards.append(Card(Card.DIAMOND, number))
    cards.append(Card(Card.CLUB   , number))
    cards.append(Card(Card.HEART  , number))
cards.append(Card(0, Card.JOKER))

for n, e in enumerate(cards):
    print e,
    if n%4==3: print

《関連記事》

《Note》タイトルを「一利」ではなく「一理」としてあるのは意図的なものです。その謎解きは本文で ...φ(^.^)

受講者への課題

《余録》セミナー教材の中には「反面教師」として引用しているものも少なくありません。たとえば…

参考文献
なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング

一見すると、クラス/メソッドを使って記述してあるので、OOP を実践しているかのように錯覚します。しかし、よく見ると「クラス/メソッドの本体に、SP を踏襲したコードの断片を押し込んだだけ Oh 脳《19》うしとカエル - 続・ひよ子のきもち」という箇所が少なくありません。皮肉にも「なぜ、オブジェクト指向開発ができないのか」を著書が実践してしまう結果になっています。確かに、Java の壁は克服できるかもしれませんが、残念ながら、オブジェクト指向の壁は克服できそうにもありません。

《課題》次のメソッド __str__ の本体を(switch を彷彿とさせる)if/elif/else の羅列を用いないで、実現してください。□

## ---------- ISBN-10: 477412222X, pp.163-166
class Card:
    JOKER   = 0
    SPADE   = 1
    DIAMOND = 2
    CLUB    = 3
    HEART   = 4

    def __init__(self, suit, number):
        self.suit = suit
        self.number = number

    def __str__(self):
        s = []
        if self.number > 0:
            if   self.suit == self.SPADE:
                s.append("S")
            elif self.suit == self.DIAMOND:
                s.append("D")
            elif self.suit == self.CLUB:
                s.append("C")
            elif self.suit == self.HEART:
                s.append("H")
            else:
                pass

            if   self.number == 1:
                s.append("A")
            elif self.number == 10:
                s.append("O")
            elif self.number == 11:
                s.append("J")
            elif self.number == 12:
                s.append("Q")
            elif self.number == 13:
                s.append("K")
            else:
                s.append(str(self.number))     
        else:
            s.append("JK")
        return "".join(s)

問題点だけを示すために、同じ機能を Python で実現したコードの断片を提示します。これは「反面教師」ですから、良い子のみなさんは真似をしないように。(^^)


《ヒント》 OOP の基礎を正しく理解できていれば簡単です。また、正解もひとつとは限りません。その中には、メソッドの本体を1行(72 文字未満)で記述できるものもあります。□

    def __str__(self):
        ....+....1....+....2....+....3....+....4....+....5....+....6....+....7..

この続きは、セミナー会場で ...φ(^.^)

《こちらに移動中です》
Python.use(better) 記事一覧
ifと別れる50の方法
《31》switchは百害あって一理なし

《著》後藤いるか・森こねこ《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2005/03/12 ● 更新♪2009/01/14