Mundo real: patrones de diseño de iOS

El patrón de diseño es un tema común en charlas, foros e incluso en una conversación de 15 minutos en el trabajo. Puede encontrar muchas cosas en los libros o en Internet al respecto y muchos ejemplos usando patos de goma , cafetería y pizzerías .

Cuando comencé a estudiar, generalmente entiendo el patrón, pero tuve muchos problemas para pensar cómo aplicarlos a mi código. Entiendo que el patrón Factory se usa para crear objetos, pero ¿por qué lo necesito? ¿Realmente necesito una Fábrica para crear mis objetos?

Mi objetivo con esta publicación es traer algunos ejemplos reales de algunos patrones de diseño que utilicé en mis proyectos.

Estrategia

El patrón de estrategia permite seleccionar un algoritmo en tiempo de ejecución. En lugar de implementar un algoritmo único directamente, el código recibe instrucciones de tiempo de ejecución sobre qué familia de algoritmos usar.

Podemos usar diferentes algoritmos basados ​​en tiempo de ejecución, en otras palabras, no nos importa cómo se realiza la implementación.

Un algoritmo necesita un objeto que sepa volar, una clase Duck sabe volar y una clase Rocket también. A nuestro algoritmo no le importa si nuestra implementación necesita extender sus alas o un galón de gasolina.

Problema resuelto usando estrategia

En este proyecto, necesitábamos poder recibir un viewController, pero también necesitamos que tenga algunos comportamientos predefinidos y ese es un lugar perfecto para aplicar el patrón de Estrategia. Un ViewController común en aplicaciones móviles es un inicio de sesión, por lo tanto, simplemente cree un protocolo que defina nuestras acciones y dependencias de LoginViewController.

Quiero decir que nuestro LoginViewController se puede inyectar en nuestro proyecto, no nos importa la interfaz de usuario si tiene un método TableView, cualquier animación o validación, pero lo necesitamos para saber cómo realizar un inicio de sesión. Puede leer más sobre este problema en particular aquí.

Fábrica

El patrón del método de fábrica trata el problema de crear objetos sin tener que especificar la clase exacta del objeto que se creará.

El patrón de fábrica es útil cuando necesita crear objetos en tiempo de ejecución. Entonces, si el usuario quiere una pizza de queso, crea una CheesePizza () si quiere un pepperoni, entonces PepperoniPizza () ftw.

Problema resuelto usando la fábrica

En el mismo proyecto en el que usamos el patrón de estrategia para resolver nuestro problema de inyección de viewController, usamos un patrón de fábrica para poder crear objetos en tiempo de ejecución que les transmiten todas las dependencias que necesitan.

Necesitábamos impulsar una instancia de LoginViewController que se puede crear usando diferentes enfoques como Storyboards, xib o view codificados. Tuvimos una instancia de fábrica, que se puede inyectar cambiando la forma en que el objeto que creará la fábrica cambiará la fábrica.

Con una instancia de Factory solo necesitamos llamar al método de construcción. Esta fábrica puede ser una instancia de ViewCodedLoginViewControllerFactory o StoryboardLoginViewControllerFactory que realmente no nos importa, solo la necesitamos para implementar el método de compilación que devuelve un LoginViewController.

Aquí tenemos una fábrica para cada tipo de objeto, pero podemos tener una fábrica que sepa cómo construir un ViewController desde storyboard, xibs o viewcoded.

Decorador

El patrón decorador permite agregar el comportamiento a un objeto individual, ya sea estática o dinámicamente, sin afectar el comportamiento de otros objetos de la misma clase.

Este es mi patrón favorito, el ejemplo clásico del patrón decorador es la cafetería que quiere agregar crema batida a su café y calcular el nuevo precio y la descripción en función de la bebida.

Problema resuelto usando decorador

Necesitamos diferentes versiones de API para cada llamada de servicio, esto se puede hacer de muchas maneras diferentes, pero usamos este patrón para agregar un encabezado personalizado a una solicitud. Con este enfoque, también podemos estar preparados si, en el futuro, una llamada API debería agregar otro parámetro a su encabezado.

También necesitábamos filtrar resultados en una solicitud. Lo que se puede hacer creando un nuevo método o cambiando el funcionamiento de su solicitud. Decidimos usar un Decorador para agregar este comportamiento porque nuestro servicio se usó en otras clases y queremos cambiar el menor número posible de líneas en nuestra implementación anterior.

Adaptador

El patrón del adaptador es un patrón de diseño de software que permite utilizar la interfaz de una clase existente como otra interfaz. A menudo se usa para hacer que las clases existentes funcionen con otros sin modificar su código fuente.

Piensa en un adaptador como un adaptador real. Necesita su Nintendo 64 que tiene un video compuesto como salida de video para funcionar con su nuevo televisor 4k . Entonces necesita un adaptador HDMI compuesto.

Problema resuelto usando el adaptador

Necesitábamos durar cuatro dígitos de un modelo de Tarjeta y también ser compatibles con PKPaymentPass. En otras palabras, creó un adaptador para convertir una instancia de PKPaymentPass en Card.

Pero también podemos mezclar patrones creando código más reutilizable y mantenible, por ejemplo, mezclando nuestro adaptador con el patrón estratégico. Realmente no necesitamos un objeto de Tarjeta, solo necesitamos los últimos Números, entonces, ¿por qué no creamos un protocolo para hacer eso y ser compatibles con PKPaymentPass, Tarjeta y cualquier otro objeto que nuestro proyecto pueda necesitar?

Finalmente

Los patrones de diseño me ayudan mucho a crear códigos más reutilizables, me ahorran tiempo cuando necesito cambiar algunas cosas en los códigos y, debido a ellos, algunas tareas son mucho más fáciles de lo que deberían ser.

Si no entiende cómo funcionan los patrones, aquí hay algunas publicaciones excelentes sobre Estrategia, Fábrica, Decorador y Adaptador.

PD: Si te gusta esta publicación, compártela en Twitter, recomiéndala en medio, o ambas =). Esto realmente me ayuda a llegar a más personas. Muchas gracias.