Las Plantillas

  • Upload
    rar1018

  • View
    213

  • Download
    0

Embed Size (px)

DESCRIPTION

POO

Citation preview

Plantillas

Las plantillas (Templates) son uno de los grandes aportes de C++ al lenguaje C.

Hasta antes de las plantillas, se pasaban variables como parmetros de las funciones. Gracias al concepto de plantilla, es posible pasar tipos como parmetros, y de este modo definir funciones genricas. Pero el concepto de plantillas no se limita a las funciones, tambin puede ser utilizado en clases y estructuras.

Template(palabra-clave)C++ utiliza una palabra clave especficatemplatepara declarar y definir funciones y clases genricas. En estos casos acta como un especificador de tipo y va unido al par de ngulos< >que delimitan los argumentos de la plantilla:template void fun(T& ref); // declaracin de funcin genricatemplate class C {/*...*/}; // declaracin de clase genrica

VentajasEl inters de las plantillas residen en:-la generalizacin: desde el momento en que el tipo incluye todo lo que es utilizado en la funcin o clase-plantilla, es posible pasar cualquier tipo como parmetro.-simplicidad: nicamente se codifica una funcin o clase sin importar el tipo pasado como parmetro, lo que hace que el mantenimiento del cdigo sea ms fcil.

Inconvenientes-Como lo veremos a continuacin, el uso de plantillas requiere tomar algunas precauciones (typename)-El programa demora ms en ser compilado.

Cundo utilizar plantillas?El uso de plantillas es apropiado para definir contenedores, es decir estructuras que sirven para almacenar una coleccin de objetos (una lista, un vector, un grafo)

Las plantillas tambin son apropiadas para definir algoritmos genricos que se aplican a una familia de clase. Por ejemplo, es interesante codificar un algoritmo del camino mas corto, independientemente de la estructura del grafo. El uso de unfunctorpuede ser apropiado para acceder a los pesos instalados sobre los arcos del grafo en este caso. La clase de grafo pasada como parmetro debe cumplir un cierto nmero de pre-requisitos para que el algoritmo pueda ser aplicado. Si no, el programa no compilarProgramacin genricaDesde luego la POO supuso un formidable avance del arsenal de herramientas de programacin. Incluso en algunos casos, un autntico baln de oxgeno en el desarrollo y mantenimiento de aplicaciones muy grandes, en las que se estaba en el lmite de lo factible con las tcnicas programacin tradicional. Sin embargo, algunos tericos seguan centraron su atencin en los algoritmos. Algo que estaba ah tambin desde el principio. Se dieron cuenta que frecuentemente las manipulaciones contienen un denominador comn que se repite bajo apariencias diversas. Por ejemplo, la idea de ordenacin "Sort" se repite infinidad de veces en la programacin, aunque los objetos a ordenar y los criterios de ordenacin varen de un caso a otro. Alrededor de esta idea surgi un nuevo paradigma denominadoprogramacin genricaofuncional.La programacin genricaest mucho ms centrada en los algoritmos que en los datos y su postulado fundamental puede sintetizarse en una palabra:generalizacin. Significa que, en la medida de lo posible, los algoritmos deben ser parametrizados al mximo y expresados de la forma ms independiente posible de detalles concretos, permitiendo as que puedan servir para la mayor variedad posible de tipos y estructuras de datos.Los expertos consideran que la parametrizacin de algoritmos supone una aportacin a las tcnicas de programacin, al menos tan importante, como fue en su momento la introduccin del concepto de herencia, y que permite resolver algunos problemas que aquella deja sin solucin.La POO y la programacin genrica representan enfoques en cierta forma ortogonales entre si:La programacin orientada al dato razona del siguiente modo:representemos un tipo de dato genrico (por ejemploint) que permita representar objetos con ciertas caractersticas comunes (peras y manzanas). Definamos tambin que operaciones pueden aplicarse a este tipo (por ejemplo aritmticas) y sus reglas de uso, independientemente que el tipo represente peras o manzanas en cada caso.Por su parte la programacin funcional razona lo siguiente: construyamos un algoritmo genrico (por ejemplosort), que permita representar algoritmos con ciertas caractersticas comunes (ordenacin de cadenas alfanumricas y vectores por ejemplo). Definamos tambin a que tipos pueden aplicarse a este algoritmo y sus reglas de uso, independientemente que el algoritmo represente la ordenacin de cadenas alfanumricas o de vectores.Con el fin de adoptar los paradigmas de programacin entonces en vanguardia, desde sus inicios C++ haba adoptado conceptos de lenguajes anteriores. Uno de ellos, la programacin estructurada [5], ya haba sido recogida en el diseo de su antecesor directo C. Tambin adopt los conceptos de la POO entonces emergente. Posteriormente ha incluido otros conceptos con que dar soporte a los nuevos enfoques de la programacin funcional; bsicamenteplantillasycontenedores. Las plantillas, que se introdujeron con la versin del Estndar de Julio de 1998 son un concepto tomado de Ada. Los contenedores no estn definidos en el propio lenguaje, sino en la Librera Estndar.SinopsisLasplantillas("Templates"), tambin denominadastipos parametrizados, son un mecanismo C++ que permite que un tipo pueda ser utilizado como parmetro en la definicin de una clase o una funcin.Ya se trate de clases o funciones, la posibilidad de utilizar untipocomo parmetro en la definicin, posibilita la existencia de entes de nivel de abstraccin superior al de funcin o clase concreta. Podramos decir que se trata de funciones o clases genricas; parametrizadas (de ah su nombre). Las "instancias" concretas de estas clases y funciones conforman familias de funciones o clases relacionadas por un cierto "denominador comn", de forma que proporcionan un medio simple de representar gran cantidad de conceptos generales y un medio sencillo para combinarlos.Por ejemplo, supongamos las dos definiciones siguientes:void foo (int i) { ... } // L.1

template < class T > void foo (T t) { ... } // L.2La primera (L.1) es la definicin de una funcin tradicional que recibe un entero, la segunda (L.2) es una funcin genrica que recibe un objeto de tipo T. Ms tarde, en el cdigo podramos hacer:int i = 128; // una "instancia" de la clase de los enteros de valor 128foo (i) // invocacin defoode L.1A a; // una instancia de la clase Afoo (a); // invocacin de una versin para tipos A defoode L.2B b; // una instancia de la clase Bfoo (b); // invocacin de una versin para tipos B defoode L.2Punto importante a entender aqu es que en realidad,foo(a)yfoo(b)son invocaciones a funcionesdistintas, fabricadas por el compilador a partir de la definicin (plantilla) L.2

Para ilustrarlo intentaremos una analoga: si la clase Helado-de-Fresa representara todos los helados de fresa, de los que las "instancias" concretas seran distintos tamaos y formatos de helados de este sabor, unaplantillaHelado-de- sera capaz de generar las clases Helado-de-fresa; Helado-de-vainilla; Helado-de-chocolate, Etc. con solo cambiar adecuadamente el argumento . En realidad respondera al concepto genrico de "Helado-de". Las instancias concretas de la plantilla forman una familia de productos relacionados (helados de diversos sabores). Forzando al mximo la analoga diramos "especialidades".Advertiremos desde ahora que el mecanismo de plantillas C++ es en realidad un generador de cdigo parametrizado. La conjuncin de ambas capacidades: generar tipos (datos) y cdigo (algoritmos) les confiere una extraordinaria potencia. Si bien el propio inventor del lenguaje reconoce que a costa de "cierta complejidad", debida principalmente a la variedad de contextos en los que las plantillas pueden ser definidas y utilizadas [3].

La ideacentral a resaltar aqu es que unaplantillagenera ladefinicinde una clase o de una funcin mediante uno o varios parmetros. A esta instancia concreta de la clase o funcin generada, se la denominaespecializacinoespecialidadde la plantilla.Nota: un aspecto crucial del sistema es que los parmetros de la plantilla pueden ser a su vez plantillas.

Para manejar estos conceptos utilizaremos la siguiente terminologa:Clase-plantilla("template class") o su equivalente:clase genrica.Funcin-plantilla("template function") o su equivalente:funcin genrica.Instanciacin de la plantilla

Clase genrica+ argumento/sclase concreta(especializacin)

Funcin genrica+ argumento/sfuncin concreta(especializacin)

Como se ha indicado, las plantillas representan una de las ltimas implementaciones del lenguaje y constituyen una de las soluciones adoptadas por C++ para dar soporte a la programacin genrica. Aunque inicialmente fueron introducidas para dar soporte a las tcnicas que se necesitaban para la Librera Estndar (para lo que se mostraron muy adecuadas), son tambin oportunas para muchas situaciones de programacin. Precisamente la exigencia fundamental de diseo de la citada librera era lograr algoritmos con el mayor grado de abstraccin posible, de forma que pudieran adaptarse al mayor nmero de situaciones concretas.El tiempo ha demostrado que sus autores realizaron un magnfico trabajo que va ms all de la potencia, capacidad y versatilidad de la Librera Estndar C++ (STL5.1) y de que otros lenguajes hayan seguido la senda marcada por C++ en este sentido. Por ejemplo Java, con su JGL ("Java Generic Library"). Lo que comenz como una herramienta para la generacin parametrizada de nuevos tipos de datos (clases), se ha convertido por propio derecho en un nuevo paradigma, lametaprogramacin(programas que escriben programas). Versiones explcitas e implcitasDe lo dicho hasta ahora puede deducirse que las funciones y clases obtenidas a partir de versiones genricas (plantillas), pueden obtenerse tambin mediante codificacin manual (en realidad no se diferencian en nada de estas ltimas). Aunque en lo tocante a eficacia y tamao del cdigo, las primeras puedan competir en igualdad de condiciones con las obtenidas manualmente. Esto se consigue porque el uso de plantillas no implica ningn mecanismo de tiempo de ejecucin (runtime). Las plantillas dependen exclusivamente de las propiedades de los tipos que utiliza como parmetros y todo se resuelve en tiempo de compilacin.No existe inconveniente para la coexistencia en un programa de ambos tipos de cdigo; el generado automticamente por el mecanismo de plantillas y el generado de forma manual. Nos referiremos a ellos comoespecialidadesgeneradas automticamente, y generadas por el usuario; tambin comoversiones explcitas(codificadas manualmente) eimplcitas(generadas por el compilador). Veremos que para ciertos efectos el compilador puede distinguir entre unas y otras .Las plantillas representan un mtodo muy eficaz de generar cdigo (definiciones de funciones y clases) a partir de definiciones relativamente pequeas. Adems su utilizacin permite tcnicas de programacin avanzadas, en las que implementaciones muy sofisticadas se muestran mediante interfaces que ocultan al usuario la complejidad, mostrndola solo en la medida en que necesite hacer uso de ella. De hecho, cada una de las potentes abstracciones que se utilizan en la Librera Estndar est representada como una plantilla. A excepcin de algunas pocas funciones, prcticamente el 100% de la Librera Estndar est relacionada con las plantillas.Ejemplo:template type_devuelve_t mi_funcion(param1_t p1,param2_t p2, ...){...}Template class mi_clase_t{...};template struct mi_struct_t{...};