5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SmalltalkAdvent Calendar 2014

Day 22

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

Posted at

あらすじ

八百屋で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だということをお忘れなく。
これで見積書に間違った計算を書いて郵送しちゃってもオッケーですキリリ。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?