Composición de objetos

De Wikipedia, la enciclopedia libre

En ciencias de la computación, la composición de objetos es una forma de combinar objetos o tipos de datos en otros más complejos. Las composiciones se relacionan con, pero no son las mismas que, las estructuras de datos y las que son más comunes son la unión etiquetada, el conjunto, la secuencia y varias estructuras gráficas, así como el objeto utilizado en la programación orientada a objetos.

La composición de objetos se refiere a la estructura lógica o conceptual de la información, no a la implementación o estructura de datos físicos utilizada para representarla. Por ejemplo, una secuencia difiere de un conjunto porque (entre otras cosas) el orden de los elementos que los componen es importante para el primero pero no para el segundo. Se pueden utilizar estructuras de datos tales como matrices, listas enlazadas, tablas hash y muchas otras para implementar cualquiera de ellas.

Algunos de los términos son utilizados tanto para estructuras de datos como para composiciones. Por ejemplo, "árbol binario" puede referirse a uno de los dos: como estructura de datos es un medio para acceder a una secuencia lineal de elementos, y las posiciones reales de los elementos en el árbol son irrelevantes (el árbol puede ser reorganizado internamente como uno quiera, sin cambiar su significado). Sin embargo, como una composición de objetos, las posiciones son relevantes, y cambiarlas cambiaría el significado (como por ejemplo en los cladogramas).

Detalles[editar]

En programación, los tipos pueden dividirse a menudo en tipos compuestos y no compuestos y la composición puede considerarse como una relación entre tipos: un objeto de un tipo compuesto (por ejemplo, un coche) "tiene" objetos de otros tipos (por ejemplo, una rueda). Cuando un objeto compuesto contiene varios objetos parciales del mismo tipo, pueden asignarse a funciones particulares, a menudo distinguidas por nombres o números. Por ejemplo, un objeto Punto puede contener 3 números, cada uno de los cuales representa una distancia a lo largo de un eje diferente, como `x', `y', y `z'. El estudio de las relaciones parciales-enteras en general, es una mera cuestión de mereología.

La composición debe distinguirse de la subespecificación, que es el proceso de añadir detalles a un tipo de datos generales para crear un tipo de datos más específico. Por ejemplo, los coches pueden ser un tipo específico de vehículo: el coche es un vehículo. El subtipo no describe una relación entre diferentes objetos, sino que dice que los objetos de un tipo son simultáneamente objetos de otro tipo. El estudio de tales relaciones es ontológico.

Los objetos compuestos pueden representarse en el almacenamiento mediante la co-ubicación de los elementos compuestos, mediante la co-ubicación de referencias, o de muchas otras maneras. Los elementos dentro de un objeto compuesto pueden ser referidos como atributos, campos, miembros, propiedades u otros nombres y la composición resultante como tipo compuesto, registro de almacenamiento, estructura, tupla, o un tipo definido por el usuario (UDT).

Notación UML[editar]

En UML, hay dos maneras de modelar composiciones: Composición y agregación. Por lo tanto, en UML, la composición tiene un significado más restrictivo que en el lenguaje ordinario:

La composición se representa como un rombo relleno y una línea sólida.

La composición es un tipo de asociación en la que el objeto compuesto es el único responsable de la disposición de las partes que lo componen. La relación entre el compuesto y el componente es una relación "tiene" fuerte, ya que el objeto compuesto se apropia del componente. Esto significa que el compuesto es responsable de la creación y destrucción de los componentes. Un objeto sólo puede ser parte de una composición. Si se destruye el objeto compuesto, se deben destruir todos los componentes. La pieza no tiene vida propia y no puede ser transferida a otro objeto. La composición refuerza la encapsulación, ya que los componentes suelen ser miembros del objeto compuesto.

La forma más general, la agregación, se representa como un rombo sin rellenar y una línea sólida.

La agregación es un tipo de asociación que especifica una relación total/parte entre el agregado (total) y la parte componente. Esta relación entre el agregado y el componente es una relación "tiene" débil, ya que el componente puede sobrevivir al objeto agregado. Se puede acceder al objeto componente a través de otros objetos sin pasar por el objeto agregado. El objeto agregado no participa en el ciclo de vida del objeto componente, lo que significa que el objeto componente puede sobrevivir al objeto agregado. El estado del objeto componente todavía forma parte del objeto agregado.

Agregación[editar]

La agregación difiere de la composición ordinaria en que no implica la propiedad. En la composición, cuando el objeto propietario es destruido, 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 un número de profesores. Si la universidad cierra, los departamentos dejarán de existir, pero los profesores de esos departamentos seguirán existiendo. Por lo tanto, una Universidad puede ser vista como una composición de departamentos, mientras que los departamentos tienen una agregación de profesores. Además, un profesor puede trabajar en más de un departamento, pero un departamento no puede formar parte de más de una universidad.

La composición se implementa normalmente de tal manera que un objeto contiene otro objeto. Por ejemplo, en C++:

class Professor;  // Definida en otro lugar

class Department {
 public:
  Department(const std::string& title): title_(title) {}

 private:
  // Agregacion: |Profesores| pueden trabajar para |Departamento|.
  std::vector<std::weak_ptr<Professor>> members_;
  const std::string title_;
};


class University {
 public:
  University() = default;

 private:
  // Composicion: Departmentos existen únicamente si la facultad existe.
  std::vector<Department> faculty_ = {
      Department("Quimica"),
      Department("Física"),
      Department("Bellas Artes"),
  };
};

En la agregación, el objeto sólo puede contener una referencia o un puntero al objeto (y no tener responsabilidad de por vida por él).

A veces se hace referencia a la agregación como composición cuando la distinción entre composición ordinaria y agregación no es importante.

El ejemplo anterior se transformaría en el siguiente diagrama de clase UML: