Come disaccoppiare correttamente il livello di servizio dal livello dell'interfaccia utente, se il livello di servizio deve interagire con l'utente?

0

Nel mio programma, ho una funzione di lunga durata da cui vorrei interagire con l'utente per vari motivi:

  1. Fornire aggiornamenti di stato ( "Download di file /foo/bar.png " )
  2. Visualizzazione degli avvisi ( "Caricamento file fallito, riproverò più tardi" )
  3. Chiedere l'input ( "Inserisci la password del tuo google drive" )

Il problema è, naturalmente, che questa funzione non sa come dovrebbe interagire con l'utente. Ad esempio, sarebbe privo di senso visualizzare i messaggi su stdout in un programma della GUI.

In caso di errori, la soluzione è ovvia: basta lanciare un'eccezione che verrà rilevata nel livello dell'interfaccia utente. Gli errori sono facili perché il lavoro del livello di servizio viene eseguito non appena viene lanciata l'eccezione. Ma che dire di cose come avvertimenti e input? Come faccio a colmare il divario tra il livello di servizio e l'utente?

    
posta Aran-Fey 07.11.2018 - 00:02
fonte

1 risposta

3

Bene, quello che faccio di solito in situazioni come questa (e la mia risposta non è specifica per Python in questo caso) è di fornire un meccanismo all'interno del livello dell'interfaccia utente che consente all'utente -client code per definire "callbacks". Il livello di servizio richiama il livello dell'interfaccia utente a intervalli strategici. Ciò fornisce al livello dell'interfaccia utente la possibilità di richiamare una richiamata se l'utente ne ha definita una. (Se non l'ha fatto, la chiamata è semplicemente un no-op.)

La "separazione delle preoccupazioni" rimane quindi chiara: il livello di servizio chiamerà lo strato UI a prescindere, non sapendo (o preoccupandosi) se il livello dell'interfaccia utente ha qualcosa che esso dovrebbe chiamare, e non avendo idea di quale sarebbe una tale chiamata.

Nel linguaggio Python, i "callback" sarebbero ovviamente chiusure.

    
risposta data 07.11.2018 - 01:41
fonte

Leggi altre domande sui tag