1

Я пытаюсь реализовать шаблон составной спецификации, согласно Specifications Document от Fowler и Evans.Как реализовать isGeneralizationOf с составной спецификацией?

С первого взгляда, я думал, что реализация isGeneralizationOf будет отличаться для соединения и дизъюнкции.

В частности, я думал, что логика конъюнкции будет

(1) Пусть specX быть конъюнкцией SPECA и specB. Тогда specX является обобщением specC только в том случае, если оба specA и specB являются обобщением specC.

И я думал, что логика для дизъюнкции будет

(2) Пусть specY быть дизъюнкция SPECA и specB. Тогда specY является обобщением specC, если либо specA, либо specB является обобщением 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) правильно? Если это неправильно, почему? Если это правильно, то почему авторы определили один метод, наследуемый как спецификациями соединения, так и дизъюнкции? В чем их намерение здесь?

ответ

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 

Вы можете получить синтаксис это хороший в Писк, если сначала определить объекты а и Ь, так как { } - специальный синтаксис для динамических литералов массива (define isSpecializationOf: в классе Array).

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

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

#includesAllOf: определяется в классе Collection

+0

Спасибо, но это пока не кажется мне правильным. Предположим, что вы разрешаете specX (specA OR specB). Кроме того, предположим, что вы даете specY be (specA AND specB). Согласно вашему определению isSpecializationOf, specX является специализацией specY, поскольку компоненты specX включают в себя все компоненты specY. Однако (specA OR specB) не является особым случаем (specA AND specB). Насколько это важно, метод Фоулера и Эванса имеет смысл для вас? –

+0

Фокус в том, где вы делаете логические комбинации. Вы можете моделировать как AND, так и OR с помощью только наборов: если вы хотите проверить AND, вы проверяете внутри оператора, если вы хотите проверить ИЛИ вы проверяете два отдельных оператора, а затем объединяете их с помощью или (Smalltalk «|»). –

+0

Я добавлю пример в качестве другого ответа, потому что я не могу использовать несколько строк в комментарии –