1

根据 Fowler 和 Evans的规范文档,我正在尝试实现复合规范模式。

第一印象,我认为isGeneralizationOf联合和析取的实现会有所不同。

特别是,我认为合取的逻辑是

(1) 令 specX 为 specA 和 specB 的合取。那么,只有当 specA 和 specB 都是 specC 的泛化时,specX 才是 specC 的泛化。

我认为析取的逻辑是

(2) 令specY 为specA 和specB 的析取。然后,如果 specA 或 specB 是 specC 的泛化,则 specY 是 specC 的泛化。

但是,在文档的第 16 页,他们展示了这种方法:

CompositeSpecification >> isGeneralizationOf: aSpecification
"True if each component is subsumed. False if any component is not subsumed."
^ (self components contains:
        [:each |(each isGeneralizationOf: aSpecification) not ]) not

我在(1)和(2)中的推理是否正确?如果错了,那是为什么呢?如果它是正确的,那么作者为什么要定义一个方法来同时被合取和析取规范继承呢?他们在这里的意图是什么?

4

2 回答 2

0
CompositeSpecification >> isGeneralizationOf: aSpecification
^aSpecification isSpecializationOf: self

CompositeSpecification >> isSpecializationOf: aSpecification
^self components includesAllOf: aSpecification

#includesAllOf: 在类 Collection 中定义

于 2011-02-15T21:34:39.680 回答
0

例子:

The following models: the spec "a AND b" is specialization of "a OR b"

({a,b} isSpecializationOf: {a}) & ({a,b} isSpecializationOf: {b})
-> true

This following models: the spec "a OR b" is specialization of "a AND b"

({a} isSpecializationOf: {a,b}) | ({b} isSpecializationOf: {a,b})
-> false

如果您首先定义对象 a 和 b,您可以在 Squeak 中获得如此好的语法,因为 {} 是动态数组字面量的特殊语法(定义 isSpecializationOf: 在类 Array 中)。

于 2011-02-21T22:33:47.003 回答