What have you found for these years?

2009-08-19

oop without state with fp (1)

(參考上篇 Josh 的 comment

唔,本來是打算先看完 Josh 給的 Oleg 的 link:
Purely-functional Object-Oriented System
因為不長,看起來也不難,而且可能很有趣...(Oleg 嘛? XD)

但是似乎比較像是實作,而不是使用,而我現在是在想使用。
因此還是先放著,先試我想到的東西,避免拖太久會忘記。
有些時候,沒有一氣呵成,真的會完全散掉...
類似的經驗不少了 XD 三分鐘熱度我最行...
(Oleg 那兩篇就先放在 tab 上,這樣不會忘記)

總之目前試到現在,雖然覺得有些地方不是很順利,
例如有些地方需要跟 C++ 或 Haskell 一樣一直重複,
沒辦法像 Ruby 那樣幾乎可以把任何重複的地方抽出來。

成果我有點想放在 gist 上,但還在實驗階段,
會一直修改,而修改 gist 會吐訊息給所有 follower,
我也不想用沒意義的東西吵我的 follower @@
因此... 也罷,雖然怪怪的,先開個 local git repo 好了。

寫起來可能有點像這樣:

val Footman = new Unit( "Footman",
List(Fire.Large),
Property("hp" -> 200,
"mp" -> 40))
println(Footman)
println(Footman.hp_reduce(10))

輸出:
Unit(Footman,List(Fire(100)),Map(hp -> 200, mp -> 40),Map(hp -> 200, mp -> 40))
Unit(Footman,List(Fire(100)),Map(hp -> 200, mp -> 40),Map(hp -> 190, mp -> 40))

每一次狀態改變,都會產生新的 Unit.
每一種單位,由一個 Unit instance 決定。
直覺會想到的作法,Footman 會是 class,
但是這樣彈性很低,整個 Footman 會受限。
因此才決定 Footman 只是 Unit 的 instance.

所以 Env 是:
type ObjectId = Int
type Env = TreeMap[ObjectId, Unit]
一個 Game 就是 List[Env] 之類的。
這樣每一個狀態都可以做 snapshot,
要做 undo/replay 之類的功能也是輕而易舉...

pattern matching 也可以拿來做 multimethod.
感覺好像很有發揮的空間?大概試完之後,
會試試看能不能改寫成 Haskell. 如果很容易,
那 OOP 就真的沒用了。如果有點麻煩,那或許 OOP 還有用武之處。

另外,Terrain 是 Unit 的 subclass,
而 Plains 則是 Terrain 的 subclass.
因此所有會在地圖上的東西,都是 Unit.
而 Creature / Terrain 之間有什麼共同屬性,還要想想。
整個物件樹應該會很巨大... 還沒試的部份有:
Action, Buff, Card, Turn, Ability, 等等。

邊想這個,Plumm 問到如果寫 Scala 的書?
嗯... 我會想取名為 Scala, where OOP meets FP
目標讀者則是 OOP, 略懂 XD
第零章則講 FP 基本概念之類的。
用以上的實驗當做範例,搭配 C++ / Java 比較作法,
好像是一個題材可以試試。不過如果妄想把 Scala 講完...

君不見 Programming in Scala 就寫了七百多頁,
而且老實講我還覺得他沒寫得很完整,很多細節沒說 @@
只是該有的都有了這樣...

所以我覺得專注在某個主題會比較好一點,實在不喜歡磚頭書 @@

2 retries:

Plumm said...

>例如有些地方需要跟 C++ 或 Haskell 一樣一直重複,
>沒辦法像 Ruby 那樣幾乎可以把任何重複的地方抽出來。

有例子?

Lin Jen-Shin (godfat) said...

scala 例子:

case class Creature( name: String,
elememts: List[Element],
property: Property,
state: Property)
extends Unit(name, elememts, property, state)

c++ 應該不用說了吧?差不多
haskell 我要找找... 不夠熟
那時候有些地方是要 copy & paste 的

Post a Comment

Note: Only a member of this blog may post a comment.



All texts are licensed under CC Attribution 3.0