2012-03-02 74 views
1

這可能是一個天真的問題,但是RSpec的DSL測試是否違反了Demeter的規律?RSpec DSL是否違反了Demeter的規律?

下面是從http://rspec.info RSpec的DSL的例子:

bowling.score.should eq(0) 

從Demeter的角度來看,這似乎是我從這個例子沒有區別:

user.department.try(:name) 

它根據Avdi格林違反了德米特法。

來源:http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/

+0

請注意,這是RSpec 1的文檔,可能不是您想要的。 RSpec 2的網址是http://relishapp.com/rspec。 – 2012-03-02 02:40:22

+0

感謝您的更正。我認爲RSpec的例子仍然具有代表性,對吧? – dan 2012-03-02 02:42:33

+0

是的。雖然RSpec 1網站煩惱地缺乏與RSpec 2文檔的任何鏈接,但這會導致很多混淆。 – 2012-03-02 02:44:28

回答

1

這顯然是主觀的,但我相信它

should調用是RSpec的語言的一部分,它只是建立在Ruby之上。沒有理由不可能:

should_be_equal(bowling.score, 0) 

(或類似的)但這不是RSpec的語言。此外,should方法只存在於規格內的該對象上,用於規格。

要嘗試和(有點粗製濫造,也許)更好地說明關於是語言的一部分,我的觀點:

bowling.score + 10 

實際上是呼籲score+方法,但你會發現這是一個定律德米特違規? +被看作是運營商而不是方法,很像should以上。

+0

如果'try'的支持者對'try'有類似的說法:它應該被認爲是僞操作符而不是方法?這個觀點是否也持水?爲什麼或者爲什麼不? – dan 2012-03-02 02:41:46

+0

在上面的例子中'try' *是一個違反demeter的規則,因爲你基本上調用'user.department.name',如果'department'爲'nil',只是有一些保護。 '用戶。嘗試(:部門)',但是,不會違反德米特法。 – 2012-03-02 02:43:25

+0

這是有道理的。那麼你是否說Ruby DSL不必遵循Demeter法則? – dan 2012-03-02 02:55:56

2

Demeter是一個降低風險的指導原則,認爲系統中較少的一個部分依賴於其他部分的結構,不太可能的部分將受到所述結構的改變的影響。

你當然可以說,game.score.should eq(0)是得墨忒耳 違規,但should方法是RSpec的框架,這是周圍的聲明game.score.should eq(0)的 背景下,是不可能 變化的方式,將迫使改變的一部分對此聲明。

也許它違反了Demeter,也許它沒有,但Demeter旨在解決的風險不是 確實存在。

+0

聽起來很合理。謝謝你的解釋。 – dan 2012-03-02 03:46:21

相關問題