La cosa da ricordare sul codice GUI è che è basata sugli eventi e il codice basato sugli eventi avrà sempre l'aspetto di una massa di gestori di eventi organizzati casualmente. Dove diventa davvero complicato è quando si tenta di calzare codice non guidato da eventi nella classe. Certo, ha l'apparenza di fornire supporto per i gestori di eventi e puoi mantenere i tuoi gestori di eventi semplici e piccoli, ma tutto quel codice di supporto extra che galleggia intorno rende la tua sorgente GUI apparentemente gonfia e disordinata.
Che cosa puoi fare al riguardo e come puoi rendere le cose più facili da refactoring? Bene, per prima cosa cambierei la mia definizione di refactoring da qualcosa che faccio in occasione di qualcosa che faccio continuamente mentre codice. Perché? Perché vuoi che il refactoring ti permetta di modificare più facilmente il tuo codice, e non viceversa. Non ti sto semplicemente chiedendo di cambiare la semantica qui, ma ti chiedo invece di fare un po 'di ginnastica ritmica per vedere il tuo codice in modo diverso.
Le tre tecniche di refactoring che trovo di utilizzare più comunemente sono Rinomina , Estrai metodo e Estrai classe . Se non avessi mai imparato un altro refactoring, quei tre mi avrebbero comunque permesso di mantenere il mio codice pulito e ben strutturato, e dal contenuto della tua domanda, mi sembra che probabilmente ti ritrovi ad utilizzare gli stessi tre refactoring quasi costantemente in per mantenere il codice GUI sottile e pulito.
Puoi avere la migliore separazione possibile tra la GUI e la logica aziendale nel mondo, e il codice della GUI può ancora apparire come un codice che è stato detonato nel bel mezzo di esso. Il mio consiglio è che non fa male avere una classe o due in più per aiutarti a gestire correttamente la tua GUI, e questo non deve essere necessariamente la tua classe Visualizza se stai applicando il pattern MVC - anche se spesso troverai che le classi intermedie sono così simili alla tua opinione che sentirai spesso la necessità di unirle per comodità. La mia opinione su questo è che non fa davvero male aggiungere un ulteriore livello specifico della GUI per gestire tutta la logica visiva, tuttavia probabilmente vorrai valutare i vantaggi e i costi di ciò.
Il mio consiglio è quindi:
- Non fare nulla direttamente dietro la GUI tranne che per invocare e definire in che modo la GUI si agganci alla vista (o a un livello intermedio).
- Non provare a eseguire il corno della scarpa ogni cosa relativa alla vista in una singola classe, o persino una singola classe per finestra della GUI, a meno che non abbia senso per te farlo. La tua alternativa è creare molte classi piccole e facili da gestire per gestire la tua logica della GUI.
- Quando i tuoi metodi cominciano a sembrare un po 'più grandi di 4-5 linee di codice, verifica se è necessario e se è possibile estrarre un metodo o due in modo da mantenere i metodi snelli, anche se questo significa una classe con molti altri metodi.
- Se le tue classi iniziano a sembrare davvero grandi, inizia rimuovendo TUTTE le funzionalità duplicate, quindi verifica se puoi raggruppare logicamente i tuoi metodi in modo da poterne estrarre un'altra o due.
- Pensa al refactoring ogni volta che scrivi una riga di codice. Se riesci a far funzionare una riga di codice, verifica se è possibile eseguire il refactoring per evitare la duplicazione della funzionalità o per renderla un po 'più snella senza modificare il comportamento.
- Accetta l'inevitabile, che sentirai sempre che una parte o l'altra del tuo sistema inizieranno a sentirsi un po 'gonfie, specialmente se trascuri il refactoring mentre procedi. Anche con una base di codice ben strutturata, puoi ancora sentire come se ci fosse più che potresti fare. Questa è la realtà del software di scrittura, che ti sentirai sempre alla sensazione che qualcosa di più avrebbe potuto essere fatto "meglio", quindi devi trovare un equilibrio tra fare un lavoro professionale e placcare oro.
- Accetta che il pulitore cerchi di mantenere il tuo codice, meno il tuo codice sembrerà gonfio.