Since classical OO programming languages do not support explicit associations as first class citizens, but only classes with reference properties representing implicit associations, we have to eliminate all explicit associations for obtaining an OO class model.
The starting point of our association elimination procedure is an information design model with various kinds of unidirectional and bidirectional associations, such as the model shown in Figure 12.1 above. If the model still contains any non-directed associations, we first have to turn them into directed ones by making a decision on the ownership of their ends, which is typically based on navigability requirements.
Notice that both associations in the Publisher-Book-Author information design model, publisher-publishedBooks and authoredBooks-authors (or Authorship), are bidirectional as indicated by the ownership dots at both association ends. For eliminating all explicit associations from an information design model, we have to perform the following steps:
Eliminate unidirectional associations, connecting a source with a target class, by replacing them with a reference property in the source class such that the target class is its range.
Eliminate bidirectional associations by replacing them with a pair of mutually inverse reference properties.
A unidirectional association connecting a source with a target class is replaced with a corresponding reference property in its source class having the target class as its range. Its multiplicity is the same as the multiplicity of the target association end. Its name is the name of the association end, if there is any, otherwise it is set to the name of the target class (possibly pluralized, if the reference property is multi-valued).
A bidirectional association, such as the authorship association between the classes
Book
and Author
in the model shown in Figure
12.1 above, is replaced with a pair of
mutually inverse reference properties, such as
Book
::authors
and
Author
::authoredBooks
. Since both reference
properties represent the same information (the same set of binary
relationships), it's an option to consider one of them being the
"master" and the other one the "slave", which is derived from the
master. We discuss the two cases of a one-to-one and a many-to-many
association
In the case of a bidirectional one-to-one association, this leads to a pair of mutually inverse single-valued reference properties, one in each of the two associated classes. Since both of them represent essentially the same information (the same collection of links/relationships), one has to choose which of them is considered the master property, such that the other one is the slave property, which is derived from the master property by inversion. In the class diagram, the slave property is designated as a derived property that is automatically updated whenever 1) a new master object is created, 2) the master reference property is updated, or 3) a master object is destroyed. This transformation is illustrated with the following example:
A bidirectional many-to-many association is mapped to a pair of mutually inverse multi-valued reference properties, one in each of the two classes participating in the association. Again, in one of the two classes, the multi-valued reference property representing the (inverse) association is designated as a derived property that is automatically updated whenever the corresponding property in the other class (where the association is maintained) is updated. This transformation is illustrated with the following example:
After replacing both bidirectional associations with reference properties, we obtain the OO class model shown in 12.2.
Since books are entities that existentially depend on authors and
possibly on publishers, and not the other way around, it's natural to
maintain the master references in book objects, and consider the inverse
references in publisher and author objects as derived (or 'slave') data.
Therefore, we define publishedBooks
and
authoredBooks
as derived inverse reference properties,
which is indicated by their slash prefix in the OO class model.
The meaning of this OO class model can be illustrated by a sample data population for the three model classes involved:
Publisher | ||
---|---|---|
Name | Address | Published books |
Bantam Books | New York, USA | 0553345842 |
Basic Books | New York, USA | 0465030793 |
Book | ||||
---|---|---|---|---|
ISBN | Title | Year | Authors | Publisher |
0553345842 | The Mind's I | 1982 | 1, 2 | Bantam Books |
1463794762 | The Critique of Pure Reason | 2011 | 3 | |
1928565379 | The Critique of Practical Reason | 2009 | 3 | |
0465030793 | I Am A Strange Loop | 2000 | 2 | Basic Books |
Author | ||
---|---|---|
Author ID | Name | Authored books |
1 | Daniel Dennett | 0553345842 |
2 | Douglas Hofstadter | 0553345842, 0465030793 |
3 | Immanuel Kant | 1463794762, 1928565379 |
Notice how Book
records reference
Publisher
and Author
records, and, vice versa,
Publisher
and Author
records reference
Book
records.