Explorando los patrones de diseño utilizados por Apple en iOS

Los patrones de diseño son una parte crucial del diseño de software, proporcionan una solución a los problemas comunes.
Apple usa estos patrones en todos los marcos de iOS. En este artículo, discutiremos cómo se usan los patrones de diseño en las API internas de Apple y cómo puede beneficiarse de estas implementaciones.

Utilizamos marcos de iOS como UIKit CoreLocation CoreBluetooth y muchos otros en nuestro desarrollo diario. Componentes como UITableView UIStackView, todos están escritos con un gran diseño reutilizable de Apple.

Hay muchos patrones de diseño que Apple usó durante el desarrollo de sus kits. Intentemos explorar algunos de estos patrones y ver cómo podemos implementarlos.

Pool de objetos

El conjunto de objetos es un patrón que reutiliza un conjunto de objetos inicializados.

Cuando un cliente del grupo solicita un objeto, un grupo devolverá un elemento real que está listo para ser reutilizado en lugar de crear una nueva instancia. Cuando el cliente ha terminado de usar el objeto, lo devuelve al grupo para que pueda reutilizarse en otro momento.

Las agrupaciones de objetos se utilizan para el rendimiento ya que los objetos obtenidos y devueltos a una agrupación no se crean o destruyen en este momento. Por lo tanto, ahorrando mucho rendimiento.

UITableView puede proporcionarnos una excelente manera de comprender el uso y la implementación del patrón de agrupación de objetos.

La forma en que funciona UITableView es que toma las celdas que se empujan fuera de la pantalla y luego las reutiliza para las próximas celdas.

Implementación rápida del conjunto de objetos

Tratemos de proporcionar una implementación de grupo de objetos para iOS.

En primer lugar, necesitamos crear un protocolo que podamos usar para restringir los elementos genéricos de nuestro grupo. Como vamos a proporcionar celdas reutilizables para una vista de tabla, vamos a llamarla Reutilizable

Podemos agregar prepareForReuse al protocolo y llamarlo cuando el elemento se reutilice del grupo para proporcionar la limpieza necesaria para el objeto antes de que vuelva a aparecer en la pantalla.

Un UITableViewCell sería simplemente una UIView que se ajusta a Reusable

Comencemos a implementar nuestro objeto responsable de la agrupación de la siguiente manera:

Nuestra clase de agrupación de objetos necesita una función de fábrica que sepa cómo crear un nuevo elemento genérico.

Necesitamos la variable maxElementCount que usará la vista de tabla para proporcionar el número máximo de celdas que se mostrarán en la pantalla al mismo tiempo. Dado que iOS ya tiene un delegado para la cantidad de elementos en una sección junto con heightForRowInSection, proporcionar este valor será fácil.

En el conjunto de objetos necesitamos dos métodos, uno es dibujar un elemento y otro para liberar el objeto que se reutilizará. En el ejemplo de la vista de tabla, liberaríamos el objeto de celda cuando la celda saliera de la pantalla.

Usemos una matriz simple que contenga los elementos lanzados actualmente y reutilícelos cuando estén disponibles o cree nuevos con nuestra función de fábrica.

Cuando se llama a la función dequeueReusableCell, entoncesUITableView simplemente dibuja un objeto de su grupo.

Dado que UITableView es simplemente una subclase de UIScrollView, podríamos saber fácilmente cuándo una celda está fuera de la pantalla, por lo tanto, simplemente podemos liberar el objeto de la celda al grupo reutilizable.

A continuación se muestra la función que se llama cuando la celda se sale de la pantalla.

Patrón Singleton

El patrón singleton es un patrón utilizado para crear solo una instancia de un objeto en particular. Todas las referencias adicionales al objeto hacen referencia a la misma instancia subyacente. Los Singleton se usan cuando tiene sentido que un solo objeto proporcione acceso a un recurso global.

Un objeto singleton simplemente se puede crear de forma rápida como sigue

Implementación rápida de Singleton

Apple usa singletons en muchos casos, algunos de ellos sonNSFileManager, NSApplication e inUIApplication.

Cuando un cliente solicita una instancia al objeto, obtiene una instancia compartida. Este objeto se crea perezosamente en la primera solicitud.

Podemos usar Singletons en nuestro código para evitar reasignar múltiples instancias de una instancia y, por lo tanto, ahorrar rendimiento. Sin embargo, debemos ser conscientes de que los singletons pueden causar problemas en algunos casos y deben usarse con cuidado y no ser utilizados en exceso.

  • Utilice las clases Singleton para situaciones en las que tiene sentido que un solo objeto proporcione acceso a un recurso global.
  • No olvide que las clases Singleton no se pueden subclasificar.
  • Los Singleton pueden ocultar dependencias, generalmente, debemos apuntar a una arquitectura de software que tenga dependencias mínimas entre clases.

Patrón de observador

El patrón de observador se utiliza para publicar cambios de estado del objeto. Otros objetos pueden suscribirse y recibir notificaciones de los cambios.

La interacción puede tener lugar entre los objetos sin necesidad de que se conozcan entre sí, esto hace que el sujeto y los observadores estén débilmente acoplados.

¿Cómo usa Apple el patrón de observador?

Notificaciones

Apple usa el patrón Observador en NSNotificationCenter Los objetos publican las notificaciones en NSNotificationCenter identificando la notificación con una cadena global. Observer Object puede escuchar esta notificación y obtener los cambios del objeto. La publicación de una notificación se realiza de forma síncrona.

Podemos usar inNSNotificationCenter nuestro código para suscribirse a las notificaciones del sistema o publicar y suscribirse a notificaciones personalizadas.

NSNotificationCenter es realmente agradable, pero intentemos escribir una implementación personalizada para el patrón de observación en Swift para que tengamos una comprensión más profunda de este patrón.

Implementación rápida del patrón de observador

Uso

En conclusión

Apple hace un alto uso de los patrones de diseño en iOS en todas sus API. En este artículo, hemos explorado cómo implementaron estos patrones y proporcionamos implementación usando swift para Object Pool, Singleton y Observer Patterns.

Comprender los patrones de diseño es realmente importante para cada desarrollador que busque código y arquitectura limpios. Si desea obtener más información sobre los patrones de diseño y cómo se pueden implementar fácilmente en iOS, asegúrese de consultar este artículo que simplifica su implementación en Swift.

Espero que hayan disfrutado esta publicación y que sea útil para su base de código.

Asegúrate de aplaudir y compartirlo para mostrar tu apoyo.

Si tiene alguna pregunta o comentario, siéntase libre de dejar una nota aquí o enviarme un correo electrónico a arlindaliu.dev@gmail.com.