Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bi-directional and uni-directional associations UML

While I think I understand aggregation and composition, I am having difficulties understanding bi-directional and uni-directional association. I've read that with bi-directional association, both classes know about each other and with uni-directional association only one of the classes is aware of the relationship. However this explanation seems too abstract for me and I would like to know what this in particular means for my code and for the program I am writing. It would be very nice if you could, along with explanation, provide a simple example of how these two translate to code (I prefer c++, but it can be anything including pseudocode)

like image 728
jcxz Avatar asked Mar 18 '13 21:03

jcxz


People also ask

What is bidirectional association in UML?

Bi-directional associations (or symmetric associations ) are the simplest way that two classes can relate to each other. A bi-directional association is shown as a line between two classes, and can contain control points. The classes can be any mix of classes, simple classes, or composite classes.

What is a bidirectional association?

In a bidirectional association, the two classes must know about each other, meaning that they can't be used separately. If many of these associations are present, different parts of the program become too dependent on each other and any changes in one component may affect the other components.

What is generalization in UML?

In UML modeling, a generalization relationship is a relationship in which one model element (the child) is based on another model element (the parent).


2 Answers

Bi-directional associations are navigable from both ends. For instance, given the following classes (for simplicity, suppose that the association is 0..1 in both ends)

class Parent {
  Child* children;
}

class Child {
  Parent* parent;
}

you can go from a Parent to its child, and vice-versa: the parent knows about its child, the child knows about its parent, and (if this.parent!=null) this.parent.child==this (othewise it would not be the same association).

Parent <---------> Child

However, if there were no pointer to Parent in Child:

class Child { }

it would be an uni-directional association: you can go from parent to child, but you cannot go back from children to parent.

Parent ----------> Child
like image 112
Javier Avatar answered Dec 07 '22 00:12

Javier


Unfortunately, the UML specification does not define any concept of "bidirectional association", but only mentions "bidirectional navigability" where "navigability" (indicated with an arrow in a class diagram) does not have a well-defined computational meaning as it can be provided, e.g., by reference properties or by queries. The most efficient form of "navigability", provided by reference properties, is modeled with the UML concept of association end ownership (indicated with a dot in a class diagram).

Bidirectional associations can be precisely defined as a pair of mutually inverse reference properties. This definition implies two conditions:

  1. for this referencing a child, this.parent.child == this, as explained in the somewhat incomplete answer of Javier, but in addition also

  2. for this referencing a parent, this.child.parent == this.

You can read more about this, and find many class diagrams describing examples of bidirectional associations in the tutorials Managing Bidirectional Associations in Java EE and Managing Bidirectional Associations in JavaScript.

like image 39
Gerd Wagner Avatar answered Dec 07 '22 01:12

Gerd Wagner