4/04/2007

Struct:簡單的宣告物件方式

在 PHP 裡面,很多時候我們會用到 Hash 來傳遞變數,像是 $something['abc']['def'] 之類的方式,或許這是一個在效率上面很好的實做方式,但是總是...怪怪的,不是那麼的優雅。在 Rails 裡面,難免會有 controller 傳遞變數到 view 裡面的時候,這個時候通常是用 flash 這個內定的 Hash 來傳遞,但是也會遇到相同的問題,就是 Hash 實在是不夠物件導向。

flash[:somthing][:abc][:def]

這樣的寫法到底是好還是不好呢?很多時候我很想說服自己這樣就好了,code work 即可,但是心中把這種事情物件導向化的想法一直沒變。所以我就開始 survey ,該怎麼作會比較 OO 呢?

我將訊息傳遞的 Object 宣告成一個 Model 上面好不好?code 很好看,可是心理總覺得小題大作了點,明明一個 Hash 就可以解決的事情,需要特別使用一個 Model 物件來寫嗎?有沒有辦法可以超快速的把訊息傳遞包成一個簡單的物件,而且裡面不需要 method ,只需要幾個 message 的 attribute 即可?

我看到了 Struct ,他的作法很簡單

宣告一個 class definition

class_def = Struct.new( :name, :address, :zip )


就是宣告一個 class 的定義叫做 class_def,裡面一共有 name ,address,zip 幾個變數。

New Object 

當我們需要 new 一個 object ,我們把他叫做 obj

obj = class_def.new

如此即可。以後就可以這樣使用

obj.name
obj.address
obj.zip

Constructor

一開始,所有的變數都是 nil,這是因為沒有 constructor去宣告初始值。在 Struct 裡面有辦法達成嗎?當然有,在 new 這個 object 時這樣作

obj = class_def.new( 'a' , 1 , '123')

即可。

我的使用方式

我常常這樣使用Struct 來做 message passing 的 object,一行即可做到 new 一個我自己定義的 message object

msg = Struct.new( :error , :alert , :warning).new

如此的寫法對我來說,比 flash[:error] 來的更為優雅。

這個東西與其說是技巧,不如說是一個物件導向的偏執分子的固執行為,沒什麼了不起。你依舊可以用 Hash 達成每一件 Struct 做的到的事情。

1 則留言:

匿名 提到...

d = Struct.new(:a,:b,:c).new(1,2,3)

pyts d.a