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