Как реализовать 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)? Если это неправильно, то почему? Если это правильно, то почему авторы определили один метод, который будет наследоваться спецификациями конъюнкции и дизъюнкции? Каковы их намерения здесь?


person Ed I    schedule 10.02.2011    source источник


Ответы (2)


Примеры:

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

Вы можете получить такой приятный синтаксис в Squeak, если сначала определите объекты a и b, поскольку {} — это специальный синтаксис для литералов динамического массива (определить isSpecializationOf: в классе Array).

person Bernd Elkemann    schedule 21.02.2011

CompositeSpecification >> isGeneralizationOf: aSpecification
^aSpecification isSpecializationOf: self

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

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

person Bernd Elkemann    schedule 15.02.2011
comment
Спасибо, но мне пока это кажется неправильным. Предположим, вы разрешили specX быть (specA ИЛИ specB). Кроме того, предположим, что вы позволили specY быть (specA AND specB). Согласно вашему определению isSpecializationOf, specX является специализацией specY, поскольку компоненты specX включают в себя все компоненты specY. Однако (specA ИЛИ specB) не является частным случаем (specA AND specB). Более того, имеет ли для вас смысл метод Фаулера и Эванса? - person Ed I; 16.02.2011
comment
Хитрость в том, где вы делаете логические комбинации. Вы можете смоделировать как И, так и ИЛИ, используя только наборы: если вы хотите проверить И, вы проверяете внутри оператора, если вы хотите проверить ИЛИ, вы проверяете два отдельных оператора, а затем комбинируете их с помощью или (Smalltalk |). - person Bernd Elkemann; 22.02.2011
comment
Я добавлю пример в качестве еще одного ответа, потому что я не могу использовать несколько строк в комментарии. - person Bernd Elkemann; 22.02.2011