あらすじ
八百屋で100円のりんごを100個買うといくら? 1万円では、ない。への対策をPharo Smalltalkで実装してみました。
1万円ではない、だとう?
八百屋で100円のりんごを100個買うと10,000円だという計算には心がないのだそうだ。
八百屋ならおばちゃん(あるいはおじちゃん)が1,000円ぐらいまけてくれるから、答えは9,000円なのだそうだ。
なんという後出しジャンケン!
っていうか、オレ、八百屋で1,000円もまけてもらったことないです。orz
しかし、ビジネスをする上でこの手の後出しジャンケンは日常茶飯事。後出しジャンケンされてもニッコリと微笑んでその上をいってやろうではないか。それがビジネスSmalltalkerの生きる道である。キリリ
八百屋さんのビジネスロジック
まずは価格をオブジェクトで表現してみよう。ここではPharo3.0を使う。Heartful-Computationpパッケージ内で作業することにしよう。
Object subclass: #Money
instanceVariableNames: 'unit number'
classVariableNames: ''
category: 'Heartful-Computation'
Moneyオブジェクトは通貨単位と数からなっています。メソッドは以下の5つ。
unit: aString number: aNumber
^ self new
setUnit: aString number: aNumber;
yourself
yen: aNumber
^ self unit: '¥' number: aNumber
* aNumber
^ self class unit: unit number: number * aNumber
printOn: aStream
aStream nextPutAll: unit.
number printOn: aStream.
printOn: aStream
aStream nextPutAll: unit.
number printOn: aStream.
わかりやすいimmutableなオブジェクトですね。当然です、金額を提示した後で書き変えられたらたまりませんから。ビジネスの常識ですキリリ。
Smalltalkらしさのアピールとして、Numberにyenメッセージを追加。
yen
^ Money yen: self
心あるObjectBoyの登場
では、八百屋の計算をするオブジェクトをつくります。
Object subclass: #ObjectBoy
instanceVariableNames: 'lastAnswer'
classVariableNames: ''
category: 'Heartful-Computation'
まずは素直な八百屋計算を実装します。
computeUnit: aMoney amount: anInteger
^ lastAnswer := aMoney * anInteger
そして後出しジャンケンへの対応
rightAnswer: anObject
lastAnswer ifNotNil: [ lastAnswer become: anObject ]
さあ、ObjectBoyの「心」を見よ!
| boy answer |
boy := ObjectBoy new.
answer := boy computeUnit: 100 yen amount: 100.
Transcript cr; show: 'ここで変数answerに「', answer printString, '」と言質を取られる'.
Transcript cr; show: '9000円よ、あなたの計算には心がないわ!'.
boy rightAnswer: 9000 yen.
Transcript cr; show: 'ふ、だから最初から言ってるじゃん、', answer printString, 'だって!'.
さて、Transcriptを見てみよう。
バッチリ。Moneyオブジェクトはimmutableだということをお忘れなく。
これで見積書に間違った計算を書いて郵送しちゃってもオッケーですキリリ。