TL; DR
Parte 1)
Voglio refactoring la parte più grande dell'applicazione su cui lavoro - ed è praticamente spaghetti. È una singola classe che effettua le richieste al server, analizza il JSON e salva i dati nel database (ha anche conoscenza di alcune UI che devono essere modificate quando vengono soddisfatte specifiche regole aziendali e sicuramente non dovrebbe sapere tutto questo ). Ha un valore inferiore a 5000 LOC: (.
Un modo per rompere la classe in parti più piccole sarebbe separare le richieste dalla semantica (ad esempio richieste degli utenti, richieste di ricerca ecc.). Sarebbe utile o no?
Inoltre, penso che il codice di rete debba essere disaccoppiato dal codice di analisi e anche dal codice DB. Il problema è che non so davvero quale approccio (architettura / design pattern) dovrei usare per fare questo nel modo migliore. (ad esempio, la nostra libreria di analisi JSON è vecchia e non viene più mantenuta, volevamo cambiarla perché ha prodotto alcuni problemi e siamo rimasti bloccati a causa dell'accoppiamento stretto).
Parte 2)
Vorrei anche ricevere alcuni suggerimenti per il seguente problema: Usiamo il DB principalmente per la modalità offline e amp; caching. L'utente può vedere i dati in modalità offline, modificarli (e le richieste vengono serializzate) e quando torna in linea, le richieste verranno inviate al server. Lo usiamo anche come cache per mostrare qualcosa sull'interfaccia utente mentre facciamo una richiesta in background per vedere se ci sono dati nuovi / modificati (usiamo un meccanismo simile come ETag per verificare con il server).
Quindi questo è il flusso quando un utente entra in uno schermo:
enter_screen ->
check_cache + background_request ->
show_UI with cache data ->
update_UI when the background request finishes and new/modified data is available.
Questa roba può essere sottratta in qualche modo? Stavo pensando ad una sorta di pattern delegato in cui ottengo una richiamata immediata quando colpisco la cache e poi ottengo una callback successiva al termine della richiesta (con flag facoltativi per distinguere tra dati cache e nuovi dati).
Un po 'di storia di sottofondo
Attualmente lavoro per un'app iOS che è aprox. 4 anni. Mi sono unito al team solo un anno fa. Secondo me il codice è brutto, pieno di hack e ha un'architettura molto traballante. Siamo 2 sviluppatori iOS che ci lavorano. Il cliente non ha esperienza tecnica e potrebbe non comprendere tutte le implicazioni di alcuni problemi che abbiamo. Fare in modo che un cliente capisca perché è necessario "refactoring" è un compito difficile. Faccio fatica a refactoring quanto posso, ma abbiamo ancora molto da fare.
L'app ha anche molte funzionalità che aumentano la complessità dell'app: deeplink, notifiche push, modalità offline, UI non bloccante, ecc. combinate con un modello di dati piuttosto ampio e peloso.
Poiché il client richiede funzionalità in modo costante, ritengo che il debito tecnico sia elevato.
Il mondo mobile sta cambiando molto velocemente e appaiono nuove tecnologie (classi di dimensioni, layout automatico, Swift, ecc.). Questo è vero per tutte le tecnologie, ma in qualche modo sento che la gara è un po 'più intensa nel mondo mobile. Attualmente sogno solo di usare Swift al lavoro (anche se gioco a casa nel mio tempo libero).