Direi di non iniziare con TDD. Prendi una decisione informata quando passi più tempo a imparare le strategie di architettura in generale. TDD non ti lascerà saltare i compiti, anche se potresti iniziare a crederci.
Ecco il mio problema. Quando dici che sembra un sacco di tempo sprecato per cose che non si romperanno mai, i TDDers ti diranno che ti apprezzeranno quando quell'unica cosa che non hai previsto in un'enorme catena di dipendenze viene sballata. Quando fai notare che è impossibile prevedere tali cose prima di scrivere la tua app, che è uh ... perché testiamo, ti dicono che è molto più sulla progettazione e non sui test anche se i test sono utili.
Ma le catene giganti di dipendenze collegate imprevedibili non sono il prodotto del design scadente?
Quindi qual è?
Ecco un pensiero. Non abbiamo enormi catene di dipendenze in primo luogo considerando i seguenti due principi di progettazione orientata agli oggetti da Design Pattern:
"Program to an interface, not an implementation"
Vale a dire, i tuoi oggetti non dovrebbero preoccuparsi di chi sta facendo la chiamata o di come sono stati fatti. Solo che gli argomenti appropriati sono stati nutriti e che i metodi che chiamano da altri oggetti sono diretti a funzionare come previsto. La catena di dipendenze nella maggior parte dei casi dovrebbe trovarsi a un punto di collegamento, la chiamata al metodo sulla parte del chiamante e il punto in cui gli argomenti vengono rilasciati nei metodi. È lì che accedi e convalidi e invii messaggi utili per il debug quando le cose vanno a pezzi.
E
"Favor object composition over class inheritance"
Chi è il manichino? Il tizio che ha fatto qualcosa in una classe in un complicato schema di successione a cascata che coinvolge come 30 classi con conseguente frazionamento del caso marginale, o lo sviluppatore che ha inventato quell'architettura in primo luogo? TDD potrebbe aiutarti ad arrivare al fondo delle questioni all'interno di quella torre pendente di classe Pisa prima di quanto potresti fare senza, ma ciò rende meno doloroso tentare di modificare uno degli endpoint di quel disastro di codice la prossima volta?
Ed è lì che arrivo alla cosa che mi infastidisce. TDD aiuta davvero a progettare o abilita una cattiva architettura? Mi sembra che abbia il potenziale per essere una strategia che si autoavvera. Più il tuo team non è responsabile della scarsa architettura, più utili saranno i componenti granulari di testing, ma alla fine la tua app diventa una PITA sempre più grande con cui lavorare (presupponendo che non abbiano mai pensato molto all'architettura nel primo posto). E l'incapacità di riconoscere le conseguenze di ciò è a portata di mano, sempre l'errore più costoso che si possa fare quando si lavora su un'applicazione che deve essere aggiornata e modificata nel tempo.