Oh 脳《141》又・Java の常識は OOP の非常識
‖記事一覧‖Oh 脳: after ZERO《其之佰肆拾壱》
又・Java の常識は OOP の非常識
違いの分かるプログラマーを目指して
♪セミナーの枕で紹介した小ネタ集です。息抜きや話題作りにどうぞ (^.^)
前回、次のような話題を提供しました。
純粋な 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》詳細は、中級編「ソースコードの歩き方」で解説します。