Agregare vs Compoziție
On februarie 12, 2021 by adminÎnțeleg ce este compoziția în POO, dar nu sunt capabil să-mi fac o idee clară despre ce este Agregarea. Poate cineva să explice?
Răspuns
Reguli simple:
- Un „deține” B = Compoziție: B nu are nicio semnificație sau scop în sistem fără A
- A „folosește” B = Agregare: B există independent (conceptual) de A
Exemplul 1:
O companie este o agregare de oameni. O companie este o compoziție de conturi. Când o companie încetează să mai facă afaceri, conturile sale încetează să mai existe, dar oamenii ei continuă să existe.
Exemplul 2: (foarte simplificat)
Un editor de text deține un buffer (compoziție). Un editor de text utilizează un fișier (agregare). Când Editorul de text este închis, tamponul este distrus, dar fișierul în sine nu este distrus.
Comentarii
- La fel este o mașină un agregat sau un compoziția părților sale?
- Și cum diferă agregarea de orice altă relație între două tipuri de entități?
- @reinierpost În realitate , o mașină este o agregarea părților și părțile sunt pur și simplu o agregare a moleculelor … Cu toate acestea, într-un model totul depinde de cerințele dvs. Este important să tratați motorul ca pe o entitate separată, astfel încât să îi puteți urmări durata de viață independent de mașină? Puteți refolosi exact același motor într-o altă mașină? Dacă da, probabil că doriți agregare. În caz contrar, doriți o compoziție, deoarece ‘ nu vă pasă de motoarele care nu fac parte ‘ t și nu vă interesează refolosirea motoarelor .
- ceea ce lipsește este un exemplu de implementare pentru o înțelegere completă …
- Cum rămâne cu angajatul atunci când o companie încetează să mai facă afaceri? Angajații și oamenii sunt entități diferite, nu? Așadar, pot spune că compania este compoziția angajaților?
Răspuns
De la http://en.wikipedia.org/wiki/Object_composition
Agregarea diferă de compoziția obișnuită prin faptul că nu implică proprietate. În compoziție, atunci când obiectul proprietar este distrus, la fel sunt și obiectele conținute. În agregare, acest lucru nu este neapărat adevărat. De exemplu, o universitate deține diferite departamente (de exemplu, chimie) și fiecare departament are un număr de profesori. Dacă universitatea se închide, departamentele nu vor mai exista, dar profesorii din aceste departamente vor continua să existe. Prin urmare, o universitate poate fi văzută ca o compoziție de departamente, în timp ce departamentele au o agregare de profesori. În plus, un profesor ar putea lucra în mai multe departamente, dar un departament nu ar putea face parte din mai multe universități.
Deci – în timp ce aveți o relație de proprietate cu compoziția obiectul deținut este, de asemenea, distrusă atunci când proprietarul este – o agregare (și obiectele conținute) pot exista independent.
–
Actualizare: Scuze – acest răspuns este mult prea simplist în retrospectivă.
@Curtis Batt oferă o definiție excelentă în răspunsul său: Agregare vs Compoziție
Comentarii
- În exemplul pe care îl citați, compoziția este de la unu la mulți, iar agregarea are, de asemenea, o relație de la unu la mulți implicată, deși aici ar putea, de asemenea, să fie o relație de mai mulți la mulți pentru agregare (putem presupune că un profesor poate preda în mai multe departamente). În timp ce un departament nu poate face parte din mai multe universități. Compoziția implică proprietatea, în timp ce agregarea nu depășește relația. Citatul este corect, dar comentariul nu este.
- nu are nimic de-a face cu distrugerea! UML nu definește sistemul de colectare a gunoiului.
- Cred că link-ul Wikipedia primește voturi pozitive reflexive, dar aceasta este o definiție teribilă – așa cum a subliniat @bold, aceste relații nu au nimic de-a face cu GC. Acest lucru se destramă și atunci când un obiect este componenta altor două obiecte, cum ar fi mingea dintr-o articulație cu bilă care unește două membre artificiale. Relația Componentă este legată de dependența funcțională.
- Sunt de acord că răspunsul meu lipsește grav – dar și articolul WikiPedia …
- Diferența dintre compoziție și agregare este clară. Problema cu agregarea este că ‘ nu este clar cum este diferit de asocierea obișnuită.
Răspuns
-
Compoziția este o asociere
-
Agregarea este o asociere
-
Compoziția este o asociere puternică (Dacă viața obiectului conținut depinde în totalitate de obiectul container, se numește asociere puternică)
-
Agregarea este o asociație slabă (dacă viața obiectului conținut nu depinde de obiectul containerului, se numește asociere slabă)
Exemplu:
class Contained { public void disp() { System.out.println("disp() of Contained A"); } } public class Container { private Contained c; //Composition Container() { c = new Contained(); } //Association public Contained getC() { return c; } public void setC(Contained c) { this.c = c; } public static void main(String[] args) { Container container = new Container(); Contained contained = new Contained(); container.setC(contained); } }
Comentarii
- Care este diferența dintre agregare și asociere care nu este nici compoziție, nici agregare?
Răspuns
Nu există o explicație unică. Autori diferiți înseamnă lucruri diferite prin agregare. Majoritatea nu înseamnă cu adevărat nimic specific prin ea.
Comentarii
- Aceasta este răspunsul corect. ‘ l-am citit în două cărți, una dintre ele fiind Martin Fowler ‘ s UML Distilled .
- martinfowler.com/bliki/AggregationAndComposition.html
Răspuns
Compoziția (amestec) este un mod de a combina obiecte simple sau tipuri de date în altele mai complexe. Compozițiile reprezintă un element constitutiv critic al multor structuri de date de bază
Agregare în sensul că nu implică proprietatea. În compoziție, atunci când obiectul proprietar este distrus, la fel sunt și obiectele conținute. În agregare, acest lucru nu este neapărat adevărat
╔═══════════╦═════════════════════════╦═══════════════════════╗ ║ ║ Aggregation ║ Composition ║ ╠═══════════╬═════════════════════════╬═══════════════════════╣ ║ Life time ║ Have their own lifetime ║ Owner"s life time ║ ║ Relation ║ Has ║ part-of ║ ║ Example ║ Car has driver ║ Engine is part of Car ║ ╚═══════════╩═════════════════════════╩═══════════════════════╝
Ambele denotă relația dintre obiect și diferă doar prin puterea lor.
Notări UML pentru diferite tipuri de dependență între două clase
Compoziție : Deoarece Motorul face parte din Car, relația dintre acestea este Compoziție. Iată cum sunt implementate între clasele Java.
public class Car { //final will make sure engine is initialized private final Engine engine; public Car(){ engine = new Engine(); } } class Engine { private String type; }
Agregare : Deoarece organizația are o persoană ca angajați, relația dintre ei este Agregare. Iată cum arată în termeni de clase Java
public class Organization { private List employees; } public class Person { private String name; }
Comentarii
- acest lucru nu ‘ pare să ofere nimic substanțial asupra punctelor formulate și explicate în cele 12 răspunsuri anterioare
- Destul de sigur că cărțile pot exista fără biblioteci. Exemplu prost!
- Aici Lista angajaților face parte din Organizarea obiectului. Cum poate fi aceasta agregare?
- În ce fel este asocierea diferită de agregare?
- Îmi place acest răspuns. În cele din urmă mi-a explicat corect care este diferența dintre agregare și compoziție.
Răspuns
agregarea este o simplă colectarea, ca o pungă de marmură
compoziția implică dependențe interne / funcționale, cum ar fi balamalele de pe o cutie
mașini agregate de pasageri; intră și ies fără a rupe funcționalitatea mașinii
anvelopele sunt componente; scoateți una și mașina nu mai funcționează corect
[notă: anvelopa de rezervă este un ansamblu! ]
Răspuns
Mă uit întotdeauna la compoziție ca „are nevoie de”, adică o mașină are nevoie de motor, și privesc agregarea ca „lucruri legate de un scop”. Așadar, rămânând cu analogia mașinii, agregarea mea poate fi reprezentarea unei călătorii care poate implica aducerea unei mașini și a pasagerilor împreună. Călătoria nu deține mașina sau pasagerii, adun date care sunt legate pentru un scenariu specific. Când călătoria este finalizată, mașina și pasagerii continuă. Când o mașină se oprește, mașina și motorul acesteia sunt în mod normal distruse împreună.
Răspuns
Ce zici de acest exemplu simplu :
O matrice de obiecte este o compoziție. O matrice de indicatori către obiecte este o agregare.
Dacă șterg primul, conținutul său dispare odată cu acesta. Al doilea, pe de altă parte, poate dispărea fără a afecta existența membrilor săi, cu excepția cazului în care există o metodă specifică care șterge fiecare obiect pe măsură ce indicatorul său este șters.
Comentarii
- acest lucru nu ‘ nu pare să adauge nimic substanțial asupra punctelor formulate și explicate în cele 11 răspunsuri anterioare
- Respect cu dezacord, @gnat. Acesta este un exemplu util al modului în care două ar putea fi puse în aplicare. Oamenii învață mai bine cu exemple.(Am venit aici pentru a-mi verifica înțelegerea că un membru pointer era probabil o agregare, iar un membru obiect o compoziție. Acesta este singurul răspuns pentru a aborda direct acest lucru.)
Răspuns
Semantic, toate seturile sunt formate din subseturi, nu? Prin urmare:
-
Agregarea este atunci când acele subseturi există independent de setul tată. Deoarece un monitor poate fi deconectat de la computer pentru a fi conectat la altul.
-
Compoziția este atunci când acele subseturi depind de existența setului tată. Așa cum o frunză este o parte a unui copac sau ficatul este o parte a unui corp.
Aceste concepte vorbesc despre tipul de dependență dintre două obiecte sau clase, conceptual. Direct într-un program, într-o agregare, atunci când obiectul tată dispune, obiectele agregate ar trebui să fie eliminate și ele. În același scenariu pentru o compoziție, obiectele compozite ale fiului vor persista, apoi obiectul tatăl dispensa.
Lasă un răspuns