Mezclar (programación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 14 de julio de 2017; las comprobaciones requieren 10 ediciones .

Una mezcla ( eng.  mix in ) es un elemento de un lenguaje de programación (generalmente una clase o módulo) que implementa un comportamiento claramente definido. Se utiliza para refinar el comportamiento de otras clases, sin la intención de generar autoutilizables .

En los lenguajes de programación orientados a objetos, es una forma de implementar clases que es diferente de los principios ampliamente utilizados que provienen del lenguaje de programación Simula . El mecanismo se implementa por primera vez en Flavors. La ventaja de los mixins es que al aumentar la reutilización del código del programa , esta técnica evita muchos de los problemas de la herencia múltiple . Sin embargo, este método impone sus limitaciones.

Implementación

En la mayoría de los lenguajes orientados a objetos, comenzando con Simula , una clase se define mediante atributos , métodos , constructores y destructores como una sola entidad estrechamente relacionada. La definición de clase está completa. Fue este hecho lo que les pareció útil a Stroustrup y Ellis, quienes, sobre esta base, no implementaron mixins en C ++ a nivel de lenguaje (C ++ se desarrolló como una "extensión de C compatible hacia Simula") .

En un lenguaje mixin, una clase se define con solo los atributos y parámetros asociados con la clase. Los métodos se definen en otros lugares, como en Flavors y CLOS , y son funciones genéricas. Estos últimos se implementan para varios tipos a través de la programación.

Además de Flavors y CLOS, los mixins admiten los siguientes idiomas:

Ejemplo

Uso de impurezas

Un ejemplo en Ruby. La clase implementa el concepto simple de edad. El valor de la edad se almacena en la variable interna " edad ", que está abierta para escritura y lectura. Para poder comparar edades, la clase implementa un solo operador " <=> ", y todos los demás (mayor que, menor que, igual a, etc.) se implementan usando este método en el módulo de inclusión " Comparable ".

clase Edad incluyen Comparable attr_accessor ( :edad ) def <=> ( cmp ) @edad <=> cmp . fin de edad fin

El ejemplo demuestra la creación de objetos y el uso de métodos "mixtos":

a , b = Edad . nuevo , Edad . nuevo un . edad = 10 b . edad = 11 si a < b entonces pone "a es menor que b". final

Emulación

Los mixins pueden verse como una implementación incompleta de la herencia múltiple , un tipo particular de ella. En lenguajes que admiten herencia múltiple, los mixins se pueden emular fácilmente. Por ejemplo, en C++ , se puede usar el siguiente patrón para agregar un operador " != " a una clase cuando hay un operador " == ":

plantilla < nombre de tipo T > struct AddNoEq { operador booleano virtual == ( const T & cmp ) const = 0 ; operador booleano != ( const T & cmp ) const { volver ! static_cast < const T *> ( this ) -> operator == ( cmp ); } };

Un caso de uso simple para la clase de número complejo :

#incluir <iostream> struct Complejo : public AddNoEq < Complejo > { Complejo ( int re , int im ) : re_ ( re ), im_ ( im ) { } operador booleano virtual == ( const Complex & cmp ) const { volver cmp . re_ == esto -> re_ && cmp . im_ == esto -> im_ ; } // ... privado : int re_ , im_ ; }; int principal () { Complejo a ( 1 , 2 ), b ( 2 , 3 ); si ( a != b ) std :: cout << "Así debe ser" << std :: endl ; devolver 0 ; }

Este método se usa en una forma más amplia en la biblioteca de operadores Boost .

Nota

La funcionalidad cercana a las impurezas la proporcionan las interfaces en lenguajes como Java y C# , con la diferencia de que una interfaz solo especifica el comportamiento, pero no proporciona una implementación (en Java, desde la versión 1.8, se permite una implementación parcial en una interfaz) . C# introduce el concepto de "implementación predeterminada" a partir de la versión 8.0). El mecanismo solo puede ser útil para representar polimorfismos . Otras clases que proporcionan una implementación de una interfaz son útiles para llevar la funcionalidad común a un solo lugar.

Usando métodos de extensión e interfaces juntos , es posible implementar la funcionalidad mixin en C#.

Véase también

Enlaces

  • Mix In  (inglés)  : una descripción de este método de programación.