Esiste un principio generale che regola la necessità di refactoring e ottimizzazione, sia in cascata che in Agile: YAGNI (Non ne avrai bisogno). Un secondo principio è il corollario del primo: "L'ottimizzazione prematura è la radice di tutti i mali", l'equivalente in codice del proverbio generale "il nemico dell'eccellenza è la perfezione".
Prendiamo i principi e li applichiamo. È necessario creare un algoritmo ETL che preleva un file di un tipo particolare, ne estrae le informazioni, quindi le inserisce in un database. Il tuo obiettivo per questa settimana (per i nostri scopi non importa se ti trovi in un negozio Agile o SDLC) è quello di farlo.
Sei un tipo intelligente e ti è stato dato uno sguardo al quadro generale. Sai che questo non è l'unico tipo di file per il quale il progetto avrà bisogno di un ETL. Quindi, consideri l'implementazione di questo algoritmo ETL per funzionare anche su un altro tipo di file, che ha solo differenze minori. Ciò violerebbe YAGNI. Il tuo compito non è quello di sviluppare l'algoritmo per quell'altro file; è sviluppare l'algoritmo per il file necessario entro la fine della settimana. Per raggiungere questo obiettivo e superare i test di accettazione, è necessario sviluppare tale algoritmo e farlo funzionare correttamente. "Non avrai bisogno" del codice aggiuntivo per farlo funzionare con l'altro file. Potresti pensare che ti farà risparmiare tempo per incorporarlo ora, e potresti avere ragione, ma potresti anche essere terribilmente sbagliato; potrebbe essere necessario utilizzare l'algoritmo per l'altro file in un'area del sistema in cui il codice non può essere utilizzato, oppure i requisiti per il nuovo file potrebbero essere diversi da quelli per i tuoi in modi che non conosci (in Agile, quelli i requisiti potrebbero non esistere ancora). Nel frattempo, hai perso tempo e hai inutilmente aumentato la complessità del tuo algoritmo.
Ora è la prossima settimana e come dubbia ricompensa per il tuo eccellente lavoro sul primo algoritmo, ti è stato assegnato il compito di creare gli algoritmi per due nuovi tipi di file. Ora, hai bisogno di un codice aggiuntivo per far funzionare il tuo algoritmo con più file. È possibile estendere l'algoritmo esistente utilizzando un modello di metodo modello che utilizzerà un modello di base con passaggi individuali specifici del file oppure si può semplicemente derivare un'interfaccia comune dall'algoritmo esistente, svilupparne due nuovi che seguono l'interfaccia e collegarli a un oggetto che può scegliere quale algoritmo usare.
Durante lo sviluppo, sai di avere il requisito che il sistema sia in grado di elaborare 10 KB di dati non elaborati al secondo. Esegui un test di carico e scopri che l'algoritmo di bozza iniziale gestisce 8 KB / s. Bene, questo non supererà gli AAT. Dai un'occhiata e vedi che c'è qualche struttura ad anello di complessità O (mio Dio) nel tuo algoritmo; lo razionalizzi e ottieni 12KB / s. "Abbastanza buono", pensi, "ma se avessi un ciclo così scadente nel codice, cos'altro posso radere?". buzz Hai appena violato la regola dell '"ottimizzazione prematura". Il codice funziona e soddisfa tutti i requisiti. Hai "finito", fino a quando i requisiti non saranno aggiornati per richiedere 15 KB / s. Se e quando ciò accade, ALLORA si ripristina il codice e si cercano cose da migliorare.
Segui questo semplice processo durante lo sviluppo, sia in Agile che nei tradizionali SDLC: "Al primo passaggio, fallo funzionare. Al secondo passaggio, rendilo carino. Al terzo passaggio, rendilo SOLIDO". Ciò significa che, quando crei per la prima volta una riga di codice, fai in modo che quel codice faccia il suo lavoro correttamente e senza errori, ma non presta troppa attenzione alle regole di progettazione all'interno di questo codice, come per tutto quello che sai in questo momento ' Non toccherò mai più quest'area. La prossima volta che visiti quella riga di codice, ti sei appena dimostrato sbagliato; non è più un pezzo unico del sistema. Rifattatelo per leggibilità, concisione del codice e / o principi DRY (potreste aver incollato un po 'di codice per fare qualcosa cinque volte; trasformatelo in un ciclo e / o una chiamata di metodo). La terza volta che lavori all'interno o intorno a quella riga di codice,
O(my God)-complexity
se non altro, mi ha fatto ridere!