Ristrutturazione - Http - Comunicazione di notifica

0

Sto cercando di ristrutturare un progetto per rendere i componenti riutilizzabili e più chiari.

Considera il seguente scenario:

A WakefulBroadcastReceiver (nel mio caso chiamato SimpleWakefulReceiver ) avvierà il mio LocationService. Una volta ricevuta una nuova correzione GPS, il client dovrebbe trasmetterla a un server e la risposta del server dovrebbe essere mostrata all'utente.

Tentativo di implementazione:

Ho due altre classi:

  • HttpManager
  • NotificationManager

La LocationService crea un riferimento anonimo e chiama un metodo come questo:

new HttpManager(this).sendGps(longitude, latitude, accuracy, utcTime);

Il costruttore della classe HttpManager

public HttpManager(Context context)
{
    this.context = context;
}

Dopo aver ricevuto una risposta dal server, faccio praticamente lo stesso di sopra all'interno della classe HttpManager:

new NotificationManager(context).sendNotificationToUser(resultData);

Il problema:

Quando il lavoro è terminato, si è verificato un errore o altre condizioni, il WakeLock deve essere rilasciato e il servizio deve essere arrestato.

Perciò spesso chiamo i metodi

  • context.stopService(new Intent(context, LocationService.class));
  • SimpleWakefulReceiver.completeWakefulIntent(new Intent(context, LocationService.class));

all'interno della NotificationManager e della HttpManager class che sembra un odore di codice.

Sto cercando una struttura in cui non devo chiamare spesso questi metodi. Inoltre, non sono sicuro che sia molto elegante con questi riferimenti anonimi o magari implementando un ResultReceiver o IntentService sarebbe il modo migliore.

Domanda

  • Come posso strutturare il progetto per rimuovere questo odore di codice?
posta momo 13.03.2015 - 09:36
fonte

1 risposta

3

Il tuo SimpleWakefulReceiver non dovrebbe creare riferimenti diretti a HttpManager . Un HttpManager gestisce la comunicazione con il server. Il suo scopo risponde alla domanda: " In che modo comunico con il server?" Hai bisogno di un'altra classe per rispondere alla domanda Cosa comunico al server? "

Il principio di singola responsabilità afferma:

In object-oriented programming, the single responsibility principle states that every class should have responsibility over a single part of the functionality provided by the software, and that responsibility should be entirely encapsulated by the class. All its services should be narrowly aligned with that responsibility.

...

Martin defines a responsibility as a reason to change, and concludes that a class or module should have one, and only one, reason to change.

Cerca di ristrutturare le tue lezioni tenendo presente questo comportamento. Non aver paura di aggiungere più lezioni. Le tue classi dovrebbero essere piccole e agili.

Nel tuo caso specifico, puoi creare una classe che è responsabile del wrapping della capacità di inviare i dati GPS al server ed elaborarne la risposta. Quindi è necessario chiamare queste procedure di avvio e arresto del servizio solo in quella posizione. Il resto del codice non dovrebbe preoccuparsi di queste attività, in quanto tali classi hanno altre responsabilità.

    
risposta data 13.03.2015 - 15:08
fonte