Flusso di dati unidirezionale nelle app iOS

Apr 28 2023
Un modo per migliorare qualsiasi architettura esistente
Tutti noi potremmo trovarci di fronte a una situazione in cui l'architettura attuale si trasforma in un completo disastro. In un mondo perfetto, riscriveremmo la nostra base di codice con un nuovo modello architettonico.
Foto di Hunter Harritt su Unsplash

Tutti noi potremmo trovarci di fronte a una situazione in cui l'architettura attuale si trasforma in un completo disastro. In un mondo perfetto, riscriveremmo la nostra base di codice con un nuovo modello architettonico. Ma non siamo in un mondo perfetto e non abbiamo tempo per questo. La decisione giusta da prendere è provare a migliorare una base di codice esistente senza apportare modifiche globali. Nel mio progetto attuale, io e il mio team lo abbiamo fatto utilizzando un approccio Unidirectional Data Flow (UDF) .

Flusso dati unidirezionale

Partiamo dalla breve descrizione di UDF .

Il concetto principale dell'UDF è che i dati si muovono solo in una direzione: dal modello all'interfaccia utente. L'interfaccia utente non è autorizzata ad aggiornarla da sola. Tutto ciò che l'interfaccia utente può fare è inviare eventi al modello e, dopo aver ricevuto un nuovo evento, il modello invia lo stato aggiornato all'interfaccia utente. Lo stato utilizzato dall'interfaccia utente per gli aggiornamenti deve essere immutabile, poiché l'interfaccia utente lo utilizza solo per gli aggiornamenti. L'interfaccia utente non è autorizzata a memorizzarlo o modificarlo.

L'architettura più popolare che utilizza questo approccio è JavaScript Redux . Si svolge anche nel picchiettio Flutter BLoC . E in Swift, TCA (The Composable Architecture) lo usa.

Ogni architettura utilizza un'implementazione diversa del livello Modello. Diamo un'occhiata all'implementazione di Redux. Diamo un'occhiata più da vicino all'implementazione Redux, che consiste in quattro entità principali: State, Event, Reducer e Store.

  • Stato : è lo stato di un modulo/schermo corrente. Questo è l'oggetto che Model aggiorna e invia alla View;
  • Evento (azione): viene inviato al livello del modello dalla vista e attiva l'aggiornamento dello stato;
  • Riduttore : è una funzione che prende lo stato e l'evento correnti come argomenti e restituisce il nuovo stato. Reducer è l'unico punto in cui è possibile modificare lo stato;
  • Negozio : è un'entità che tiene insieme tutti gli elementi ed esegue la comunicazione tra di loro. Prende gli eventi e con l'aiuto del riduttore li mappa in nuovi stati.

Due vantaggi principali dell'UDF sono:

  • Gestione prevedibile dello stato;
  • Separazione della gestione dello stato e dell'interfaccia utente.

UDF separa l'interfaccia utente e la gestione dello stato in due parti separate: Modello e UI. Con questa separazione, puoi scrivere test migliori per il livello Modello e ti offre anche molta più flessibilità con l'interfaccia utente. A partire dal 2023, molte app utilizzano ancora UIKit per l'interfaccia utente. Tuttavia, sta arrivando il giorno in cui passeremo a SwiftUI. Con UDF, è molto più semplice migrare a SwiftUI poiché la gestione dello stato e l'interfaccia utente sono separate e tutto ciò che devi modificare è l'interfaccia utente.

Come integrarsi in un progetto esistente

Se stai utilizzando VIPER, MVP o qualsiasi altra architettura, puoi integrare l'approccio UDF nella tua base di codice. Non è necessario modificare un'intera architettura. Tutto ciò di cui hai bisogno è impostare la comunicazione Stato/Evento tra i livelli View e Logic (Presenter, Interactor, Intent) e impostare la logica Reducer all'interno del tuo livello Logic. Puoi farlo usando librerie reattive, nel caso in cui le stai già utilizzando. Dopo queste modifiche, non avrai un modello che segue completamente UDF come TCA o Redux, ma avrai questo singolo flusso di dati tra i tuoi livelli e risolverà molti problemi.

La domanda è come trovare il tempo per introdurre questi cambiamenti. Abbiamo tutti compiti da completare e i team di prodotto vogliono che forniamo nuove funzionalità il prima possibile e correggiamo tutti i bug ancora più velocemente. Tuttavia, la buona notizia è che non è necessario riscrivere l'intera base di codice per implementare queste modifiche.

Quello che puoi fare è iniziare a creare nuovi moduli usando l'approccio UDF. In questo modo, smetterai di creare nuovi pezzi di codice utilizzando la tua architettura precedente. Ma cosa fare con un codice esistente? Puoi lavorare sul refactoring di vecchi moduli nel momento in cui stai aggiustando o aggiungendo qualcosa a quei moduli. Ci vorrà del tempo, ma dopo un po' avrai la maggior parte del codice aggiornato. E non interromperà il tuo processo di sviluppo. Forse solo un po'.

Spero che tu abbia trovato utile questo articolo e forse proverai a utilizzare UDF nei tuoi progetti nuovi o attuali. Sarei felice di vedere la tua opinione su questo argomento nei commenti. Grazie per il tuo tempo!

Check out my other articles about iOS Development

https://medium.com/@artem.khalilyaev