“Make things as simple as possible, but not simpler.”
È buono quando si avvia il programma in modo semplice e poi lo si estende gradualmente.
I grandi progetti iniziano sempre con qualcosa, e con l'approccio agile penso che tu sia sulla strada giusta.
Una cosa che dovresti assicurarti è che non dipendere dalla semplicità iniziale .
Diamo un'occhiata al tuo esempio.
1) Try to make the program able to transfer 1 file
2) Try to make the transfer into a queue
3) Try to implement multi-threading
Durante la seconda iterazione, definirai le classi più importanti per il programma.
Creerai le astrazioni per i file, probabilmente rimettendo l'astrazione di base del server dalla prima iterazione e il gestore del trasferimento stesso. Dovrai anche creare una sorta di GUI che permetta di lavorare con più file e legare questo frontend al backend.
Dopo questa fase, la modifica dell'API di base sarà difficile . Per questo motivo, assicurarsi di non dover riprogettare l'intero sistema alla terza iterazione. Quando fai il secondo iteration design, mantieni le cose semplici e abbastanza flessibili (sei fortunato quando sai che cosa cambierà ma non è sempre così).
In pratica, questo di solito significa ridurre le dipendenze con Inversion of Control pattern , interagendo con il back-end (e all'interno anche il back-end) utilizzando le interfacce e separando i diversi pezzi di logica in moduli indipendenti che possono essere successivamente sostituiti facilmente.