Articulo de referencia

Composición del objeto

En informática , la composición y la agregación de objetos son formas estrechamente relacionadas de combinar objetos o tipos de datos para formar otros más complejos. En la conv...

En informática , la composición y la agregación de objetos son formas estrechamente relacionadas de combinar objetos o tipos de datos para formar otros más complejos. En la conversación, a menudo se ignora la distinción entre composición y agregación. [ 1 ] Algunos ejemplos comunes de composición son los objetos utilizados en la programación orientada a objetos , las uniones etiquetadas , los conjuntos , las secuencias y diversas estructuras de grafos . Las composiciones de objetos se relacionan con las estructuras de datos, pero no son lo mismo.

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ísica utilizada para representarla . Por ejemplo, una secuencia difiere de un conjunto porque (entre otras cosas) el orden de los elementos que la componen importa para la primera, pero no para el segundo. Estructuras de datos como arreglos , listas enlazadas , tablas hash y muchas otras pueden usarse para implementar cualquiera de ellos. Puede resultar confuso que algunos términos se usen tanto para estructuras de datos como para composiciones. Por ejemplo, " árbol binario " puede referirse a: 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 se puede reorganizar internamente como se desee, sin cambiar su significado). Sin embargo, como composición de objetos, las posiciones son relevantes, y cambiarlas cambiaría el significado (como por ejemplo en los cladogramas ) .

Técnica de programación

La programación orientada a objetos se basa en el uso de objetos para encapsular datos y comportamiento. Utiliza dos técnicas principales para ensamblar y componer funcionalidades más complejas: la subtipificación y la composición de objetos. [ 2 ] La composición de objetos consiste en combinar objetos dentro de objetos compuestos, asegurando al mismo tiempo la encapsulación de cada objeto mediante su interfaz bien definida , sin que se vean sus detalles internos. En este sentido, la composición de objetos se diferencia de las estructuras de datos, que no imponen la encapsulación.

La composición de objetos también puede referirse a un grupo de múltiples objetos relacionados, como un conjunto o una secuencia de objetos. La delegación puede enriquecer la composición al reenviar las solicitudes o llamadas realizadas al objeto compuesto contenedor a uno de sus componentes internos. [ 3 ]

En los lenguajes de programación basados ​​en clases y tipados , los tipos se pueden dividir en tipos compuestos y no compuestos, y la composición puede considerarse como una relación entre tipos: un objeto de un tipo compuesto (p. ej., coche ) " tiene " objetos de otros tipos (p. ej., rueda ). Cuando un objeto compuesto contiene varios subobjetos del mismo tipo, se les pueden asignar roles particulares , a menudo distinguidos por nombres o números. Por ejemplo, un objeto Punto podría contener 3 números, cada uno representando la distancia a lo largo de un eje diferente, como 'x', 'y' y 'z'. El estudio de las relaciones parte-todo en general es la mereología .

La composición debe distinguirse del subtipado , que es el proceso de añadir detalles a un tipo de dato general para crear un tipo de dato más específico. Por ejemplo, los coches pueden ser un tipo específico de vehículo: coche es un vehículo . El subtipado no describe una relación entre diferentes objetos, sino que indica que los objetos de un tipo son simultáneamente objetos de otro tipo. El estudio de dichas relaciones es la ontología .

En lenguajes de programación basados ​​en prototipos , como JavaScript , los objetos pueden heredar dinámicamente el comportamiento de un objeto prototipo en el momento de su instanciación. Es importante distinguir entre composición y prototipado: el objeto recién instanciado hereda la composición de su prototipo, pero también puede componerse a sí mismo.

Los objetos compuestos pueden representarse en el almacenamiento mediante la ubicación conjunta de los objetos que los componen, la ubicación conjunta de referencias o de muchas otras maneras. Los elementos dentro de un objeto compuesto pueden denominarse atributos , campos , miembros , propiedades u otros nombres, y la composición resultante como tipo compuesto , registro de almacenamiento , estructura , tupla o tipo definido por el usuario (UDT) . Para obtener más detalles, consulte la sección de agregación a continuación.

Técnica de modelado UML

Una clase de bicicleta representada en UML, con tres propiedades: sillín, ruedas y partes, las dos últimas con una multiplicidad que indica varios objetos.
Composición de objetos utilizando propiedades UML para componer objetos

En el modelado UML , los objetos pueden componerse conceptualmente, independientemente de la implementación con un lenguaje de programación. Hay cuatro formas de componer objetos en UML: propiedad, asociación, agregación y composición: [ 4 ]

  • Una propiedad representa un atributo de la clase.
  • Una asociación representa una relación semántica entre instancias de las clases asociadas. El extremo miembro de una asociación corresponde a una propiedad de la clase asociada.
  • Una agregación es un tipo de asociación que modela una relación parte/todo entre un agregado (todo) y un grupo de componentes relacionados (partes).
  • Una composición, también llamada agregación compuesta, es un tipo de agregación que modela una relación parte/todo entre un compuesto (todo) y un grupo de partes de propiedad exclusiva.

La relación entre el agregado y sus componentes es una relación débil de "tiene un": los componentes pueden formar parte de varios agregados, se puede acceder a ellos a través de otros objetos sin pasar por el agregado y pueden sobrevivir al objeto agregado. [ 4 ] El estado del objeto componente sigue formando parte del objeto agregado.

La relación entre el objeto compuesto y sus partes es una fuerte relación de dependencia: el objeto compuesto tiene la responsabilidad exclusiva de la existencia y el almacenamiento de los objetos que lo componen , puede formar parte de un máximo de un objeto compuesto, y si se elimina un objeto compuesto, todas las instancias de sus partes que sean objetos se eliminan con él . Por lo tanto, en UML, la composición tiene un significado más restringido que la composición de objetos habitual.

Asociación entre varias bicicletas, cada una con un propietario; composición de una bicicleta con las partes del cuadro que la conforman; y agregación de una bicicleta con sus ruedas, que existen sin la bicicleta.
Notación UML para asociación, composición y agregación.

La notación gráfica representa:

  • la propiedad como un elemento tipificado en el cuadro de la clase contenedora,
  • la asociación como una línea recta entre las clases asociadas,
  • la agregación como un diamante sin rellenar en el lado del agregado y una línea sólida,
  • la composición como un diamante relleno en el lateral del compuesto y una línea sólida.

Agregación

La agregación se diferencia de la composición ordinaria en que no implica propiedad. En la composición, cuando se destruye el objeto propietario, también se destruyen los objetos contenidos. En la agregación, esto no es necesariamente cierto. Por ejemplo, una universidad posee varios departamentos (p. ej., química ), y cada departamento tiene varios profesores. Si la universidad cierra, los departamentos dejarán de existir, pero los profesores que trabajan en ellos seguirán existiendo. Por lo tanto, una universidad puede considerarse una composición de departamentos, mientras que los departamentos constituyen una agregación de profesores. Además, un profesor puede trabajar en más de un departamento, pero un departamento no puede pertenecer a más de una universidad.

La composición se suele implementar de forma que un objeto contenga otro objeto. Por ejemplo, en C++ :

importar std ;using std :: string ; using std :: vector ; using std :: weak_ptr ;clase Profesor { // ... };clase Departamento { privado : // Agregación: Los profesores pueden sobrevivir al Departamento. vector < weak_ptr < Profesor >> miembros ; const string título ; público : explicit Departamento ( const string & título ) : título { título } {} };clase Universidad { privado : // Composición: Los departamentos existen solo mientras exista la facultad. vector <Departamento> facultad = { Departamento ( " Química" ), Departamento ( "Física" ), Departamento ( "Artes" ), // más departamentos aquí... }; público : Universidad () = predeterminado ; };

En la agregación, el objeto solo puede contener una referencia o un puntero al objeto (y no tener responsabilidad sobre él durante todo su ciclo de vida ).

En ocasiones, la agregación se denomina composición cuando la distinción entre composición ordinaria y agregación no es importante.

El código anterior se transformaría en el siguiente diagrama de clases UML:

Agregación en COM

Agregación en COM

En el Modelo de Objetos Componentes de Microsoft , la agregación implica que un objeto exporta, como si fuera su propietario, una o varias interfaces de otro objeto que posee. Formalmente, esto se asemeja más a la composición o encapsulación que a la agregación. Sin embargo, en lugar de implementar las interfaces exportadas mediante la llamada a las interfaces del objeto poseído, se exportan las propias interfaces del objeto poseído. El objeto poseído es responsable de asegurar que los métodos de dichas interfaces heredadas de IUnknown invoquen realmente los métodos correspondientes del propietario. Esto garantiza que el contador de referencias del propietario sea correcto y que todas las interfaces del propietario sean accesibles a través de la interfaz exportada, mientras que ninguna otra interfaz (privada) del objeto poseído sea accesible. [ 5 ]

Formularios especiales

Contención

La composición que se utiliza para almacenar varias instancias del tipo de datos compuesto se denomina contención. Ejemplos de dichos contenedores son los arreglos , los arreglos asociativos , los árboles binarios y las listas enlazadas .

En UML , la contención se representa con una multiplicidad de 0..* o 1..*, lo que indica que el objeto compuesto está formado por un número desconocido de instancias de la clase compuesta.

Composición recursiva

Los objetos se pueden componer recursivamente, y su tipo se denomina entonces tipo recursivo . Algunos ejemplos incluyen diversos tipos de árboles , grafos acíclicos dirigidos (DAG) y grafos . Cada nodo de un árbol puede ser una rama o una hoja; en otras palabras, cada nodo es un árbol al mismo tiempo que pertenece a otro árbol.

En UML, la composición recursiva se representa mediante una asociación, agregación o composición de una clase consigo misma.

Patrón compuesto

El patrón de diseño compuesto es un diseño orientado a objetos basado en tipos compuestos, que combina la composición recursiva y la contención para implementar jerarquías complejas de parte-todo.

Tipos compuestos en C

Este es un ejemplo de composición en C.

enum Empleo { BUSCANDO_TRABAJO , PROFESIONAL , NO_PROFESIONAL , JUBILADO , ESTUDIANTE };struct Persona { char nombre [ 20 ]; int edad ; Empleo empleo ; };

En este ejemplo, los tipos primitivos (no compuestos) inty enum Employmentel tipo de matriz compuesta char[]se combinan para formar la estructura compuesta struct Person. Cada struct Personestructura "tiene" entonces una edad, un nombre y un tipo de empleo.

Cronología de la composición en varios idiomas

C llama a un registro una estructura o struct; los lenguajes orientados a objetos como Java , Smalltalk y C++ a menudo mantienen sus registros ocultos dentro de objetos ( instancias de clase ); los lenguajes de la familia ML simplemente los llaman registros. COBOL fue el primer lenguaje de programación ampliamente utilizado en admitir registros directamente; [ 6 ] ALGOL 68 lo tomó de COBOL y Pascal lo tomó, más o menos indirectamente, de ALGOL 68. Common Lisp proporciona estructuras y clases (estas últimas a través del Common Lisp Object System ).

1959 – COBOL
01 registro de cliente . 03 número de cliente pic 9(8) comp . 03 nombre del cliente . 05 nombres de pila pic x(15) . 05 inicial-2 pic x . 05 apellido pic x(15) . 03 dirección del cliente . 05 calle . 07 nombre de la calle pic x(15) . 09 número de casa pic 999 comp . 05 ciudad pic x(10) . 05 código de país pic x(3) . 05 código postal pic x(8) . 03 importe adeudado pic 9(8) comp .
1960 – ALGOL 60

Los arrays eran el único tipo de datos compuestos en Algol 60 .

1964 – PL/I
dcl 1 newtypet basado (P); 2 (a, b, c) contenedor fijo (31), 2 (i, j, k) flotante, 2 punteros r; asignar nuevo tipo; 
1968 – ALGOL 68
entero máximo = 99; modo nuevotipo = [0..9] [0..max]struct ( largo real a, b, c, corto entero i, j, k, ref real r ); nuevotipo nuevoarrayt = (1, 2, 3, 4, 5, 6, montón real := 7) 

Por ejemplo, una lista enlazada podría declararse de la siguiente manera:

nodo de modo = unión (real, int, compl, string), lista = estructura (valor del nodo, lista de referencias siguiente); 

En ALGOL 68, solo aparece el nombre del tipo a la izquierda de la igualdad, y lo más destacable es que la construcción se realiza, y se puede leer, de izquierda a derecha sin tener en cuenta las prioridades.

1970 – Pascal
tipo a = matriz [ 1 .. 10 ] de entero ; b = registro a , b , c : real ; i , j , k : entero ; fin ;
1972 – K&R C
#define MAX 99struct Aggregation { double a , b , c ; float r ; short i , j , k ; };struct Agregación a [ 10 ][ MAX + 1 ];
1977 – FORTRAN 77

Fortran 77 tiene arreglos, pero carecía de definiciones formales de registros/estructuras. Normalmente, las estructuras compuestas se construían utilizando sentencias EQUIVALENCEOR :COMMON

NOMBRE DEL PERSONAJE * 32 , DIRECCIÓN * 32 , TELÉFONO * 16 REAL DEUDA COMÚN / CLIENTE / NOMBRE , DIRECCIÓN , TELÉFONO , DEUDA
1983 – Ada
tipo Cust es registro Nombre : Name_Type ; Dirección : Addr_Type ; Teléfono : Phone_Type ; Saldo : Rango entero 1. . 999999 ; fin del registro ;

Ada 95 introdujo conceptos de POO a través de tipos etiquetados (el equivalente a una clase de C++), y Ada 2012 añadió soporte para la verificación de sustitución a través de contratos a nivel de clase.

1983 – C++
#define MAX 99;struct Aggregation { double a , b , c ; float & r ; short i , j , k ; };Agregación a [ 10 ][ MAX + 1 ];
1991 – Python
max = 99 clase NewTypeT : def __init__ ( self ) : self.a = self.b = self.c = 0 self.i = self.j = self.k = 0.0 # Inicializa un array de ejemplo de esta clase . newarrayt = [ [ NewTypeT ( ) for i in range ( max + 1 ) ] for j in range ( 10 ) ]
1992 – FORTRAN 90

Las matrices y las cadenas se heredaron de FORTRAN 77, y se introdujo una nueva palabra reservada:type

tipo nuevo tipo doble precisión a , b , c entero * 2 i , j , k * No tipo puntero REF REAL R fin tipotipo ( newtypet ) t ( 10 , 100 )

FORTRAN 90 se actualizó e incluyó el concepto de FORTRAN IVNAMELIST llamado .

INTEGER :: ene = 1 , feb = 2 , mar = 3 , abr = 4 LISTA DE NOMBRES / semana / ene , feb , mar , abr
1994 – ANSI Common Lisp

Common Lisp proporciona estructuras y el estándar ANSI Common Lisp añadió CLOSclases.

( defclass alguna-clase () (( f :tipo float ) ( i :tipo entero ) ( a :tipo ( array entero ( 10 )))))

Para obtener más detalles sobre la composición en C/C++, consulte el tipo Composite .

Véase también

Referencias

  1. Yaiser, Michelle. «Conceptos de programación orientada a objetos: composición y agregación» . Archivado del original el 8 de abril de 2015. Existe un concepto estrechamente relacionado con la composición llamado agregación. En las conversaciones, a menudo se ignoran las diferencias entre composición y agregación.
  2. Patrones de diseño : elementos de software orientado a objetos reutilizable . Gamma, Erich, Helm, Richard (científico informático), Johnson, Ralph E., 1955-, Vlissides, John. Reading, Mass.: Addison-Wesley. 1995. ISBN  0-201-63361-2OCLC 31171684 {{cite book}}: CS1 mantenimiento: otros ( enlace )
  3. Ostermann, Klaus; Mezini, Mira (1 de octubre de 2001). "Composición orientada a objetos desenredada" . ACM SIGPLAN Notices . 36 (11): 283– 299. doi : 10.1145/504311.504303 . ISSN 0362-1340 . 
  4. 1 2 OMG (2017). "Especificación del lenguaje de modelado unificado versión 2.5.1" . www.omg.org . págs. 109-110, 197-201 . Consultado el 4 de octubre de 2020 . 
  5. "Agregación" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 4 de noviembre de 2007 .
  6. Sebesta, Robert W. (1996). Conceptos de lenguajes de programación (Tercera ed.). Addison-Wesley Publishing Company, Inc. pág . 218. ISBN   0-8053-7133-8.
  • Asociación, agregación y composición , consultado en febrero de 2009.
  • Harald Störrle, UML2, Addison-Wesley, 2005