C # Applicazione GUI design dipende dalla configurazione

0

Ho creato un'applicazione WinForms piuttosto grande che lavora nell'industria per alcuni anni. Comunica con molti dispositivi HW. L'applicazione può essere configurata per utilizzare o non utilizzare alcuni di questi dispositivi e la GUI viene modificata da questa configurazione. Ora verranno aggiunti altri dispositivi (e le possibili configurazioni dell'applicazione), quindi ho bisogno di rifattorizzare l'intera applicazione, forse anche di scriverne di più e sarà un lavoro molto doloroso in quanto è stato generalmente il mio primo progetto più grande.

Ho particolarmente paura di rendere la GUI dipendente dalla configurazione dell'applicazione. In questo momento, ho molti controlli nel mio file Form.Designer.cs (creato in drag & drop designer), e sto abilitando / disabilitando alcuni pulsanti, cambiando testo di alcune etichette, aggiungendo o rimuovendo pannelli ecc in ArrangeControls() funzione in base alla configurazione, anche nel file Form.Designer.cs .

Questa funzione è simile a questa:

void ArrangeControls(Config hwCfg)
{
    if (!hwCfg.dev1&& !hwCfg.dev2&& !hwCfg.dev3&& !hwCfg.dev4)
    {
        panelDevices.Dispose();
        lastPannel = panelTime;
    }
    else
    {
        if(hwCfg.dev1)
            ...
        else
            ...        
    }
    ...
}

Questa è una soluzione molto disgustosa con poche centinaia di linee in questo momento e ho anche bisogno di aggiungere più controlli e più combinazioni possibili di aspetto dei controlli. Puoi suggerirmi qualche schema, come avere sotto controllo questo problema?

    
posta Majak 20.10.2015 - 20:44
fonte

1 risposta

3

Crea la "Configuration-to-GUI" mappando un processo di due passi:

  • lascia che ogni modulo fornisca un insieme di funzioni di basso livello e / o parametri che possono essere, ad esempio, attivati e disattivati o impostati su un determinato valore. I nomi delle funzioni / nomi dei parametri in genere non riflettono un dispositivo specifico, devono riflettere il cambiamento o il significato effettivo nel modulo. Ad esempio, potrebbe esserci un flag di funzionalità bool showDevicePanel o un parametro intero tableFoolastColumnWidth .

  • implementa la mappatura su quale dispositivo abilita le funzionalità completamente al di fuori del codice del modulo, in una posizione centrale. Puoi provare a utilizzare una tabella di decisione o aggiungere alcuni metodi alla tua classe Config oppure fornire un DSL per definire questi mapping o un mix di tali elementi, indipendentemente dalle tue esigenze.

Ad esempio, la tua classe di configurazione potrebbe fornire una proprietà come

   public bool ShowDevicePanel
   {
        get{return dev1||dev2||dev3||dev4;}    
   }

e il metodo ArrangeControls potrebbe essere simile a questo:

void ArrangeControls(bool showDevicePanel, /* more parameters as needed*/)
{
    if (!showDevicePanel)
    {
        panelDevices.Dispose();
        lastPannel = panelTime;
    }
    // more arrangements on other parameters
}

In questo modo, non avrai bisogno di cambiare la maggior parte dei moduli ogni volta che aggiungi un nuovo dispositivo. Nella maggior parte dei casi, sarà sufficiente estendere il codice di mappatura e definire le caratteristiche e i parametri specifici per il nuovo dispositivo in un unico punto . Solo quando un nuovo dispositivo richiede una funzionalità o un tipo di parametro completamente nuovi in un determinato modulo, dovrai modificare tale modulo.

    
risposta data 20.10.2015 - 21:33
fonte

Leggi altre domande sui tag