2013-03-18 13 views
8

Chociaż myślę, że rozumiem aggregation i composition, mam trudności ze zrozumieniem skojarzenia bi-directional i uni-directional. Czytałem, że z bi-directional stowarzyszenia, obie klasy wiedzieć o sobą iz uni-directional stowarzyszenia tylko jedna z klas jest świadomy relacji. Jednak to wyjaśnienie wydaje mi się zbyt abstrakcyjne i chciałbym wiedzieć, co to oznacza w szczególności dla mojego kodu i programu, który piszę. Byłoby bardzo miło, gdybyś mógł, wraz z wyjaśnieniem, zapewniają prosty przykład jak te dwa przetłumaczyć na kod (wolę C++, ale może to być coś w tym Pseudokod)skojarzenia dwukierunkowe i jednokierunkowe UML

+0

Masz kilka przykładów w http://sourcemaking.com/refactoring/change-bidirectional-association-to-directionid i http://etutorials.org/Programming/UML/Chapter+4 .+Class+Diagrams+The + Essentials/Associations /. – user1929959

Odpowiedz

20

Dwukierunkowe stowarzyszenia jest żeglowna od oba zakończenia. Na przykład, biorąc pod uwagę następujące klasy (dla uproszczenia przyjmijmy, że stowarzyszenie jest 0..1 na obu końcach)

class Parent { 
    Child* children; 
} 

class Child { 
    Parent* parent; 
} 

można przejść od Parent do swojego dziecka, i vice versa: rodzic wie o jego dziecko, dziecko wie o swoim rodzicu i (jeśli this.parent!=null) this.parent.child==this (w przeciwnym razie nie byłoby to samo stowarzyszenie).

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

Jednak gdyby nie wskaźnik do Parent w Child:

class Child { } 

byłoby stowarzyszenie jednokierunkowy: można iść z rodzica na dziecko, ale nie może wrócić z dziećmi rodzicowi.

Parent ----------> Child 
+2

Dzięki za wyjaśnienie różnicy między stowarzyszeniem "dwukierunkowym" a "jednokierunkowym", ale teraz mam drugie pytanie. Do tej pory myślałem, że posiadanie wskaźnika członka/odniesienia do powiązanej klasy byłoby implementacją agregacji, ale przykładowy kod również używa wskaźników. Czy to oznacza, że ​​agregacja i powiązanie są realizowane w ten sam sposób w kodzie? – jcxz

+1

Tak, agregacja jest bardziej jak element koncepcyjny modelu. Pamiętam, że rozmawialiśmy o tym w http://stackoverflow.com/questions/15285996/do-pointer-reference-data-members-indicate-an-association-or-aggregaation-relati/15294388 – Javier

+3

OK, dziękuję bardzo, teraz wszystko zaczyna mieć dla mnie większy sens. Podsumowując moje odkrycia: asocjacja, agregacja i skład są raczej pojęciami semantycznymi , które można zasadniczo zrealizować w bardzo podobny sposób. Dodatkowo (dla wszystkich, którzy natkną się na ten wątek w przyszłości), znalazłem ten post: http://stackoverflow.com/questions/4298177/association-vs-aggregation, który wyjaśnia różnice semantyczne między tymi trzema. – jcxz

1

Niestety, specyfikacja UML nie definiuje żadnego pojęcie „związku dwukierunkowym”, ale tylko wspomina się o „dwukierunkowego żeglowność”, gdzie „żeglowność” (oznaczone na strzałka na schemacie klasa) nie ma dobrze zdefiniowane znaczenie obliczeniowe, jakie może być dostarczone, np. przez właściwości referencyjne lub przez zapytania. Najbardziej wydajna forma "żeglowności", dostarczana przez właściwości referencyjne, jest modelowana za pomocą koncepcji UML stowarzyszenia końcowego właściciela (oznaczonego jako kropka w schemacie klasowym).

dwukierunkowe związki może być precyzyjnie określona jako para wzajemnie odwrotne właściwości odniesienia. Definicja ta zakłada dwa warunki:

  1. dla this przedstawieniu dziecko, this.parent.child == this, jak wyjaśniono w nieco niepełną odpowiedź Javier, ale dodatkowo również

  2. dla this przedstawieniu rodzicem, this.child.parent == this.

Możesz przeczytać więcej na ten temat, i znaleźć wiele diagramów klas opisujących przykłady stowarzyszeń dwukierunkowych w samouczków Managing Bidirectional Associations in Java EE i Managing Bidirectional Associations in JavaScript.