vieweditattachhistoryswikistopchangessearchhelp

Slate で bankAccount

SlatebankAccount を書いてみました。Slate のデフォルトの clone はたんにコピーを作るだけで、しかもメソッド(総称関数)に関する謎の副作用もあるようで使いづらかったので、これとは別に、レシーバをペアレント(aka プロトタイプ)にしたチャイルドを作るメソッド klone を定義して使っています。#slotsDo: とかを使えればよかったのですが、結局うまく動かずじまいなのでプロトタイプのダミーのコピーを作って、そこからスロットを削除する式の返値がスロットに束縛されていたオブジェクトであることを利用するなど、かなりトリッキーなコードになってしまっています。ちょっと買ってたのに…、だめだめじゃん…。> Slate トーンダウン中。--sumim
self@(Cloneable traits) klone [| klone dummy | 
  klone: Cloneable clone. 
  dummy: self clone.
  self slotNames do: [| :each | 
    (self delegateNames includes: each) not ifTrue: [
      klone addSlot: each valued: (dummy removeSlotNamed: each)]].
  klone addDelegate: #traits valued: self].

lobby addSlot: #bankAccount valued: Cloneable clone.  "lobby は省略可"
bankAccount addSlot: #dollars valued: 0.
self@bankAccount deposit: x@(Number traits) [self dollars: (self dollars + x)].
  "メソッドは総称関数的に定義"
  "@ はパラメータ変数の型指定。ちなみに Slate では a Point 生成にはカンマを使う"
self@bankAccount withdraw: x@(Number traits) [self dollars: ((self dollars - x) max: 0)].

bankAccount dollars: 200.
=> 200.
bankAccount deposit: 50.
=> 250
bankAccount withdraw: 100.
=> 150
bankAccount withdraw: 200.
=> 0

addSlot: #myAccount valued: bankAccount klone.
  "bankAccount をペアレント(aka プロトタイプ)とするチャイルドの作成"

myAccount dollars.
=> 0  "プロトタイプの同名スロット値と同じ値を持つ"
myAccount dollars: 500.
=> 500
bankAccount dollars.
=> 0  "プロトタイプの同名スロット値には影響が及ばない"

addSlot: #stockAccount valued: bankAccount klone.
stockAccount addSlot: #numShares valued: 0.
stockAccount addSlot: #pricePerShare valued: 30.
self@stockAccount dollars [self numShares * self pricePerShare].
self@stockAccount dollars: x@(Number traits)
  [self numShares: ((x as: Float) / self pricePerShare) truncated. self dollars].

stockAccount dollars: 300.
=> 300
stockAccount numShares.
=> 10
stockAccount dollars: 150.
=> 150
stockAccount numShares.
=> 5

addSlot: #myStock valued: stockAccount klone.

myStock dollars: 600.
=> 600
myStock numShares.
=> 20
myStock deposit: 60.
=> 660
myStock numShares.
=> 33
myStock withdraw: 90.
=> 570
myStock numShares.
=> 19

self@bankAccount deposit: x@(Number traits) [self dollars: (self dollars + (x * 0.9))].
self@bankAccount withdraw: x@(Number traits) [self dollars: ((self dollars - (x * 0.9)) max: 0)].
  "#deposit: 、#withdraw: の仕様を変えてみる"

bankAccount dollars.
=> 0
bankAccount deposit: 100.
=> 90.0
myAccount dollars.
=> 500
myAccount withdraw: 100.  "チャイルドたちにもペアレントに対する改変の影響が及ぶ"
=> 410.0
stockAccount dollars.
=> 150
stockAccount deposit: 100.
=> 240
myStock dollars.
=> 480.0
--sumim



このページを編集 (2961 bytes)


Congratulations! 以下の 2 ページから参照されています。

This page has been visited 2881 times.