Come rifattorare un gruppo di metodi init nel metodo onCreate ()?

-3

Creo copia di questo post qui perché questo posto è più pertinente per la mia domanda e non rimuovo la domanda originale da stakOverFlow perché ho ricevuto commenti e avviato conversazioni con gli utenti.

Spesso mi trovo nel mio codice o nel codice di colleghi con molti metodi init nel metodo onCreate() in Activity e sembra che questo esempio:

onCreate() {
    initUI();
}

private void initUI() {
    initToolbar();
    initPriceView();
    initDistanceView();
    initSectorsView();
    initRouteList();
    initSwipeLayout();
    initArrivalTimeContainer();
    initConditionsView();
  }

Questo è quello che mi infastidisce qui:

  • A volte l'ordine delle chiamate ai metodi è importante e le modifiche comportano arresti anomali.
  • Fai in modo che tutto funzioni con l'interfaccia utente in un solo metodo porti a fogli di codice con cattiva leggibilità.
  • I metodi nel codice sembrano sparsi, caotici e non correlati. Possiamo saltare accidentalmente un metodo-chiamata nel metodo initUI () e otterremo un bug.

Che cosa stai facendo con questo problema?

    
posta Artem 16.01.2018 - 11:50
fonte

3 risposte

3

Se il tuo sistema è composto da molte parti devi inizializzarle. E se non rientrano in una ragionevole gerarchia annidata, ma in realtà sono una lunga lista di parti, allora il modo corretto di rappresentarle nel codice ... è una lunga lista di parti. Mi sembra che questo sia quello che stai già facendo.

Non tutti i metodi su cinque righe devono essere refactored. In questo caso l'organizzazione del codice init sembra riflettere accuratamente la struttura del sistema, ed è quello che importa. Se il sistema viene refactored un giorno in modo che esso consista di meno moduli semi-indipendenti con alcune parti ciascuno, allora ovviamente il codice di init cambierà per corrispondere; ma non dovresti fare in modo che il costruttore renda il sistema più ordinato di quanto sia in realtà.

    
risposta data 16.01.2018 - 12:09
fonte
0

Considera la possibilità di creare componenti personalizzati come DistanceView o ConditionsView che eseguono autonomamente l'inizializzazione di questi componenti. Quindi è necessario includere questi componenti nell'applicazione e verranno inizializzati automaticamente. Sebbene tu possa utilizzare questi componenti una sola volta, offre comunque una soluzione più pulita, oltre a permetterti di adattare potenzialmente detto componente in un secondo momento per eventi o particolari metodi per l'esecuzione di attività specifiche per quel componente.

Un altro trucco che potresti utilizzare è di arrotondare le attività che possono spesso verificarsi in molti dei tuoi componenti e creare una classe base che esegua invece queste attività.

Il risultato sta liberando la tua classe Activity per eseguire solo attività che non sono né generiche (gestite dalla classe base) né specifiche per alcun componente (gestite da componenti personalizzati).

    
risposta data 16.01.2018 - 12:48
fonte
-2

Potresti usare qualcosa come Dagger2 per iniettare almeno la maggior parte dei componenti (oltre alle viste).
Ecco un buon tutorial: link

    
risposta data 20.01.2018 - 03:01
fonte

Leggi altre domande sui tag