Я пытаюсь реализовать шаблон составной спецификации, согласно 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) правильно? Если это неправильно, почему? Если это правильно, то почему авторы определили один метод, наследуемый как спецификациями соединения, так и дизъюнкции? В чем их намерение здесь?
Спасибо, но это пока не кажется мне правильным. Предположим, что вы разрешаете specX (specA OR specB). Кроме того, предположим, что вы даете specY be (specA AND specB). Согласно вашему определению isSpecializationOf, specX является специализацией specY, поскольку компоненты specX включают в себя все компоненты specY. Однако (specA OR specB) не является особым случаем (specA AND specB). Насколько это важно, метод Фоулера и Эванса имеет смысл для вас? –
Фокус в том, где вы делаете логические комбинации. Вы можете моделировать как AND, так и OR с помощью только наборов: если вы хотите проверить AND, вы проверяете внутри оператора, если вы хотите проверить ИЛИ вы проверяете два отдельных оператора, а затем объединяете их с помощью или (Smalltalk «|»). –
Я добавлю пример в качестве другого ответа, потому что я не могу использовать несколько строк в комментарии –