What have you found for these years?

2008-07-23

has_many and find (2)

承上,其實 rails 這樣做可能還違反 LSP.
http://en.wikipedia.org/wiki/Liskov_substitution_principle

雖然 LSP 通常是指 static typing 的語言,
但我認為這可以在 ruby 上延伸解釋,像是原本 LSP
是在說 derived class (c++ term), 但在 ruby 上
可以視為絕對不要任意改變某個 method 的 semantic.

以前例而言:

[1, 2, 3].class # => Array
[1, 2, 3].find{ |i| i == 2 } # => 2

user.habit_contents.class # => Array
user.habit_contents.find{ |i| i == 2 }

ActiveRecord::RecordNotFound:
Couldn't find HabitContent without an ID

........這比違反 LSP 還更嚴重不是?
ruby 不是說 principle of least surprise?
越想越覺得 rails 非常 dirty.

2 retries:

contagion said...

嗯..這個..
問題應該是

user.habit_contents.class
不應該傳回 Array
而是 AssociationProxy 才對

godfat 真常 said...

也是一個方法,不過我還是覺得改名字會比較好一點
例如 query 之類的
如果說為了跟 Model.find 有同樣的名字
那乾脆用 Model.query
總之不要衝突...

Post a Comment

All texts are licensed under CC Attribution 3.0