Agregación vs Composición

206

Entiendo qué composición hay en OOP, pero no puedo tener una idea clara de qué es la agregación. Alguien puede explicar?

Vinoth Kumar CM
fuente

Respuestas:

322

Reglas simples:

  1. A "posee" B = Composición: B no tiene significado ni propósito en el sistema sin A
  2. A "usa" B = Agregación: B existe independientemente (conceptualmente) de A

Ejemplo 1:

Una empresa es una agregación de personas. Una empresa es una composición de cuentas. Cuando una Compañía deja de hacer negocios, sus Cuentas dejan de existir pero su Gente continúa existiendo.

Ejemplo 2: (muy simplificado)

Un editor de texto posee un buffer (composición). Un editor de texto usa un archivo (agregación). Cuando se cierra el Editor de texto, el Buffer se destruye pero el Archivo en sí no se destruye.

Curtis Batt
fuente
11
Entonces, ¿es un automóvil un agregado o una composición de sus partes?
reinierpost
2
¿Y en qué se diferencia la agregación de cualquier otra relación entre dos tipos de entidades?
reinierpost
55
@reinierpost En realidad , un automóvil es una agregación de partes, y las partes son simplemente una agregación de moléculas ... Sin embargo, en un modelo todo depende de sus requisitos. ¿Es importante tratar el motor como una entidad separada para poder seguir su vida útil independientemente del automóvil? ¿Se puede reutilizar exactamente el mismo motor en otro automóvil? Si es así, entonces probablemente quieras agregación. De lo contrario, desea una composición porque no le importan los motores que no son parte de los automóviles, ni le importa reutilizar los motores.
Curtis Batt
3
lo que falta es un ejemplo de implementación para una comprensión completa ...
Chesnokov Yuriy
1
¿Qué pasa con los empleados cuando una empresa deja de hacer negocios? Los empleados y las personas son entidades diferentes, ¿verdad? Entonces, ¿puedo decir que la compañía es composición de empleados?
Arjun
36

De http://en.wikipedia.org/wiki/Object_composition

La agregación difiere de la composición ordinaria en que no implica propiedad. En composición, cuando el objeto propietario se destruye, también lo son los objetos contenidos. En la agregación, esto no es necesariamente cierto. Por ejemplo, una universidad posee varios departamentos (por ejemplo, química) y cada departamento tiene varios profesores. Si la universidad cierra, los departamentos ya no existirán, pero los profesores en esos departamentos continuarán existiendo. Por lo tanto, una universidad puede verse como una composición de departamentos, mientras que los departamentos tienen una agregación de profesores. Además, un profesor podría trabajar en más de un departamento, pero un departamento no podría ser parte de más de una universidad.

Por lo tanto, si bien tiene una relación de propiedad con la composición, el objeto de propiedad también se destruye cuando el propietario lo es, una agregación (y los objetos contenidos) puede existir de forma independiente.

-

Actualización: disculpas: esta respuesta es demasiado simplista en retrospectiva.

c.batt proporciona una excelente definición en su respuesta: Agregación vs Composición

HorusKol
fuente
3
En el ejemplo que cita, la composición es de uno a muchos y la agregación también tiene una relación de uno a muchos implicada, aunque aquí también podría ser una relación de muchos a muchos para la agregación (podemos suponer que es posible que Un profesor puede enseñar en varios departamentos). Mientras que un departamento no puede ser parte de múltiples universidades. La composición implica propiedad, mientras que la agregación no va más allá de la relación. La cita es correcta pero el comentario no.
Newtopian
1
¡No tiene nada que ver con la destrucción! UML no define el sistema de recolección de basura.
Nombre para mostrar el
2
Creo que el enlace de Wikipedia está recibiendo votos positivos reflexivos, pero esta es una definición terrible, ya que @bold señaló que estas relaciones no tienen nada que ver con GC. Esto también se desmorona cuando un objeto es el componente de otros dos objetos, como la bola en una articulación esférica que une dos extremidades artificiales. La relación de componentes se trata de dependencia funcional.
Steven A. Lowe
1
Estoy de acuerdo en que mi respuesta es muy deficiente, pero también lo es el artículo de WikiPedia ...
HorusKol
La diferencia entre composición y agregación es clara. El problema con la agregación es que no está claro cómo es diferente de la asociación ordinaria.
reinierpost
20

No hay una sola explicación. Diferentes autores quieren decir cosas diferentes por agregación. La mayoría no quiere decir nada específico con eso.

reinierpost
fuente
44
Esta es la respuesta correcta. Lo he leído en dos libros, uno de ellos es UML Distilled de Martin Fowler .
davidhaskins
17
  • La composición es una asociación

  • La agregación es una asociación

  • La composición es una asociación fuerte (si la vida del objeto contenido depende totalmente del objeto contenedor, se llama asociación fuerte)

  • La agregación es una asociación débil (si la vida del objeto contenido no depende del objeto contenedor, se llama asociación débil)

Ejemplo:

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);
    } 
}
Pawan
fuente
2
¿Cuál es la diferencia entre agregación y asociación que no es ni composición ni agregación?
reinierpost
11

La composición (mezcla) es una forma de combinar objetos simples o tipos de datos en otros más complejos. Las composiciones son un componente fundamental de muchas estructuras de datos básicas.

La agregación (colección) difiere de la composición ordinaria en que no implica propiedad. En composición, cuando el objeto propietario se destruye, también lo son los objetos contenidos. En conjunto, esto no es necesariamente cierto

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

Ambos denotan relación entre objeto y solo difieren en su fuerza. ingrese la descripción de la imagen aquí

Notaciones UML para diferentes tipos de dependencia entre dos clases. ingrese la descripción de la imagen aquí

Composición : dado que el motor es parte del automóvil, la relación entre ellos es la composición. Así es como se implementan entre clases 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;
}

Agregación : Dado que la Organización tiene a una Persona como empleados, la relación entre ellos es la Agregación. Así es como se ven en términos de clases Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Fuente

Premraj
fuente
esto no parece ofrecer nada sustancial sobre los puntos hechos y explicados en las 12 respuestas anteriores
mosquito
Bastante seguro de que los libros pueden existir sin bibliotecas. ¡Mal ejemplo!
T Blank
Aquí la Lista de empleados es parte del objeto de organización. ¿Cómo puede ser esto agregación?
Salman Muhammad Ayub
¿Cómo es la asociación diferente de la agregación?
reinierpost
Me encanta esta respuesta Finalmente me explicó adecuadamente cuál es la diferencia entre agregación y composición.
PandasRocks
6

la agregación es una colección simple, como una bolsa de canicas

la composición implica dependencias internas / funcionales, como las bisagras de una caja

los automóviles agregan pasajeros; entran y salen sin romper la funcionalidad del automóvil

los neumáticos son componentes; retire uno y el automóvil ya no funciona correctamente

[nota: ¡la llanta de refacción es un agregado!]

Steven A. Lowe
fuente
1

Siempre veo la composición como 'necesita a', es decir, un automóvil necesita un motor, y veo la agregación como 'cosas relacionadas con un propósito'. Entonces, siguiendo la analogía del automóvil, mi agregación puede ser representar un viaje que puede implicar unir un automóvil y pasajeros. El viaje no es propiedad del automóvil ni de los pasajeros, estoy agregando datos relacionados con un escenario específico. Cuando se completa el viaje, el automóvil y los pasajeros continúan. Cuando se termina un automóvil, el automóvil y su motor normalmente se destruyen juntos.

Lázaro
fuente
0

Semánticamente, todos los conjuntos están hechos de subconjuntos, ¿verdad? Por lo tanto:

  • La agregación es cuando esos subconjuntos existen independientemente del conjunto padre. Como un monitor se puede desconectar de la computadora para conectarse a otro.

  • La composición es cuando esos subconjuntos dependen de la existencia del conjunto padre. Como una hoja es parte de un árbol o el hígado es parte de un cuerpo.

Estos conceptos hablan sobre el tipo de dependencia entre dos objetos o clases, conceptualmente. Directamente en un programa, en una agregación, cuando el objeto padre dispone, los objetos agregados también deben eliminarse. En el mismo escenario para una composición, los objetos hijo compuestos persistirán y el objeto padre se distribuirá.

Negarrak
fuente
-1

¿Qué tal este simple ejemplo:

Una matriz de objetos es una composición. Una matriz de punteros a objetos es una agregación.

Si elimino el primero, su contenido desaparece con él. El segundo, por otro lado, puede desaparecer sin afectar la existencia de sus miembros a menos que exista un método específico que elimine cada objeto a medida que se elimina su puntero.

usuario2831074
fuente
3
esto no parece añadir nada sustancial sobre los puntos realizados y explicados en anteriores 11 respuestas
mosquito
Respetuosamente en desacuerdo, @gnat. Este es un ejemplo útil de cómo se podrían implementar los dos. La gente aprende mejor con ejemplos. (Vine aquí para verificar mi comprensión de que un miembro de puntero probablemente sea una agregación, y un miembro de objeto una composición. Esta es la única respuesta para abordarlo directamente).
Bob Stein