Assotiation bzw. Aggregation



  • RHBaum schrieb:

    Wichtig ... das nutzende Object ist der Alleinige Verwalter des Aggregates. Also theorethisch, geht deine Lok kaputt, ist der motor auch weg ... theorethisch :p
    [...]
    Besonderheit an einer Aggregation ist, das die Lebensdauer der Aggregate an die lebenszeit des aggregierenden Objectes gekoppelt ist ...

    Du beschreibst IMO grad die Komposition. Die Aggregation ist nicht so fest gekoppelt, dass die Lebensdauer der Bestandteile vom Gesamten abhängt.

    IMHO kann man die Frage aber nicht beantworten, weil Assoziation und Aggregation Begriffe aus der Objektorientierten Analyse sind. Man kann nicht aus der Implementierung (jedenfalls nicht ohne den Kontrollfluss und die Lebensdauer der Objekte zu analysieren) herauslesen, in welcher Beziehung die Klassen stehen.
    Im Design und in der Implementierung ist nur noch wichtig, dass eine Beziehung besteht, für wie lange, und wem die Verantwortung übertragen wird, diese auf- und abzubauen.



  • Besonderheit an einer Aggregation ist, das die Lebensdauer der Aggregate an die lebenszeit des aggregierenden Objectes gekoppelt ist ...

    So würde ich eher eine Komposition definieren.

    Eine Assoziation ist immer eine Beziehung zwischen Objekten, d. h. sie kommunizieren miteinander, aber sind selbständig.

    Bei einer Aggregation wird ein Objekt durch andere Objekte erstellt (Auto hat Motor), aber Motor kann auch alleine existieren.

    Bei einer Komposition wird auch ein Objekt durch andere Objekte erstellt, aber die können dann nicht alleine existieren (Menü hat Menüeintrag, Gebäude hat Zimmer).



  • Ja, die Theorie kommt mir bekannt vor. Jedoch habe ich eben dieses Problem die Theorie in die Praxis umzusetzen.

    Ich habe hier z.B. 2 Klassen. KlasseA baut die Datenstruktur auf, dafür muss KlasseB vorher das passende XML File öffnen. KlasseA braucht von KlasseB den Smartpointer der auf den XML Baum zeigt, damit ich die Elemente parsen kann und somit die Datenstruktur aufbauen kann.

    Meine Frage: Muss KlasseA dafür eine Instanz von KlasseB besitzen? Wenn ja, dann haben wir eine Aggregation oder?

    Wo lege ich die Instanz am besten an? Privatebereicht der KlasseA.h?

    Wie würdet ihr es machen?



  • Ok Ok, ihr habt recht, hab im Buch grad nachgeschaut ... Aggregation ist die nicht ganz so starke variante !

    Ciao ...



  • Dein problem hat aber mit Aggregation und Assoziation ned viel zu tun ... sondern damit kann man die loesungen nur umschreiben.

    Viel weiter wuerden dich hier designpattern bringen, such mal lieber danach ...

    Meine Frage: Muss KlasseA dafür eine Instanz von KlasseB besitzen? Wenn ja, dann haben wir eine Aggregation oder?

    Auf alle faelle hast eine Assoziation !!! :p

    Gibt viele loesungen ... auch je nach XML Parser du verwendest ... Wie willst parsen ... mit DOM (wuerd ich eher ned nehmen) oder mit SAX ?

    Auch wuerde ich den Parser(KlasseB) von deiner Datenstruktur, oder besser noch von deiner Klassenfabrik(KlasseA + Friends) trennen!

    Also wuerde ich folgende Elemente Haben wollen ...
    eine KlassenFabrik, zum erzeugen deiner datenstruktur,
    einen Proxy fuer deine XMLParserklassen ...

    und eine Aehm Object ??? dem du die KlassenFabrik(als referenz), den parserProxy(als referenz) uebergibst, der das parst und Dir nen zeiger auf dein Rootobject der Datenstruktur zurueckgibt ...
    Namen sind fuer mich auch nen greul ! Ist das nun nen Adapter oder ne Bridge oder ... ???

    Intern wirst sicher noch andere pattern anwenden, z.B. Visitors ... etc.

    Aber viele Wge fuehren nach Rom, alles hat vor und Nachteile ... fuer konkrete Vorschlaege kenn ich dein project nicht genug !

    Ciao ....



  • Also, wenn ich im Private Bereich der KlasseA eine Instanz der KlasseB erstelle, dann ist es eine Assoziation?

    Ich habe gemeint, Aggregation steht für enthält (has a), und in diesem Falle würde ja auch KlasseA, die KlasseB enthalten? Ist verwirrend aber auch nicht mehr so wichtig.

    Factory Muster sagt mir was, ich werds mal gründlich durchdenken, danke schonmal für den Tipp. Auch das mit dem Proxy, obwohl ich gerade nicht einsehe wozu? Werd mir mal die Theorie nochmals reinziehen und mich dann nochmals melden. 😉

    Achso, ich nehme DOM zum parsen. SAX sagt mir nichts. Ist alles fremd für mich, da ich mich jetzt mit DOM etwas auskenne und auch schon Bsp. Files geparst habe, werde ich wohl dabei bleiben. Hat soweit auch ganz gut funktioniert.

    NACHTRAG: Also, das Factory Pattern habe ich sogar verwendet, einfach unbewusst 😃 .
    Proxy sehe ich aber immernoch nicht ein wozu das gut sein soll. Visitor sagt mir auch nix, noch nie gehört.



  • bsash schrieb:

    Also, wenn ich im Private Bereich der KlasseA eine Instanz der KlasseB erstelle, dann ist es eine Assoziation?

    Wie ich schon sagte, von einer Implementation kann man nicht auf die genaue Beziehung zwischen Klassen schließen, das ist ein Analyseaspekt. Du belastest dich doch nur unnötig mit Begriffen. Werd dir darüber klar, was du brauchst und was ablaufen muss, und designe das.



  • Hallo,
    meines Wissens nach gibt es in der OOA/OOD vier wichtige Beziehungen.
    Uses, Inheritance, Containment (stark und schwach) und Association.

    Eine Association-Beziehung ist, wenn man u.A. James Rumbaugh glaubt, eine Beziehung zwischen zwei Klassen, die weder Uses, noch Inheritance noch Containment ist.

    Simples Beispiel: "Was ist die Beziehung zwischen dem Auto in deiner Auffahrt und dessen Hersteller für eine Beziehung"?
    Es ist nicht Vererbung: Ein Auto ist kein Hersteller und ein Hersteller ist kein Auto.

    Es ist nicht Containment: Ein Auto enthält keinen Hersteller und ein Hersteller enthält kein Auto.

    Es könnte uses sein, falls das Auto Nachrichten an den Hersteller und der Hersteller Nachrichten an das Auto schickt. Ist dem nicht so, dann handelt es sich um eine Association-Beziehung.

    Association-Beziehung können 1:1, 1:n, n:1 und n:m, sowie notwendig oder optional sein.

    Association-Beziehung werden in der Regel entweder als "referential attribute" oder über eine zusätzliche dritte Klasse implementiert (Beispiel: Person, Company und HasWorkedFor).
    In Sprachen wie C++ kann man auf Implementationsebene aber *nicht* zwischen Containment by reference und Association unterscheiden. Das heißt aber natürlich *nicht*, dass die beiden Sachen aus Designsicht äquivalent sind.
    Nur die Containment-Beziehung hat die Eigenschaft, dass man Klassen die in anderen Klassen enthalten sind auf einer bestimmten Ebene *vollständig* ignorieren kann.



  • Ok. Vergesst es. Meine Antwort ist mittlerweile obsolet.



  • Ok, gemäss bashar habe ich da wohl etwas Spielraum.

    Ich wollte einfach von Anfang an Unklarheiten aus der Welt schaffen, denn wenn ich jetzt in der Systementwurfphase grosse Fehler mache, dann muss ich später umso mehr ändern. Aber ich denke, es ist jetzt gut und sollte so funktionieren. Trozdem würde ich gerne noch hören wieso ich das Proxy Muster verwenden sollte beim xml parser?



  • ok kurz:

    private member (nicht als zeiger) in ner Klasse

    Stehen die Klassen in beziehung ... also veraendert A->B oder B->A .. ja ? Asssoziation ...
    A hat ein B, Lebenszyklen miteinander verbunden (denke doch) -> Komposition !

    Also hast du eine Assoziation in form einer komposition, oder was weiss ich wie das asudruecken willst ...

    Ist das nu ne Birne oder Fallobst ?

    Proxy ist nen Stellvertreter ... Also nen object, was dir Funktionalitaet entgegen nimmt, und diese fast unveraendert an nen anderes Weitergibt, also das andere Object vertritt. Nimmt man zum aufloesen von Abhaengigkeiten (beim compilieren, weiterfuehrende Literatur wuerde dir erklaeren, warum die ned gut sind) und zum zwischenschalten von kontrollfunktionen.

    DOM / SAX
    sind 2 unterschiedliche ansaetze von Libs zum parsen von XML dokumenten. die vorgehensweise ist standardisiert. Also alle saxparser arbeiten nach dem gleichen prinzip, genau so die DOM Parser.
    SAX -> Simple API for XML
    du startest den Parser, und bei definierten stellen im Dokument werden Dir fordefinierte ereignisse (methoden) ausgeloest. Beispielweise wenn eine Attribut Tag gelesen wurde, wird sowas wie ne methode BeginAttrib ausgeloest, als parameter bekommst den Namen des Attributs ....
    Du musst also da von ner Handlerklasse ableiten, und auf die ereignisse reagieren und dabei deine eigenen strukturen befuellen, vorteil : es wird kaum speicher allokiert.
    DOM -> Document Object Model
    ein Parser parst dir das file in eine schon definierte Datenstruktur (ziemlich generisch). und du kannst mittels iteratorn etc dich durch die objecte durchhangeln ... und sie in deine eigenen konvertieren. Vorteil: Das parsen passiert aufs mal, ziemlich einfach zu handhaben Nachteil: das gesamte XML file liegt nach dem parsen irgendwie im speicher ...

    CIao ...


Anmelden zum Antworten