0

如何实现 uml 的强包含关系。也叫作曲。

举一个 Scale 的例子:我有一个类组件,它可能包含零个或多个接口:

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

然后我有我的类接口:

class Interface(name: String, description: String)

遏制应该尊重哪些约束?

  • 如果我在一个组件中输入一个接口,这个接口不能放在其他组件中。
  • 如果我删除一个 Component 也必须删除它的所有接口。

还有其他约束要强制执行吗?

如何实现第一个约束:

我想我会在类接口中添加一个名为 signComp 的 Component 类型的字段,并对 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,))))

由于组件之间存在一对一的映射,因此只需从集合中删除组件即可满足您的第二个约束:

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