0% encontró este documento útil (0 votos)
12 vistas6 páginas

Definición y Tipos de Wrappers

Un Wrapper es una clase que encapsula un objeto o tipo de dato primitivo, proporcionando una capa adicional de funcionalidad y abstracción. Existen dos tipos principales de Wrappers: de clase y de objeto, que permiten extender la funcionalidad de objetos existentes y facilitar la manipulación de datos. Los Wrappers son útiles en diversos lenguajes de programación, y su creación personalizada puede mejorar la legibilidad y mantenibilidad del código.

Cargado por

bix
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
12 vistas6 páginas

Definición y Tipos de Wrappers

Un Wrapper es una clase que encapsula un objeto o tipo de dato primitivo, proporcionando una capa adicional de funcionalidad y abstracción. Existen dos tipos principales de Wrappers: de clase y de objeto, que permiten extender la funcionalidad de objetos existentes y facilitar la manipulación de datos. Los Wrappers son útiles en diversos lenguajes de programación, y su creación personalizada puede mejorar la legibilidad y mantenibilidad del código.

Cargado por

bix
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

## Definición de Wrappers

Un Wrapper es una clase que envuelve o encapsula un objeto o tipo de dato primitivo, proporcionando una capa
adicional de abstracción y funcionalidad (Bloch, 2008). Esta capa adicional puede incluir métodos, propiedades
y comportamientos específicos que facilitan la manipulación y el uso de los datos envueltos.

"Los Wrappers son una técnica poderosa para extender la funcionalidad de objetos existentes sin modificar su
código fuente" (Gamma et al., 1995, p. 217).

### Tipos de Wrappers

Existen dos tipos principales de Wrappers (Gamma et al., 1995):

1. **Wrappers de clase**: Estas clases envuelven una clase existente, proporcionando una interfaz alternativa o
adicional para interactuar con ella.

2. **Wrappers de objeto**: Estas clases envuelven una instancia específica de un objeto, permitiendo agregar
funcionalidades adicionales o modificar el comportamiento de esa instancia en particular.

### Ejemplos de uso

Un ejemplo común de Wrapper de clase es la clase `ArrayList` en Java, que envuelve un arreglo y proporciona
métodos adicionales para manipular y trabajar con los elementos de manera más conveniente (Bloch, 2008).

Un ejemplo de Wrapper de objeto podría ser una clase que envuelve una instancia de un objeto `File` y
proporciona métodos adicionales para realizar operaciones de lectura, escritura y manipulación de archivos de
manera más sencilla (Martin, 2008).

## Casos de uso comunes

 ### Envolver objetos primitivos

Uno de los casos de uso más comunes de los Wrappers es envolver tipos de datos primitivos, como enteros,
flotantes, booleanos, etc. Esto permite tratar estos tipos de datos como objetos y aprovechar las ventajas de la
programación orientada a objetos, como la herencia, el polimorfismo y la encapsulación (Bloch, 2008).

 ### Facilitar la manipulación de datos

Los Wrappers pueden proporcionar métodos y funcionalidades adicionales que facilitan la manipulación y el
procesamiento de datos (Gamma et al., 1995). Por ejemplo, una clase Wrapper para cadenas de texto podría
incluir métodos para dividir, reemplazar, formatear o realizar otras operaciones comunes en cadenas.

 ### Proporcionar métodos y funcionalidades adicionales


Además de facilitar la manipulación de datos, los Wrappers pueden agregar funcionalidades completamente
nuevas a los objetos o tipos de datos envueltos (Martin, 2008). Esto puede incluir métodos para realizar
validaciones, transformaciones, cálculos o cualquier otra lógica relacionada con los datos envueltos.

## Wrappers en diferentes lenguajes de programación

Muchos lenguajes de programación populares incluyen Wrappers integrados para tipos de datos primitivos y
otros objetos comunes.

1. ### Wrappers en Java

Java proporciona clases Wrapper para todos los tipos de datos primitivos, como `Integer`, `Double`, `Boolean`,
`Character`, etc. Estas clases envuelven los valores primitivos correspondientes y proporcionan métodos y
funcionalidades adicionales para trabajar con ellos (Bloch, 2008).

2. ### Wrappers en Python

Python no tiene una distinción estricta entre tipos de datos primitivos y objetos, ya que todo en Python es un
objeto. Sin embargo, Python proporciona clases envoltorio para algunos tipos de datos, como `int`, `float` y
`bool`, que permiten acceder a métodos y funcionalidades adicionales (Lutz, 2013).

3. ### Wrappers en JavaScript

JavaScript también tiene clases Wrapper integradas para tipos de datos primitivos, como `Number`, `Boolean` y
`String`. Estas clases envuelven los valores primitivos correspondientes y proporcionan métodos y propiedades
para trabajar con ellos de manera más conveniente (Haverbeke, 2018).

## Creación de Wrappers personalizados

### Motivos para crear Wrappers personalizados

Aunque muchos lenguajes de programación proporcionan Wrappers integrados para tipos de datos comunes, a
menudo es necesario crear Wrappers personalizados para satisfacer necesidades específicas de un proyecto o
dominio de aplicación (Bloch, 2008). Algunos motivos para crear Wrappers personalizados incluyen:

1. Agregar funcionalidades adicionales a objetos o tipos de datos existentes.

2. Simplificar la interacción con bibliotecas o APIs externas.

3. Encapsular lógica de negocio o reglas específicas del dominio.

4. Mejorar la legibilidad y la mantenibilidad del código.


### Proceso de creación de Wrappers

El proceso de creación de un Wrapper personalizado generalmente implica los siguientes pasos (Gamma et al.,
1995):

1. Identificar el objeto o tipo de dato que se desea envolver.

2. Definir la interfaz y los métodos que se desean exponer en el Wrapper.

3. Crear una nueva clase que encapsule el objeto o tipo de dato original.

4. Implementar los métodos y la lógica necesaria en el Wrapper.

5. Utilizar el Wrapper en lugar del objeto o tipo de dato original en el código.

### Ejemplos de Wrappers personalizados

Un ejemplo de un Wrapper personalizado podría ser una clase que envuelve una conexión a una base de datos y
proporciona métodos simplificados para realizar operaciones comunes, como ejecutar consultas, insertar datos o
realizar transacciones (Martin, 2008).

Claro, a continuación explicaré cada paso de manera más detallada y desarrollaré el ejemplo del Wrapper
personalizado para una conexión a una base de datos con más detalles.

Proceso de creación de Wrappers

1. Identificar el objeto o tipo de dato que se desea envolver: En nuestro caso, queremos envolver una
conexión a una base de datos, representada por la clase [Link]. Esta clase es parte de la
API JDBC (Java Database Connectivity) y proporciona métodos para interactuar con una base de datos
relacional.
2. Definir la interfaz y los métodos que se desean exponer en el Wrapper: Antes de crear el Wrapper,
debemos decidir qué funcionalidades queremos exponer a través de él. En nuestro ejemplo, hemos
decidido proporcionar métodos para ejecutar consultas SELECT (para obtener datos), INSERT,
UPDATE y DELETE (para modificar datos), así como métodos para iniciar y confirmar transacciones.
3. Crear una nueva clase que encapsule el objeto o tipo de dato original: Crearemos una nueva clase
llamada DatabaseWrapper que contendrá una instancia privada de [Link]. Esta
instancia se inicializará en el constructor de la clase DatabaseWrapper.

java
Copy code
import [Link];
import [Link];

public class DatabaseWrapper {


private Connection connection;

public DatabaseWrapper(Connection connection) {


[Link] = connection;
}

// Métodos del Wrapper


}

4. Implementar los métodos y la lógica necesaria en el Wrapper: En este paso, implementaremos los
métodos que definimos anteriormente. Cada uno de estos métodos utilizará la instancia de Connection
encapsulada para realizar su tarea correspondiente.
o executeQuery(String query): Este método ejecutará una consulta SELECT y devolverá un
objeto ResultSet que contiene los datos recuperados de la base de datos.
o executeUpdate(String query): Este método ejecutará una instrucción INSERT, UPDATE o
DELETE y devolverá el número de filas afectadas.
o startTransaction(): Este método desactivará el modo de confirmación automática de la
conexión, lo que permitirá agrupar varias operaciones en una sola transacción.
o commitTransaction(): Este método confirmará las operaciones realizadas en la transacción
actual y restaurará el modo de confirmación automática.

java
Copy code
public ResultSet executeQuery(String query) throws SQLException {
return [Link]().executeQuery(query);
}

public int executeUpdate(String query) throws SQLException {


return [Link]().executeUpdate(query);
}

public void startTransaction() throws SQLException {


[Link](false);
}

public void commitTransaction() throws SQLException {


[Link]();
[Link](true);
}

5. Utilizar el Wrapper en lugar del objeto o tipo de dato original en el código: En lugar de trabajar
directamente con la instancia de Connection, podemos utilizar el DatabaseWrapper en nuestro código.
Esto nos brinda una capa de abstracción y un mayor control sobre las operaciones de base de datos.

java
Copy code
// Obtener una conexión a la base de datos
Connection conn = [Link](...);

// Crear una instancia del Wrapper


DatabaseWrapper dbWrapper = new DatabaseWrapper(conn);

// Usar el Wrapper
[Link]();
[Link]("INSERT INTO usuarios (nombre, email) VALUES ('Juan',
'juan@[Link]')");
[Link]("UPDATE usuarios SET email = 'nuevo@[Link]' WHERE id =
1");
[Link]();

// Obtener datos de la base de datos


ResultSet rs = [Link]("SELECT * FROM usuarios");
// Procesar los resultados...

// Cerrar la conexión
[Link]();

En este ejemplo, hemos creado una instancia de DatabaseWrapper pasando la conexión a la base de
datos obtenida previamente. Luego, utilizamos los métodos del Wrapper para realizar operaciones en la
base de datos, como iniciar una transacción, ejecutar consultas INSERT y UPDATE, y confirmar la
transacción. También mostramos cómo obtener los datos de la base de datos utilizando el método
executeQuery.

Este ejemplo demuestra cómo podemos crear un Wrapper personalizado para una conexión a una base de datos,
lo que nos permite trabajar con ella de una manera más fácil y estructurada. Sin embargo, este es solo un
ejemplo sencillo, y los Wrappers pueden ser mucho más complejos y sofisticados en aplicaciones reales, con
características adicionales como manejo de excepciones, caché de consultas, registro de actividades y mucho
más.

Otro ejemplo podría ser una clase que envuelve una API de terceros y proporciona una interfaz más fácil de
usar y mantener para interactuar con esa API (Bloch, 2008).

## Ventajas y desventajas de los wrappers

### Ventajas

Las principales ventajas de utilizar Wrappers incluyen (Gamma et al., 1995; Martin, 2008; Bloch, 2008):

1. **Encapsulamiento**: Los Wrappers promueven el encapsulamiento de la lógica y el comportamiento


relacionados con un objeto o tipo de dato, lo que mejora la modularidad y la mantenibilidad del código.

2. **Reutilización de código**: Al encapsular la funcionalidad en una clase Wrapper, se promueve la


reutilización de código en diferentes partes de una aplicación o en múltiples proyectos.

3. **Extensibilidad**: Los Wrappers permiten agregar funcionalidades adicionales a los objetos o tipos de
datos existentes sin modificar su implementación original.

4. **Consistencia**: Proporcionan una interfaz coherente y estandarizada para trabajar con diferentes tipos de
datos, lo que facilita el aprendizaje y la comprensión del código.

### Desventajas

Algunas desventajas potenciales de los Wrappers incluyen (Bloch, 2008; Gamma et al., 1995):

1. **Sobrecarga de memoria**: Envolver objetos o tipos de datos puede introducir una sobrecarga de memoria
adicional, ya que se crean instancias de clases Wrapper.

2. **Complejidad**: Si no se utilizan adecuadamente, los Wrappers pueden aumentar la complejidad del


código y dificultar su comprensión y mantenimiento.
3. **Rendimiento**: Dependiendo de la implementación y el uso, los Wrappers pueden introducir una
sobrecarga de rendimiento adicional debido a la indirección y la creación de objetos adicionales.

### Patrones de diseño relacionados

Algunos patrones de diseño relacionados con los Wrappers incluyen (Gamma et al., 1995):

- **Decorator**: Este patrón permite agregar funcionalidades adicionales a un objeto de manera dinámica,
envolviendo el objeto original con uno o más objetos decoradores.

- **Adapter**: Este patrón se utiliza para adaptar una interfaz existente a otra interfaz que el cliente espera, lo
que a menudo implica envolver la interfaz original con una nueva interfaz.

- **Proxy**: Este patrón proporciona un objeto sustituto que controla el acceso a otro objeto, lo que puede
implicar envolver el objeto original con un objeto proxy.

Referencias:

Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1995). Design patterns: Elements of reusable object-
oriented software. Addison-Wesley.

Bloch, J. (2008). Effective Java (2nd ed.). Addison-Wesley.

Martin, R. C. (2008). Clean code: A handbook of agile software craftsmanship. Prentice Hall.

Lutz, M. (2013). Learning Python (5th ed.). O'Reilly Media.

Haverbeke, M. (2018). Eloquent JavaScript (3rd ed.). No Starch Press.

Stroustrup, B. (2013). The C++ Programming Language (4th ed.). Addison-Wesley.

Skeet, J. (2010). C# in Depth (2nd ed.). Manning Publications.

Thomas, D., Fowler, C., & Hunt, A. (2004). Programming Ruby: The Pragmatic Programmers' Guide (2nd ed.).
Pragmatic Bookshelf.

También podría gustarte