Associering, aggregering och sammansättning i OOP förklaras

Unified Modeling Language (UML) är en de facto-standard för modellering av objektorienterade system. I UML finns det fem olika typer av relationer: association, aggregering, sammansättning, beroende och arv. Denna artikel presenterar en diskussion om de tre första av dessa begrepp och lämnar de återstående till ett annat blogginlägg.

Förening inom objektorienterad programmering

Associering är ett semantiskt svagt förhållande (ett semantiskt beroende) mellan annars orelaterade objekt. En association är ett ”användande” förhållande mellan två eller flera objekt där objekten har sin egen livstid och det inte finns någon ägare.

Föreställ dig som exempel förhållandet mellan en läkare och en patient. En läkare kan associeras med flera patienter. Samtidigt kan en patient besöka flera läkare för behandling eller konsultation. Var och en av dessa objekt har sin egen livscykel och det finns ingen “ägare” eller förälder. Objekten som ingår i associeringsförhållandet kan skapas och förstöras självständigt.

I UML representeras en associeringsrelation av en enda pil. Ett associeringsförhållande kan representeras som en-till-en, en-till-många eller många-till-många (även känd som kardinalitet). I huvudsak betecknar en associeringsrelation mellan två eller flera objekt en kommunikationsväg (även kallad länk) mellan dem så att ett objekt kan skicka ett meddelande till ett annat. Följande kodavsnitt illustrerar hur två klasser, BlogAccount och BlogEntry, är associerade med varandra.

public class BlogAccount

   {

       privat BlogEntry [] blogEntries;

       // Övriga medlemmar i BlogAccount-klassen

   }

public class BlogEntry

   {

       Int32 blogId;

       strängtextning;

       strängtext;

       // Andra medlemmar i BlogEntry-klassen

   }

Aggregering i objektorienterad programmering

Aggregation är en specialiserad form av association mellan två eller flera objekt där varje objekt har sin egen livscykel men det finns också ett ägande. Aggregering är ett typiskt förhållande mellan hela / delar eller föräldrar / barn men det kan eller inte kan beteckna fysisk inneslutning. En väsentlig egenskap hos ett aggregeringsförhållande är att hela eller förälder (dvs. ägaren) kan existera utan delen eller barnet och vice versa.  

Som ett exempel kan en anställd tillhöra en eller flera avdelningar i en organisation. Om en anställds avdelning raderas skulle emellertid inte anställdens objekt förstöras utan skulle fortsätta. Observera att förhållandena mellan objekt som deltar i en sammanställning inte kan vara ömsesidiga - det vill säga en avdelning kan "äga" en anställd, men den anställde äger inte avdelningen. I följande kodexempel är en aggregeringsrelation uppenbar mellan klasserna BlogAuthor och BlogAccount.

public class BlogAuthor

   {

       privat Int32 authorId;

       privat sträng förnamn;

       privat sträng efternamn;

       // Andra medlemmar i BlogAuthor-klassen

   }

public class BlogAccount

   {

       privat BlogEntry [] blogEntries;

       // Övriga medlemmar i BlogAccount-klassen

   }

Aggregering representeras vanligtvis i UML med en linje med en ihålig diamant. Liksom association kan aggregering involvera en en-till-en, en-till-många eller många-till-många-relation mellan de deltagande objekten. När det gäller en-till-många eller många-till-många-relationer kan vi säga att det är ett överflödigt förhållande.

Komposition i objektorienterad programmering

Komposition är en specialiserad form av aggregering. I sammansättning, om det överordnade objektet förstörs, upphör också barnobjekten att existera. Sammansättning är faktiskt en stark typ av aggregering och kallas ibland som ett "dödsförhållande". Som ett exempel kan ett hus bestå av ett eller flera rum. Om huset förstörs förstörs också alla rum som ingår i huset. Följande kodavsnitt illustrerar ett kompositionsförhållande mellan två klasser, hus och rum.

offentligt klass hus

{

   privat rum rum;

   offentligt hus()

   {

       rum = nytt rum ();

   }

}

Liksom aggregering är komposition också en hel / del eller förälder / barn relation. I kompositionen kontrolleras dock livscykeln för delen eller barnet av hela eller förälder som äger det. Det bör noteras att denna kontroll kan antingen vara direkt eller övergående. Det vill säga föräldern kan vara direkt ansvarig för skapandet eller förstörelsen av barnet eller föräldern kan använda ett barn som redan har skapats. På samma sätt kan ett överordnat objekt delegera kontrollen till någon annan förälder för att förstöra det underordnade objektet. Komposition representeras i UML med en linje som förbinder objekten med en solid diamant i slutet av objektet som äger det andra objektet.

Jag hoppas att denna diskussion om associering, aggregering och sammansättning har hjälpt dig att förstå hur dessa tre begrepp skiljer sig åt. Kom ihåg att aggregering och sammansättning båda är underuppsättningar. I både aggregering och komposition kan ett objekt i en klass vara ägare till ett objekt i en annan klass. Och i både aggregering och sammansättning tillhör underordnade objekt ett ensamstående förälderobjekt, dvs. de kan bara ha en ägare.

Slutligen, i ett aggregeringsförhållande, är livscyklerna för förälderobjekt och barnobjekt oberoende. I ett sammansättningsförhållande betyder döden av ett föräldersobjekt också dess barns död.