0

UML の強力な包含関係を実装するにはどうすればよいですか。コンポジションともいう。

Scale で例を挙げます: クラス コンポーネントがあり、これには 0 個以上のインターフェイスが含まれる場合があります。

class Component (name: String, description: String, Interaction: Set[Interface])

そして、私はクラスのインターフェースを持っています:

class Interface(name: String, description: String)

封じ込めを尊重する必要がある制約は何ですか?

  • コンポーネントにインターフェイスを入力すると、このインターフェイスを他のコンポーネント内に配置することはできません。
  • コンポーネントを削除すると、そのインターフェイスもすべて削除する必要があります。

封じ込めを強制する他の制約はありますか?

最初の制約を実装するにはどうすればよいですか:

Component 型の signComp というクラス Interface にフィールドを追加し、Component の set メソッド Interaction に制約を加えようと考えました。
例: コンポーネントに追加する必要がある各インターフェイスについて、インターフェイスの signComp が null の場合、インターフェイスを挿入し、現在のコンポーネントで signComp を設定します。それ以外の場合は、割り当てをキャンセルします。

これは成功した実装ですか?または他の方法があります。

4

1 に答える 1

1

不変のアプローチを取りたい場合は、次のような方法を試すことができます。

case class Component(name: String, description: String, interaction: Set[Interface])

case class Interface(name: String, description: String)

def addInterface(components: Set[Component], c: Component, i: Interface) =
  if(components.find(_.interaction contains i) isEmpty)
    components + c.copy(interaction = c.interaction + i)
  else
    components

そして、次のように使用します。

val i1 = Interface("i1", "interface 1")
val a = Component("a", "description a", Set(i1))
val b = Component("b", "description b", Set())    
val components = addInterface(Set(a), b, i1)  // Set(Component(a,,Set(Interface(i1,))))
addInterface(components, b, Interface("i2", "interface 2")) // Set(Component(a,,Set(Interface(i1,))), Component(b,,Set(Interface(i2,))))

コンポーネント間には1対1のマッピングが存在するため、2番目の制約は、セットからコンポーネントを削除するだけで満たされます。

components - a // Set()
于 2012-12-14T17:56:22.790 に答える