Ho iniziato a utilizzare TDD per migliorare la qualità e il design del mio codice, ma di solito ho riscontrato un problema. Proverò a spiegarlo attraverso un semplice esempio: Provo ad implementare una semplice applicazione usando il design della vista passiva. Ciò significa che cerco di rendere la visione più stupida possibile. Consideriamo un'applicazione, in cui la GUI ha un pulsante e un'etichetta. Se l'utente preme il pulsante, viene creato un file con una riga casuale al suo interno. Quindi l'etichetta mostra se la creazione ha avuto successo o meno. Il codice potrebbe essere simile a questo:Apprendimento TDD, sempre in dipendenza circolare
- interfaccia IView: una singola proprietà stringa setter: Risultato
- classe GUIEventListener: metodo OnUserButtonClick che viene chiamato dal bottone della GUI classe
- FileSaver: metodo SaveFile che viene chiamato da GUIEventListener
- Classe GUIController: metodo UpdateLabel che viene chiamato dal metodo SaveFile della classe FileSaver con un parametro che dipende dal successo del metodo SaveFile.
istanze di simile a questa:
- di vista ctor: View (GUIEventListener eventListener)
- ctor di GUIEventListener: GUIEventListener (FileSaver FileSaver)
- ctor di FileSaver: FileSaver (regolatore GUIController)
- Responsabile del GUIController: GUIController (Vista)
Come puoi vedere chiaramente, c'è una dipendenza circolare nel design. solito cerco di evitare di utilizzare gli eventi, non mi piace il test con loro e credo che questo tipo di disegno è più auto esplicativo come si afferma chiaramente che cosa sono il rapporto delle classi. Ho sentito parlare dello stile di progettazione IoC, ma non ne ho molta familiarità.
Quali sono i miei "punto critico" in TDD riguardo a questo problema? Finisco sempre in esecuzione in questo problema e voglio imparare un modello adeguato o un principio di evitarlo in futuro.
Sono GUIController e Vista in diversi progetti/gruppi? – Glenn
Non ho molta familiarità con MVC (presumo che lo stiate usando) ma in MVVM quello che chiamereste Controller non ha un riferimento alla vista. Esporrebbe proprietà a cui la vista si legherebbe. Il Controller avrebbe un'istanza del salvaschermo e userebbe i comandi di ritrasmissione per chiamare il salvaschermo quando si fa clic sul pulsante (in modo efficace sostituisce l'ascoltatore di eventi) –