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 ,他的作法很簡單
一開始,所有的變數都是 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] 來的更為優雅。
flash[:somthing][:abc][:def]
這樣的寫法到底是好還是不好呢?很多時候我很想說服自己這樣就好了,code work 即可,但是心中把這種事情物件導向化的想法一直沒變。所以我就開始 survey ,該怎麼作會比較 OO 呢?
我將訊息傳遞的 Object 宣告成一個 Model 上面好不好?code 很好看,可是心理總覺得小題大作了點,明明一個 Hash 就可以解決的事情,需要特別使用一個 Model 物件來寫嗎?有沒有辦法可以超快速的把訊息傳遞包成一個簡單的物件,而且裡面不需要 method ,只需要幾個 message 的 attribute 即可?
我看到了 Struct ,他的作法很簡單
宣告一個 class definition
就是宣告一個 class 的定義叫做 class_def,裡面一共有 name ,address,zip 幾個變數。
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
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
張貼留言