Direi di non iniziare con TDD. Prendi una decisione informata quando hai dedicato più tempo all'apprendimento delle strategie di architettura in generale. TDD non ti lascerà saltare quei compiti, anche se potresti iniziare a crederci.
Ecco il mio problema. Quando dici che sembra un sacco di tempo sprecato in cose che non romperanno mai TDDer dirai che lo apprezzerai quando quella cosa che non avevi previsto in un'enorme catena di dipendenze viene sballata. Quando fai notare che è impossibile prevedere queste cose prima di scrivere la tua app, ed è per questo ... perché testiamo, ti dicono che è molto più sulla progettazione e non sui test anche se i test sono utili.
Ma le catene giganti di imprevedibili dipendenze collegate sono il prodotto di un design scadente?
Quindi che cos'è?
Ecco un pensiero. Non abbiamo in primo luogo enormi catene complesse di dipendenze considerando i due principi seguenti di progettazione orientata agli oggetti di Design Patterns:
"Programma per un'interfaccia, non un'implementazione"
Vale a dire, ai tuoi oggetti non dovrebbe interessare chi sta facendo la chiamata o come sono stati fatti. Solo che sono stati alimentati gli argomenti appropriati e che i metodi che chiamano da altri oggetti vengono indirizzati a funzionare come previsto. La catena di dipendenza nella maggior parte dei casi dovrebbe trovarsi in un punto di collegamento, la chiamata del metodo da parte del chiamante e il punto in cui gli arg vengono rilasciati nei metodi. È qui che accedi e convalidi e invii messaggi utili per il debug quando le cose vanno male.
E:
"Favorisci la composizione dell'oggetto rispetto all'eredità di classe"
Chi è il manichino? Il ragazzo che ha fatto qualcosa in una classe in uno schema di ereditarietà a cascata contorto che coinvolge come 30 classi con conseguente rottura del caso marginale, o lo sviluppatore che ha inventato quell'architettura in primo luogo? Il TDD potrebbe aiutarti ad arrivare al fondo dei problemi all'interno di quella torre pendente di classe Pisa prima di quanto potresti avere senza, ma ciò rende meno doloroso tentare di modificare uno degli endpoint di quel disastro del codice la prossima volta?
Ed è qui che arrivo alla cosa che mi infastidisce. TDD aiuta davvero la progettazione o abilita la cattiva architettura? Mi sembra che abbia il potenziale per essere una strategia che si autoavvera. Più il tuo team non deve assumersi la propria responsabilità per l'architettura scadente, più utili sembrano diventare quei componenti di test granulari, ma alla fine la tua app diventa un PITA sempre più grande con cui lavorare (supponendo che non abbiano mai pensato molto all'architettura nel primo posto). E l'incapacità di riconoscere le conseguenze di ciò è senza dubbio, sempre l'errore più costoso che si può fare quando si lavora su un'applicazione che dovrebbe essere aggiornata e modificata nel tempo.