Eliminare il codice duplicato: la scelta non è meccanica

 

Scelta la duplicazione da rimuovere e i refactoring da usare capita anche che ci sono più alternative per rimuoverla e quindi bisogna   scegliere il modo di rimuovere la duplicazione 

Per fare un esempio, il metodo   void C { a(); a(); X(); a(); X(); X(); }  può essere  trasformato in
        void C { aa(); X(); a(); XX(); }
oppure in   
    void C { a(); aX(); aX(); X(); }

In questo caso nel cercare un nome per il metodo ottenuto in un modo (nel esempio un nome per aa() e XX()) e quello ottenuto nell'altro (nel esempio u nnome per aX())  scegliere quello col nome che ha più senso aiuta a fare la scelta giusta.

Un altro criterio è quello di pensare ad alcuni scenari possibili di evoluzione del programma e valutare con quale codice le cose andrebbero meglio.  Cioè con quale codice per aggiungere una nuova funzionalità è necessario cambiare meno cose, significa scegliere quella strada che meglio rispetta il principio Open/Closed o PrincipioOCP .

Riferimenti: Working Effectively with legacy code di M.C.Feathers

 

Tags :   |  |  |  |

Print | posted @ mercoledì 13 agosto 2008 19.53

Comments on this entry:

Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 13/08/2008 21.55

Se mi consenti un commento en passant, c'e' un problema di fondo: ridondanza *non* e' inutile.

Si potrebbe ovviamente approfondire.

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by Luca Minudel at 13/08/2008 23.58


E' una tesi interessante - quando può essere utile ?
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 14/08/2008 6.29

Intendo che una certa dose di ridondanza rende il codice piu' flessibile alle modifiche. Questo si potrebbe rendere matematicamente, ma vale in pratica.

Per cui ok alla rimozione della duplicazione, ma solo di quella "di troppo"...

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 14/08/2008 6.57

Per essere piu' specifico, prendo un esempio:

"Un altro criterio è quello di pensare ad alcuni scenari possibili di evoluzione del programma e valutare con quale codice le cose andrebbero meglio."

Qui la rimozione della duplicazione si e' fatta addirittura proattiva (come del resto e' nell'idea di refactoring). Ma lo scenario evolve per salti discontinui, per cui siamo di fatto all'altro capo della banda della flessibilita'.

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by Luca Minudel at 14/08/2008 9.54

puoi fare un esempio pratico di codice dove lasciare la ridondanza?
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 14/08/2008 11.14

> puoi fare un esempio pratico di codice dove lasciare la ridondanza?

Non saprei rispondere "al volo", non so neanche se una risposta, a rigore, esiste, ma se vuoi ci si puo' lavorare sopra. Il mio era in effetti giusto un invito ad investigare questo versante.

D'acchitto direi solo che non si tratta tanto di capire cosa "lasciare", quanto di non "strafare" con il clean-up fino a sfociare nel refactoring, ma non e' certo un modo soddisfacente di porre la questione, e' piuttosto un hint facilmente comprensibile dato il contesto.

Forse gia' leggermente piu' rigoroso sarebbe dire che il clean-up e' obbligatorio (codice sempre pulito e ordinato), ma nessuna "miglioria" al codice e' legittima se non viene da esigenze direttamente legate ai requisiti (analisi). (Questa e' comunque una posizione agile: ci ho messo analisi ma non disegno...)

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 14/08/2008 13.49

P.S.

Considerando anche che esistono requisiti funzionali e non-funzionali, resta comunque lo spazio per "azioni dietro le quinte", che e' un po' il senso dei requisiti non-funzionali.

Solo che esprimere il tutto esplicitamente in termini di requisiti (che si suppone esistano da qualche parte, non siamo al livello informale), pur lasciando un ampio campo d'azione, fornisce *il* controllo sui livelli di qualita'.

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by Luca Minudel at 15/08/2008 1.22

ho cercato qui requisiti senza immaginare un caso in cui convenga mantenere una duplicazione nel codice

  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 15/08/2008 13.00

L'unico "esempio" che conosco in cui si fa (abbastanza) esplicitamente questo discorso ridondanza, e' un caso studio sul mio sito:

http://julio.diegidio.name/CaseStudies/TicTacToe/Docs/TicTacToe.1.2.B.pre/TicTacToe.1.2.B.pre.htm

Comunque, sui requisiti: pensando alla lista su Wikipedia, date in anticipo le opportune avvertenze sul fatto che i requisiti sono specifici al progetto (e quindi intendo che questo concetto deve essere trasmesso prima di iniziare il gioco vero e proprio), si presta moltissimo a fare un gioco a classificare quei requisiti nelle due colonne, funzionali e non-funzionali.

Un esercizio del genere penso che aiutarebbe proprio a dare un senso a parole che prese di per se ne hanno uno e centomila.

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 15/08/2008 13.39

Per non far perdere tempo a nessuno:

La parte delle considerazioni "ingegneristiche" non parla di ridondanza e anzi e' messa nei termini a me allora noti, e puo' essere ignorata; la ridondanza e' nel codice sorgente, che si puo' scaricare. Il Controller forse e' l'esempio piu' lampante.

-LV
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by Luca Minudel at 15/08/2008 18.27

ho guardato nel sito senza trovare

in quale file/classe/metodo c'è del codice duplicato che trovi utile ?
  
Gravatar # re: Eliminare il codice duplicato: la scelta non è meccanica
by LudovicoVan at 16/08/2008 4.59

Intendo che una certa dose di ridondanza rende il codice piu' flessibile alle modifiche.

Questo si potrebbe rendere matematicamente, ma vale in pratica, e soprattutto vale a prescindere! Non c'e' un quando/quale/dove.

Comunque, dite la vostra che ho detto la mia.

-LV
  

Your comment:

Title:
Name:
Email:
Website:
 
Italic Underline Blockquote Hyperlink
 
 
Please add 2 and 7 and type the answer here: