Реализовать отношения сдерживания

Как я могу реализовать строгие отношения сдерживания UML. Также называется композицией.

Чтобы привести пример в масштабе: у меня есть компонент класса, который может содержать ноль или более Интерфейс:

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

и тогда у меня есть свой интерфейс класса:

class Interface(name: String, description: String)

Каковы ограничения, которые должны соблюдаться сдерживания?

  • Если я ввожу интерфейс в компонент, этот интерфейс не может быть помещен в другой компонент.
  • Если я удаляю компонент, необходимо также удалить весь его интерфейс.

Существуют ли другие ограничения для принудительного сдерживания?

Как мне реализовать первое ограничение:

Я подумал, что добавлю поле в класс Interface с именем signComp типа Component и наложу ограничения на метод set Interaction of Component.
Например: для каждого интерфейса, который должен быть добавлен к компоненту, если для интерфейса signComp имеет значение null, вставьте интерфейс и задайте signComp с текущим компонентом, в противном случае отмените назначение.

Это успешная реализация? Или есть другие способы.

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()
Другие вопросы по тегам