Реализовать отношения сдерживания
Как я могу реализовать строгие отношения сдерживания 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()