Oh 脳《141》又・Java の常識は OOP の非常識

記事一覧Oh 脳: after ZERO《其之佰肆拾壱》

又・Java の常識は OOP の非常識
違いの分かるプログラマーを目指して

《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2009/12/03

セミナーの枕で紹介した小ネタ集です。息抜きや話題作りにどうぞ (^.^)

前回、次のような話題を提供しました。


純粋な OOP の世界では、

  • (1) a < b (2) b > a

が同じ結果になる保証はありません。そのため、
これらを演算子ではなく「メッセージ」として実現するときには注意が必要です。


今回、より卑近な事例を示すと、

  • (3) a == b (4) b == a

が同じ結果になる保証すらないのです。


... zap ...
これらの違いは、ありふれた日常の光景を暗示しています。例えば、ソムリエのA氏と自称ワイン通のB氏がいたとします。この2人の前に、高級ワインと安売ワインとが注がれた2つのワイングラスを用意します。A氏はその違いを見極めますが、B氏はその違いに気付かず…といった具合です。両氏に期待される役割の違いは、何だと思いますか。現実の世界を捨象して、より洗練された概念モデルを構築できるのが、OOP の醍醐味のひとつです。

例えば、Java では大文字小文字を区別しますが、それを区別しないものもあります。そこで、これら違いを区別をするしないクラス(Java および BASIC)を用意すると、

>>> # -------------------- test case: 1
>>> s = Java("ABC")
>>> t = BASIC("abc")
>>> s; t
'ABC'
'abc'
>>> s == t
False
>>> t == s
True

>>> # -------------------- test case: 2
>>> s = BASIC("DEF")
>>> t = BASIC("def")
>>> s; t
'DEF'
'def'
>>> s == t
True
>>> t == s
True

>>> # -------------------- test case: 3
>>> s = Java("DEF")
>>> t = Java("def")
>>> s; t
'DEF'
'def'
>>> s == t
False
>>> t == s
False

という振舞を示します。

受講者のみなさんに期待されるのは、ハイブリッド型の OOP 言語と、純粋な OOP 言語との違いを見極められるかです。そして、演算子とメッセージとの違いが分かってくると、OOP の深淵も見えてくることでしょう。「違いの分かるプログラマー」を目指して、年末年始も気を抜かず日々精進してください。


... zap ...
最後に、私から受講者のみなさんへのお年玉クイズです。

《発展課題》
次のような振舞を示すクラスを定義してください。

>>> # -------------------- test case: 4
Python 3.1 (r31:73578, Jun 27 2009, 21:49:46) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 
>>> class Piyo:
...     ???

>>> p = Piyo()
>>> 3 == p
False
>>> p == 3
True

最初に正解(はひとつとは限りません)を寄せた受講者は、豪華プレゼント(?)を獲得できるかもしれませんよ。(^^)


《note》詳細は、中級編「ソースコードの歩き方」で解説します。


Last updated♪2009/12/29