La palabra inglesa wrapper designa un embalaje o en­vo­l­to­rio. En el contexto del software, este término hace re­fe­re­n­cia a programas o códigos que rodean otros co­m­po­ne­n­tes de programa. Los wrappers pueden uti­li­zar­se por diversos motivos: a menudo se usan para mejorar la co­m­pa­ti­bi­li­dad o in­te­ro­pe­ra­bi­li­dad entre di­fe­re­n­tes es­tru­c­tu­ras de software o para poder re­pre­se­n­tar algo a nivel visual, p.ej., los wrappers HTML o CSS. Pueden ser wrappers di­fe­re­n­tes co­m­po­ne­n­tes de software, productos de software in­de­pe­n­die­n­tes, ar­qui­te­c­tu­ras de software, clases de pro­gra­ma­ción orientada a objetos o fra­me­wo­r­ks.

Si dentro de un programa hay que usar funciones o bloques de programas en otro lenguaje de pro­gra­ma­ción, estos elementos pueden “en­vo­l­ve­r­se”. El programa principal solo se comunica con el wrapper y este se encarga de tra­n­s­mi­tir los comandos al programa envuelto y de devolver los re­su­l­ta­dos al programa principal. El wrapper es el único co­m­po­ne­n­te del proceso que está en contacto directo con ambos elementos de software.

En el mundo de la pro­gra­ma­ción y el de­sa­rro­llo de software, los wrappers cuentan con una infinidad de usos. En los si­guie­n­tes ejemplos, te mostramos qué es un wrapper, cómo funciona exac­ta­me­n­te y qué tareas asume.

Wrappers como tra­du­c­to­res de entradas de usuarios

Los fo­r­mu­la­rios de los programas o apli­ca­cio­nes web esperan entradas que el programa sea capaz de procesar. En los programas de origen es­ta­dou­ni­de­n­se, por ejemplo, se so­bre­n­tie­n­de que los números con decimales llevan puntos en lugar de comas y miden en pies y pulgadas. A la hora de usar este tipo de co­m­po­ne­n­tes de software en apli­ca­cio­nes propias, no siempre existe la po­si­bi­li­dad de ada­p­tar­los a las co­s­tu­m­bres na­cio­na­les de cada país y, en co­n­se­cue­n­cia, casi siempre se obtienen re­su­l­ta­dos erróneos o incluso, errores de programa.

En estos casos, el wrapper es la solución perfecta. Así, el fo­r­mu­la­rio no tra­n­s­mi­ti­rá las entradas di­re­c­ta­me­n­te al programa externo, sino que las enviará al wrapper. Este se encargará de valorar las entradas y tra­du­ci­r­las en entradas válidas para el programa externo sin necesidad de mo­di­fi­ca­ción.

Wrappers para acceder a bases de datos

Por norma general, las bases de datos de di­fe­re­n­tes fa­bri­ca­n­tes apenas pueden uti­li­zar­se co­n­ju­n­ta­me­n­te debido a problemas de co­m­pa­ti­bi­li­dad entre las di­fe­re­n­tes tablas de datos, consultas o lenguajes de consulta. En estos casos, los wrappers también pueden ser de gran utilidad. Los wrappers de todo tipo tratan de reconocer las in­co­n­si­s­te­n­cias exi­s­te­n­tes entre di­fe­re­n­tes in­te­r­fa­ces de software y de rodearlas.

Un ejemplo clásico de un wrapper es la Java Database Co­n­ne­c­ti­vi­ty (JDBC), una interfaz de bases de datos de la pla­ta­fo­r­ma Oracle-Java. En su función de wrapper, la JDBC permite acceder a bases de datos re­la­cio­na­les de di­fe­re­n­tes pro­vee­do­res. La JDBC establece la conexión con las di­fe­re­n­tes bases de datos a través de co­n­tro­la­do­res es­pe­cia­les.

Las consultas SQL de los programas se dirigen ex­clu­si­va­me­n­te a la JDBC y no a las bases de datos propias. La JDBC convierte las consultas al lenguaje de consulta empleado por la base de datos en cuestión y devuelve el resultado en un formato co­m­pa­ti­ble con Java. De esta manera, el programa que realiza la consulta siempre obtiene los datos en un formato homogéneo, in­de­pe­n­die­n­te­me­n­te de la base de datos que emplee.

Wrappers en la pro­gra­ma­ción orientada a objetos

En la pro­gra­ma­ción orientada a objetos, se usan di­fe­re­n­tes patrones es­tru­c­tu­ra­les que funcionan siempre de la misma manera, sin importar el lenguaje de pro­gra­ma­ción que se utilice. Los patrones de diseño, adaptador y decorador pe­r­te­ne­cen a la categoría de patrones es­tru­c­tu­ra­les y se co­n­si­de­ran wrappers.

Un adaptador envuelve a dos in­te­r­fa­ces in­co­m­pa­ti­bles entre di­fe­re­n­tes clases. Al traducir una interfaz a la otra, las clases ya pueden volver a co­mu­ni­car­se entre sí. Esto es muy im­po­r­ta­n­te cuando queremos seguir usando clases o bi­blio­te­cas enteras de clases en proyectos nuevos. Estas bi­blio­te­cas usan in­te­r­fa­ces es­ta­n­da­ri­za­das y unívocas que no deben mo­di­fi­car­se ya que deben ser co­m­pa­ti­bles con un gran número de programas. El wrapper, el adaptador en este caso, es el eslabón in­te­r­me­dio de­te­r­mi­na­n­te para la co­mu­ni­ca­ción.

Un decorador permite ampliar una clase con funciones adi­cio­na­les sin mo­di­fi­car­la. Para el objeto de programa co­n­su­l­ta­n­te, el decorador presenta la misma interfaz que la clase original. Así, el objeto que lo consulta no requiere mo­di­fi­ca­ción alguna. En su función de wrapper, el decorador transmite las consultas a la clase. Las funciones nuevas, no incluidas en la clase, son pro­ce­sa­das di­re­c­ta­me­n­te por el decorador. A co­n­ti­nua­ción, este devuelve los re­su­l­ta­dos de manera que el objeto co­n­su­l­ta­n­te los perciba como re­su­l­ta­dos de la clase decorada.

Wrappers para diseñar do­cu­me­n­tos HTML

Es muy común usar wrappers en el (cambio del) diseño de páginas web HTML y CSS. Sin wrappers, incluso los cambios más pequeños, por ejemplo, cambiar los espacios de los márgenes de una ventana del navegador, im­pli­ca­rían tener que modificar varias hojas de estilo y revisar al final que todas siguen siendo co­m­pa­ti­bles.

Es mucho más sencillo meter todo el contenido de la página en un co­n­te­ne­dor DIV, tal y como muestra el siguiente ejemplo:

<html>
    <head>
    ...
    </head>
    <body>
        <div class="wrapper">
        …
        </div>
        </body>
</html>

En el co­n­te­ne­dor wrapper se encuentra el contenido real de la página.

En el archivo CSS co­rre­s­po­n­die­n­te se define el wrapper como hoja de estilo:

body {
	margin: 0;
	padding: 0
}
.wrapper {
	width: 500px;
	margin: 25px auto;
}

En este ejemplo, se usa el parámetro width: para atribuir un ancho de 500 píxeles al co­n­te­ne­dor. Los márgenes superior e inferior se fijan mediante el parámetro margin: a un valor de 25 píxeles. Los márgenes izquierdo y derecho derivan au­to­má­ti­ca­me­n­te del ancho de la ventana del navegador y el ancho del co­n­te­ne­dor.

Basta con modificar el wrapper para modificar los márgenes laterales de la página sin necesidad de in­te­r­ve­nir más en el código HTML o CSS.

Wrappers TCP en sistemas Linux

El servicio en segundo plano inetd de Linux y otros sistemas ope­ra­ti­vos basados en UNIX se ejecuta como wrapper TCP. El elemento inetd mo­ni­to­ri­za sockets de red y acepta consultas de conexión. Un archivo de co­n­fi­gu­ra­ción determina los puertos que cabe tener en cuenta. Las consultas se evalúan y se inicia el servicio inetd indicado para cada puerto en el archivo de co­n­fi­gu­ra­ción. No­r­ma­l­me­n­te estos programas suelen ser in­s­ta­n­cias Daemon eje­cu­ta­das en segundo plano.

Cuando la conexión finaliza, inetd vuelve a detener el servicio iniciado de forma au­to­má­ti­ca. Al iniciar el servicio solo cuando es necesario, pueden ahorrarse muchos recursos del sistema en co­m­pa­ra­ción con el inicio au­to­má­ti­co de servicios de red que, a menudo, ni siquiera hacen falta. El elemento inetd funciona como wrapper al que todos los programas dirigen sus consultas de red sin co­mu­ni­car­se di­re­c­ta­me­n­te con los di­fe­re­n­tes servicios.

Los wrappers TCP también pueden usarse para evitar accesos no deseados desde una red. En estos casos, inetd o un software especial de servidor consultan al wrapper TCP. Los hosts y or­de­na­do­res que deben aceptarse o re­cha­zar­se se registran en los archivos /etc/hosts.allow y /etc/hosts.deny.

Ir al menú principal