Trabajadores de la arquitectura Clean Swift

Hola lector

Anteriormente, examinamos cómo se organiza el ciclo VIP y cómo hacer transiciones entre precios y transferencia de datos. Ahora necesita descubrir cómo descargar nuestro Interactor de una sobreabundancia de lógica y extraer parte de él para su reutilización en otras escenas. Y los trabajadores nos ayudarán con esto. El tema es bastante modesto en volumen, pero es importante mencionarlo.



Teoría


Los trabajadores son clases / estructuras auxiliares (que no deben confundirse con servicios o ayudantes) cuya tarea es asumir parte de la lógica comercial de Interactor . Si los métodos en Interactor se están expandiendo, es hora de eliminar la voluminosa lógica en Worker . En Clean Swift, se utilizan para trabajar con la lógica del almacenamiento de datos, con la red, con capas individuales de la aplicación, etc. En otras palabras, todo es voluminoso, de bajo nivel y no está relacionado con la lógica empresarial de la aplicación.

Los trabajadores se dividen en dos tipos principales:

  1. Locales que se usan solo dentro de la escena.
  2. Global que están disponibles para cualquier escena.

Los trabajadores locales se colocan directamente dentro de la escena y llevan su nombre: SceneNameWorker . Los trabajadores globales se encuentran en el directorio raíz de los trabajadores y se nombran según su tema. Los trabajadores locales también pueden actuar como "decoradores sobre global", con una lógica extendida para las necesidades de la escena.

Si utiliza la separación del proyecto en capas ( Presentación , Lógica empresarial , Persistencia , Lógica de red ), la función del puente de conexión entre la capa Presentación y la Lógica empresarial puede asignarse a los Trabajadores . Por lo tanto, descargaremos Interactor , obtendremos un comportamiento más predecible y facilidad de reutilización.

Practica


El trabajo de los trabajadores lo consideraremos en el ejemplo de trabajar con la red. Tendremos dos pantallas: en la primera, se muestra una lista de usuarios, y en la segunda, una lista de publicaciones de este usuario. Todos los datos serán tomados por API . Dividiremos esta tarea en tres trabajadores , dos locales y uno global, que actuarán como punto de entrada para los otros dos. Ocultaré la implementación de los métodos mismos en el artículo, y quien quiera probar en la práctica, habrá un enlace al proyecto terminado al final del artículo.



Esta estructura de proyecto no es una referencia para trabajar con una red y no refleja de ninguna manera cómo trabajar con ella en Clean Swift . Todo esto se hace solo como un buen ejemplo del papel de los trabajadores locales y globales.

Para comenzar, cree un Trabajador global: NetworkWorker . Colóquelo en el directorio Trabajadores , al mismo nivel que el directorio Escenas . En el siguiente ejemplo, hay un método sendRequest (to: params: complete) , que será común a los trabajadores locales. Realiza una tarea de rutina: forma un enlace a partir de los parámetros, envía una solicitud y envía el resultado a su finalización .

struct NetworkWorker { // MARK: - Private Properties private let session = URLSession.shared // MARK: - Public Methods ///  Worker.    API /// /// - Parameters: /// - to: ,     /// - params:    /// - completion:     func sendRequest(to: URL, params: [String: String], completion: @escaping (Data?, Error?) -> Void) { // ... } } 

Para la primera escena, necesitamos obtener una lista API de todos los usuarios. Para hacer esto, creamos un HomeWorker local que configurará los parámetros para cargar usuarios y llamará a sendRequest (a: params: complete) en NetworkWorker con estos parámetros. Ahora en el Interactor de la escena , necesitamos llamar a fetchUsers (finalización :) y enviar los datos recibidos para su procesamiento al Presentador .

Cuando hace clic en una celda de la tabla con el nombre de usuario, haremos la transición y transferiremos al usuario seleccionado a otra escena.

 struct HomeWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let usersURL = URL(string: "https://jsonplaceholder.typicode.com/users") // MARK: - Public Methods ///  Worker.   API     /// /// - Parameter complete:     func fetchUsers(_ complete: @escaping ([User]?) -> Void) { // ... } } 

En la página con publicaciones de usuario, creamos PostsWorker , pero solo con el método fetchPosts (userId: complete :) . En él pasamos la identificación del usuario cuyas publicaciones desea descargar. En el método, formamos los parámetros y llamamos sendRequest (a: params: complete) en NetworkWorker . Y de la misma manera que antes, llamamos al método fetchPosts (userId: complete :) en el Interactor de la escena, pasando los datos recibidos al Presentador .

 struct PostsWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let postsURL = URL(string: "https://jsonplaceholder.typicode.com/posts") // MARK: - Public Methods ///   API      /// /// - Parameters: /// - userId: ID ,     /// - completed:     func fetchPosts(userId: Int, _ completed: @escaping ([Post]?) -> Void) { // ... } } 

Ahora toda nuestra implementación se ha movido a archivos separados que se pueden reutilizar, sin cargar la lógica empresarial en Interactor .

Conclusión


Aunque los trabajadores son muy simples y no revelan ningún conocimiento oculto sobre arquitectura, su uso es importante en Clean Swift . Cuando escriba Trabajadores , no se olvide de protocolos, patrones estructurales y DI. De lo contrario, rápidamente formará un desastre de Trabajadores , donde todo lo que se podría sacar se hizo pedazos.

Eso es todo Gracias por leer hasta el final, a continuación hay un enlace al proyecto completo.

Serie de artículos


  1. Descripción general de la arquitectura Clean Swift
  2. Enrutador y paso de datos en la arquitectura Clean Swift
  3. Trabajadores de la arquitectura Clean Swift (estás aquí)
  4. Pruebas unitarias en arquitectura Clean Swift
  5. Un ejemplo de una arquitectura simple de tienda en línea Clean Swift

Enlace al proyecto
Ayuda para escribir un artículo: Bastien

Source: https://habr.com/ru/post/465991/


All Articles