Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Matricula: 100246818
Fecha: 05/12/2020
Concepto de programación genérica.
La programación genérica es un tipo de programación que está mucho más
centrada en los algoritmos que en los datos. La idea de esta forma de
programar pretende generalizar las funciones utilizadas para que puedan
usarse en más de una ocasión.
Esto se consigue parametrizando lo máximo posible el desarrollo del programa
y expresados o devueltos de la forma más simple posible, evitando detalles
concretos.
La biblioteca de funciones conseguida con esta manera de programa permite
que esas funciones puedan servir para más programas de los que, otras más
concretas, podrían ser útiles; y también aplicando pocos cambios, conseguir
que realice diferentes acciones.
¿Para qué sirve? Beneficios.
Los genéricos permiten personalizar un método, clase, estructura o interfaz con
respecto a los datos precisos sobre los que se actúa. Por ejemplo, en lugar de
utilizar la clase Hashtable, que permite cualquier tipo de clave y valor, puede
utilizar la clase genérica Dictionary<TKey,TValue> y especificar los tipos
permitidos para la clave y el valor. Entre las ventajas de los genéricos están
una mayor reutilización del código y la seguridad de tipos.
Explicar el concepto de plantillas o templates en programación genérica.
En esta nota estudiaremos una característica genial de C++, se trata de
las plantillas o templates. Una plantilla es una manera especial de escribir
funciones y clases para que estas puedan ser usadas con cualquier tipo de
dato, similar a la sobrecarga, en el caso de las funciones, pero evitando el
trabajo de escribir cada versión de la función. Las ventajas son mayores en el
caso de las clases, ya que no se permite hacer sobrecarga de ellas y
tendríamos que decidirnos por una sola o hacer especializaciones usando la
herencia.
¿Cómo funcionan?
La magia de las plantillas está en no definir un tipo de dato desde el principio,
sino dejar esto como algo pendiente y usar algo que permita manejar varias
opciones, de hecho, se usa una variable para este propósito. Veamos la
sintaxis para el caso de las funciones:
// Para una función, ambas opciones son equivalentes
template <class identificador> definición_de_función;
template <typename identificador> definición_de_función;
El identificador es el símbolo que guarda el tipo de dato que se ha de usar una
vez elegido, por lo que en la definición de la función deberá utilizarse en lugar
de los nombres de los tipos de datos, de esta manera queda hecha una función
genérica a la cual podemos llamar función-plantilla.
Tal vez con un ejemplo esta idea quede más clara. Pensemos en una función
que nos retorne el mayor de dos datos que le demos como argumentos y que
sirva con cualquier tipo:
template <class tipo>
tipo mayor(tipo dato1, tipo dato2){
return (dato1 > dato2 ? dato1 : dato2);
}
El identificador que usamos es “tipo”, por eso el tipo de dato de retorno y el de
los parámetros debe ser ese identificador. Durante la compilación del
programa, en la invocación a la función, se resuelve el tipo que se usará y el
compilador escribirá, con base en la plantilla, una función que sirva con el tipo
de dato resuelto y será la que realmente se utilice para dicha invocación.
Se puede usar una especificación explícita para el tipo de dato que se usará en
la función escribiendo <tipo dato> o dejar que el compilador resuelva el tipo con
los argumentos. Cabe destacar que las plantillas funcionan no solo con tipos de
datos primitivos sino también con los estructurados como las clases, aunque
para nuestro ejemplo debemos tener sobrecargado el operador
de comparación usado en la definición de la función “>”.
La función no sirve cuando los tipos de los datos son diferentes, entonces no
podríamos usarla con un entero y un real, porque solamente se ha definido
un identificador de tipo. Para usar más tipos basta con definir más
identificadores, de esta manera podríamos escribir la función de la siguiente
forma:
template <class tipo1, class tipo2>
tipo1 mayor(tipo1 dato1, tipo2 dato2){
return (dato1 > dato2 ? dato1 : dato2);
}
Con esta función es posible una llamada así:
int a = 10;
float b = 11.0;
float c = mayor(b,a); // como el primer argumento es un float, el resultado
también lo es
Clases-plantilla
Como mencioné al principio de la nota, podemos escribir también clases con
plantillas, llamadas clases-plantilla, y crear objetos que sirvan con cualquier tipo
de dato, esta característica es de gran ayuda al momento de escribir, por
ejemplo, una clase para arreglos o para matrices que sirven con cualquier tipo
y no solo con uno.
public:
Coordenada (T x=0, T y=0); //parámetros de tipo T
T dameX(){return x};
T dameY(){return y}; //retorna un tipo T
void nuevoX(T x){this -> x = x};
void nuevoY(T y){this -> y = y};
}
En la medida en que los datos que había de manipular se iban haciendo cada
vez más complejos se buscó la forma de agruparlos de alguna manera bajo un
mismo nombre, es así como surgen las estructuras de datos. Muchos autores
se refieren a la programación estructura como a la suma de funciones y/o
procedimientos más estructura de datos.
Programación Orientada al Objeto