1

Fowler와 Evans의 Specifications Document에 따라 복합 사양 패턴을 구현하려고합니다.합성 사양 패턴을 사용하여 isGeneralizationOf를 구현하는 방법은 무엇입니까?

첫 번째 인상에서 나는 isGeneralizationOf의 구현이 연결과 분리에 대해 다를 것이라고 생각했습니다. 특히

, 난 연계를위한 논리

(1)가 specX specA specB과의 결합이 될 것이라고 생각하자. 그러면 specX와 specB가 specC의 일반화 인 경우에만 specX가 specC의 일반화입니다.

그리고 분리에 대한 논리가

(2) specY이 specA 및 specB의 분리하자 것이다라고 생각했다. specY 또는 specB가 specC의 일반화 인 경우 specY는 specC의 일반화입니다.

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) 올바른 나의 추론은 다음과 같습니다

그러나, 문서의 16 페이지에, 그들은이 방법을 보여? 그것이 틀렸다면, 왜 그럴까요? 그것이 맞다면, 왜 저자들은 결합과 분리 선택 모두에 의해 계승 될 하나의 방법을 정의 했는가? 여기에 그들의 의도는 무엇입니까?

답변

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를 정의 할 경우 가족 이죠이 좋은 구문을 얻을 수 있습니다 { }는 동적 배열 리터럴에 대한 특수 구문입니다 (Array 클래스의 isSpecializationOf : 정의).

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

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

#includesAllOf은 : 클래스 컬렉션에

+0

고마워요,하지만 아직 나에게 맞는 것 같지 않습니다. specX를 (specA 또는 specB)라고합시다. 또한 specY (specA 및 specB)라고 가정하십시오. isSpecializationOf의 정의에 따르면 specX의 구성 요소에는 specY의 모든 구성 요소가 포함되어 있으므로 specX는 specY의 특수화입니다. 그러나 (specA OR specB)는 (specA AND specB)의 특별한 경우는 아닙니다. 더 중요한 것은, 파울러와 에반스의 방법이 당신에게 의미가 있습니까? –

+0

트릭은 논리적 조합을 수행하는 곳입니다. 테스트 할 경우 AND 문을 검사하거나 OR 문을 사용하여 두 문을 확인한 다음 또는 (Smalltalk "|")를 사용하여 결합 할 수 있습니다. –

+0

주석에 여러 줄을 사용할 수 없기 때문에 다른 대답으로 예제를 추가 할 것입니다. –

관련 문제