Una semplice app GUI: afferma

5

Sto creando un'app Windows Form:

  • È client-server. Autorizzazione, quindi caricare alcuni dati dal server, quindi inviare di tanto in tanto alcune statistiche.
  • Si dovrebbe seguire una procedura di bootstrap, quindi avvia i calcoli (un processo separato). Quindi puoi metterlo in pausa in qualsiasi momento, probabilmente pianificandolo per ricominciare il computing, o chiuderlo completamente.

Il mio codice è pieno di verifiche come "Sono disponibili questi dati? Caricalo dal server." oppure "Sono disponibili questi dati? Richiedilo all'utente". oppure "È previsto un avvio? Annullalo, inizia ora.".

Mi sento come se la mia app fosse una macchina a stati. È come se avesse uno stato come questo: AUTH / WORKING / PAUSED / PAUSED_SCHEDULED / SHOWING_ERROR_MSG più un gruppo di flag di disponibilità dei dati. Il mio codice avvia le transizioni da stato a stato e le esegue, fondamentalmente cerca di mantenere l'app in uno stato corretto. Il codice è disordinato con i controlli di disponibilità dei dati, il bootstrap lungo in ogni singolo metodo, tonnellate di codice fail-retry ovunque.

Ci sono schemi e schemi di progettazione che posso usare? C'è qualcosa di buono e ampiamente usato? Ci sono dei caveat che trascuro? Sembra che il mio codice potrebbe essere un livello più di alto livello.

    
posta Andrey Moiseev 19.12.2016 - 21:58
fonte

2 risposte

1

Senza un contesto specifico è difficile dare un consiglio sul miglior approccio.
Sulla base delle informazioni fornite hai pochi stati principali della tua applicazione

  • AUTH
  • LAVORO
  • PAUSA
  • PAUSED_SCHEDULED
  • HOWING_ERROR_MSG

Puoi introdurre l'astrazione di tutti gli stati, quindi ogni implementazione di questa astrazione avrà responsabilità solo per la logica dello stato corrispondente.

L'obiettivo principale di questo approccio è spostare la "validazione" sul più alto livello possibile dell'applicazione.

public interface IState
{
    void DoJob();
}

public class Authorization : IState
{
    public void DoJob()
    {
        // Don't need any validation -> 
        // only use validated result for this particular case
        // do authorization logic
    }
}

// And so on for other states

Se per esempio lo stato di WORKING ha una logica diversa in base ai risultati della convalida dei dati, puoi introdurre la propria implementazione di IState per ogni possibile ramo di risultato della convalida

public class WorkingWithData : IState
{
    public void DoJob()
    {
        // do working with data logic
    }
}

public class WorkingWithNoData : IState
{
    public void DoJob()
    {
        // do working with no data logic
    }
}
    
risposta data 01.01.2017 - 13:07
fonte
2

Sicuramente un candidato per Modello Model-View-Controller .

Alcune delle complessità nelle tue applicazioni, rappresentate tramite flag, andranno via se puoi identificare diversi MODELLI / VISUALIZZAZIONI della tua applicazione.

Da wiki: link

The model directly manages the data, logic, and rules of the application. A view can be any output representation of information, such as a chart or a diagram. Multiple views of the same information are possible, such as a bar chart for management and a tabular view for accountants. The third part, the controller, accepts input and converts it to commands for the model.[7]

Come indicato nel commento, una specializzazione di MVC, PatternViewPresenter pattern sarà ancora più adatta a questo scenario. link

Model–view–presenter (MVP) is a derivation of the model–view–controller (MVC) architectural pattern, and is used mostly for building user interfaces. MVP is a user interface architectural pattern engineered to facilitate automated unit testing and improve the separation of concerns in presentation logic:

The model is an interface defining the data to be displayed or otherwise acted upon in the user interface. The presenter acts upon the model and the view. It retrieves data from repositories (the model), and formats it for display in the view. The view is a passive interface that displays data (the model) and routes user commands (events) to the presenter to act upon that data.

    
risposta data 20.12.2016 - 10:18
fonte

Leggi altre domande sui tag