Dovrei, e se sì, come faccio a imparare a favorire la progettazione in anticipo con l'astrazione sulla rimozione retrospettiva della ripetizione? [duplicare]

6

Sono spesso in una situazione in cui devo progettare e codificare un processo / algoritmo e ci sono diverse varianti su quell'algoritmo. Ad esempio, sto attualmente scrivendo un codice di sincronizzazione di database che ha metodi per il download e il caricamento. Questi metodi sono simili, ma non identici.

Dopo aver scritto il codice e averlo fatto funzionare, ora lo refactoring per rimuovere la ripetizione.

Non sono così male a scrivere classi che contengono principalmente dati, in quei casi trovo più facile all'inizio applicare la modellazione entità-relazione, suddividere i dati in classi, e posso abbastanza rapidamente vedere elementi comuni che possono essere inserito in classi base / astratte.

Ma trovo più difficile con algoritmi / processi.

Le mie domande sono: è meglio impiegare più tempo per progettarlo in anticipo, evitando così la necessità di refactoring? E, in tal caso, come fai a essere bravo a fare questo?

Trovo che quando progetto in anticipo, perché non c'è modo di testare il design, spesso divento molto tangente e non appena inizio a scrivere il codice il disegno viene scartato. Al contrario, con lo sviluppo incrementale, puoi regolarmente testare il tuo codice per assicurarti che funzioni. Ma lo svantaggio del modo in cui faccio lo sviluppo incrementale, è il tempo extra dedicato al refactoring alla fine in modo che scrivo il codice "DRY".

    
posta Paul Richards 03.08.2015 - 14:59
fonte

3 risposte

10

Per qualche ragione, progettare in anticipo ci sembra al nostro cervello come dovrebbe essere più veloce, ma raramente lo è. È molto più facile calcolare la duplicazione da due funzioni concrete già presenti nell'editor piuttosto che tralasciare la duplicazione da due funzioni effimere che non sono state ancora scritte.

Il trucco è far serrare il tuo refactor. Se stai facendo un refactoring ogni pochi minuti, è praticamente impossibile distinguere il vero design anteriore. Su algoritmi davvero complessi, potrei passare un'ora o due senza una fase di refactoring. Stai sbagliando se dici mai al tuo capo qualcosa del tipo: "Funziona, ma ho bisogno di un altro paio di giorni per il refactoring".

    
risposta data 03.08.2015 - 17:19
fonte
4

Stai praticamente indicando te stesso il problema: "... è il tempo extra impiegato per refactoring alla fine in modo che scrivo" DRY "code"

Il punto di scrivere codice incrementale e codifica sotto test è quello di ottenere il cosiddetto ciclo 'red-green-refactor':

  • Rosso: scrivi un test in errore che mostra una mancanza nel tuo codice
  • Verde: scrivi il codice per eseguire il nuovo test, insieme agli altri test esistenti, passa
  • Refactor: elimina gli odori del codice, la duplicazione, cose del genere. Durante questo, tieni i test in esecuzione e assicurati che passino

Mi sembra che tu stia facendo l'intera codifica e, solo quando hai finito, riesci a puntare il codice. Non farlo. Scrivi un pezzo ben definito del tuo codice, sottoponilo a test e inizia a rifarlo. I test che hai appena scritto ti aiuteranno e ti impediranno di rompere il codice durante il refactoring.

    
risposta data 03.08.2015 - 16:01
fonte
2

I find that when I design up-front, because there is no way to test the design, I often go way off tangent and as soon as I start writing the code the design gets discarded.

La differenza tra il tipo di progettazione up-front (a cascata) rispetto a quello incrementale è la quantità di requisiti a cui ci si avvicina. Per aiutarti a risolvere i tuoi problemi attuali, devi essere in grado di prendere un progetto (iniziare in piccolo) e costruirlo senza uscire dalla tangente. Una volta capito che il design presenta difetti, interrompi la codifica e ridisegna.

L'obiettivo non è quello di essere in grado di realizzare un design perfetto in anticipo né di essere in grado di codificare ciecamente un design imperfetto, ma di arrivare a una sorta di mezzo felice. L'estremo della tua pratica attuale sarebbe quello di creare un progetto globale, ma poi solo il codice del codice del cowboy del progetto. Quando il design non funziona, smetti di scrivere codice e fissa il design.

Alcuni dei refactoring e / o la condivisione del codice possono essere riconosciuti durante la creazione di quella seconda classe o anche più tardi. Man mano che migliorerai, non solo migliorerai la progettazione iniziale, ma anche il modo migliore per riconoscere quanto sia possibile o addirittura pratico il design in prima fila. Quando si lavora con una squadra e si presuppone che tutti siano d'accordo sul progetto attuale, ci saranno problemi se un programmatore si muove su una tangente. Non lasciare che sia tu. Fermare la squadra se necessario e riprogettare.

    
risposta data 03.08.2015 - 16:42
fonte

Leggi altre domande sui tag