1

这可能是一个幼稚的问题,但是 RSpec 的测试 DSL 是否违反了 Demeter 定律?

这是来自http://rspec.info的 RSpec DSL 示例:

bowling.score.should eq(0)

从 Demeter 的角度来看,这在我看来与这个例子没有什么区别:

user.department.try(:name)

根据 Avdi Grimm 这违反了得墨忒耳法则。

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

4

2 回答 2

2

Demeter 是一种降低风险的指导方针,其理念是系统的一个部分依赖于其他部分的结构越少,该部分受所述结构变化影响的可能性就越小。

您当然可以争辩说这game.score.should eq(0)是违反 Demeter 的,但该should方法是 rspec 框架的一部分,它是语句周围的上下文,game.score.should eq(0)不太可能以强制更改该语句的方式发生变化。

也许它违反了德米特,也许它没有,但德米特旨在解决的风险并不真正存在。

于 2012-03-02T03:42:17.523 回答
1

这显然是主观的,但我相信它不是

should调用是RSpec语言的一部分,它恰好是基于 Ruby 构建的。没有理由不能:

should_be_equal(bowling.score, 0)

(或类似的)但这不是 RSpec 的语言。此外,对于should规范,该方法仅存在于规范内的该对象上。

尝试并(也许有点粗略)更好地说明我关于成为语言一部分的论点:

bowling.score + 10

实际上是在调用+方法 on score,但你会认为这是违反 demeter 的法则吗?被+视为运算符而不是方法,就像should上面一样。

于 2012-03-02T02:39:17.203 回答