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