1

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ページに、彼らはこの方法を示していますか?それが間違っているなら、それはなぜですか?それが正しければ、なぜ、著者は結合と分離の両方の仕様によって継承される単一のメソッドを定義しましたか?彼らの意図は何ですか?

答えて

0

例として定義されています

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 

あなたが最初にするので、オブジェクトaとbを定義する場合は、Squeakの中に、この素​​敵な構文を得ることができます{ }は、動的配列リテラルの特別な構文です(クラスArrayのisSpecializationOf:を定義します)。

0
CompositeSpecification >> isGeneralizationOf: aSpecification 
^aSpecification isSpecializationOf: self 

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

#includesAllOfは:クラスコレクションに

+0

ありがとうございますが、それはまだ私にとっては正しいとは思われません。 specXを(specA OR specB)とするとします。また、specYを(specAとspecB)とするとします。 isSpecializationOfの定義によると、specXのコンポーネントはspecYのすべてのコンポーネントを含むため、specXはspecYの特殊化です。ただし、(specA OR specB)は(specA AND specB)の特別なケースではありません。もっと重要なのは、ファウラーとエバンスの方法はあなたに意味があるのでしょうか? –

+0

トリックは論理的な組み合わせを行う場所です。テストする場合はステートメント内部をチェックし、テストしたい場合は2つの別々のステートメントをチェックインし、または(Smalltalk "|")を使用して結合します。 –

+0

コメントに複数の行を使用することができないため、別の回答として例を追加します –

関連する問題