Muy buenas, me llamo Miguel y en esta ocasión les traigo este nuevo artículo.
Hacer que las interfaces incompatibles funcionen juntas
En este tutorial aprenderemos sobre el patrón de diseño del Adaptador implementándolo rápidamente en un Xcode Playground.
El patrón Adapter
nos permite adaptar interfaces incompatibles a la funcionalidad existente de nuestra aplicación.
Aquí está nuestro proyecto de ejemplo. Tenemos una aplicación donde los usuarios pueden comprar zapatillas y queremos integrar un servicio de terceros para buscar zapatillas de, digamos, Amazon. El problema que tenemos es que nuestra aplicación usa centímetros para medir el tamaño de una zapatilla de deporte, pero el servicio de terceros devuelve tamaños en el formato de tamaño de calzado del Reino Unido. Vamos a abordar esto utilizando el patrón Adapter
del diseño.
Empecemos
Eche un vistazo a la funcionalidad existente de nuestra aplicación:
struct Sneaker { let title: String let footSize: Double } protocol SneakerProviderService { func getSneakers() -> [Sneaker] } class SneakerProvider: SneakerProviderService { var sneakers: [Sneaker] = [] func getSneakers() -> [Sneaker] { return self.sneakers } }
Usamos el protocolo SneakerProviderService
para especificar cómo queremos recuperar las zapatillas.
El servicio de terceros que importamos tiene este aspecto:
struct ThirdPartySneaker { let title: String let ukSize: Double } struct ThirdPartySneakerProvider { func getSneakers() -> [ThirdPartySneaker] { return [ .init(title: "PUMA Men's Suede Big Sean Sneaker", ukSize: 5.0), .init(title: "Converse Men's One Star Suede Sneakers", ukSize: 6.5), .init(title: "Vans Men's Low-Top Sneakers", ukSize: 5.5) ] } }
Podemos ver que cada zapatilla tiene una propiedad ukSize
, pero queremos usar los centímetros en la programación nuestra aplicación independientemente.
Así que definamos el Adapter
Para el ThirdPartySneakerProvider
:
class SneakerProviderAdapter: SneakerProviderService { private var thirdPartySneakerProvider = ThirdPartySneakerProvider() func getSneakers() -> [Sneaker] { let sneakers = thirdPartySneakerProvider.getSneakers() .map { Sneaker(title: $0.title, footSize: convertFromUKtoCentimeters(ukSize: $0.ukSize)) } return sneakers } private func convertFromUKtoCentimeters(ukSize: Double) -> Double { let baseUK = 3.5 let baseCM = 22.0 if ukSize == 3.5 { return baseCM } else { let numberOfHalves = (ukSize - baseUK) / 0.5 return baseCM + (numberOfHalves * 0.5) } } }
Definimos la clase SneakerProviderAdapter
y se ajustan a el protocolo SneakerProviderService
. Contamos con una propiedad privada de tipo ThirdPartySneakerProvider
.
Como podemos ver, el método getSneakers()
devuelve una matriz de Sneaker
, pero el ThirdPartySneakerProvider
devuelve una matriz de ThirdPartySneaker
, entonces tenemos que realizar una transformación bajo el capó.
El métodoconvertFromUKtoCentimeters
nos proporciona un medio para transformar el tamaño del Reino Unido en centímetros. Entonces usamos este método dentro de la función .map
para devolver una matriz de Sneaker
.
Finalmente, podemos usar este adaptador dentro de nuestra aplicación:
var sneakerProvider: SneakerProviderService = SneakerProviderAdapter() sneakerProvider.getSneakers()
El resultado es exactamente lo que necesitábamos:
Gracias por leer.
Añadir comentario