Posted at
SmalltalkDay 22

Smalltalkによる心のこもった計算

More than 3 years have passed since last update.


あらすじ

八百屋で100円のりんごを100個買うといくら? 1万円では、ない。への対策をPharo Smalltalkで実装してみました。


1万円ではない、だとう?

八百屋で100円のりんごを100個買うと10,000円だという計算には心がないのだそうだ。

八百屋ならおばちゃん(あるいはおじちゃん)が1,000円ぐらいまけてくれるから、答えは9,000円なのだそうだ。

なんという後出しジャンケン!

っていうか、オレ、八百屋で1,000円もまけてもらったことないです。orz

しかし、ビジネスをする上でこの手の後出しジャンケンは日常茶飯事。後出しジャンケンされてもニッコリと微笑んでその上をいってやろうではないか。それがビジネスSmalltalkerの生きる道である。キリリ


八百屋さんのビジネスロジック

まずは価格をオブジェクトで表現してみよう。ここではPharo3.0を使う。Heartful-Computationpパッケージ内で作業することにしよう。


Heartful-Computation

Object subclass: #Money

instanceVariableNames: 'unit number'
classVariableNames: ''
category: 'Heartful-Computation'

Moneyオブジェクトは通貨単位と数からなっています。メソッドは以下の5つ。


Money-class

unit: aString number: aNumber

^ self new
setUnit: aString number: aNumber;
yourself


Money-class

yen: aNumber

^ self unit: '¥' number: aNumber


Money

* aNumber

^ self class unit: unit number: number * aNumber


Money

printOn: aStream

aStream nextPutAll: unit.
number printOn: aStream.


Money

printOn: aStream

aStream nextPutAll: unit.
number printOn: aStream.

わかりやすいimmutableなオブジェクトですね。当然です、金額を提示した後で書き変えられたらたまりませんから。ビジネスの常識ですキリリ。

Smalltalkらしさのアピールとして、Numberにyenメッセージを追加。


Number

yen

^ Money yen: self


心あるObjectBoyの登場

では、八百屋の計算をするオブジェクトをつくります。


Heartful-Computation

Object subclass: #ObjectBoy

instanceVariableNames: 'lastAnswer'
classVariableNames: ''
category: 'Heartful-Computation'

まずは素直な八百屋計算を実装します。


ObjectBoy

computeUnit: aMoney amount: anInteger

^ lastAnswer := aMoney * anInteger

そして後出しジャンケンへの対応


ObjectBoy

rightAnswer: anObject

lastAnswer ifNotNil: [ lastAnswer become: anObject ]


さあ、ObjectBoyの「心」を見よ!


Workspace

| 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を見てみよう。

スクリーンショット 2014-12-19 6.31.46.png

バッチリ。Moneyオブジェクトはimmutableだということをお忘れなく。

これで見積書に間違った計算を書いて郵送しちゃってもオッケーですキリリ。