FowlerとEvansのSpecifications Documentのように、複合仕様パターンを実装しようとしています。合成仕様パターンでisGeneralizationOfを実装する方法は?
最初の印象では、私はisGeneralizationOf
の実装が結合と分離について異なると考えました。特に
、Iは、連携するためのロジックは
(1)specXはspecAとspecBの組み合わせとするだろうと思いました。 specXとspecBの両方がspecCの一般化である場合のみ、specXはspecCの一般化です。
そして私は論理和のためのロジックが
(2)specYがspecAとspecBの論理和とするだろうと思いました。 specYまたはspecBがspecCの一般化である場合、specYはspecCの一般化です。
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)正しいの私の推論です:
はしかし、文書の16ページに、彼らはこの方法を示していますか?それが間違っているなら、それはなぜですか?それが正しければ、なぜ、著者は結合と分離の両方の仕様によって継承される単一のメソッドを定義しましたか?彼らの意図は何ですか?
ありがとうございますが、それはまだ私にとっては正しいとは思われません。 specXを(specA OR specB)とするとします。また、specYを(specAとspecB)とするとします。 isSpecializationOfの定義によると、specXのコンポーネントはspecYのすべてのコンポーネントを含むため、specXはspecYの特殊化です。ただし、(specA OR specB)は(specA AND specB)の特別なケースではありません。もっと重要なのは、ファウラーとエバンスの方法はあなたに意味があるのでしょうか? –
トリックは論理的な組み合わせを行う場所です。テストする場合はステートメント内部をチェックし、テストしたい場合は2つの別々のステートメントをチェックインし、または(Smalltalk "|")を使用して結合します。 –
コメントに複数の行を使用することができないため、別の回答として例を追加します –