Come rimuovere il codice duplicato (in generale)?


10

In un linguaggio OO (es. Ma non limitato a Java) come si corregge il codice duplicato a seconda dell'ambito della sua occorrenza? Vorrei iniziare con (per esempio)

  • nella stessa classe (ambito) esegue il refactoring del metodo Extract (correzione)
  • nelle classi della stessa gerarchia (ambito) esegui il metodo Extract e Pull Up (correzione)
  • ...

guarda un esempio per l'implementazione del principio DRY (non ripeterti) con la stessa classe in questo: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance

La domanda originale su SO ( stackoverflow.com/questions/7380946/… ) è stata chiusa. Quindi l'ho spostato qui.
Peter Kofler,

Risposte:


8

Recentemente ho trovato una buona risposta alla mia domanda nel "Clean Code" di zio Bob, che voglio condividere. Differenzia tre tipi di duplicazione

Pezzi di codice identico devono essere sostituiti con un solo metodo. Quindi la correzione sarebbe quella di estrarre il metodo e delegare al comportamento comune.

  • nello stesso metodo, esegui Estrai variabile locale e riutilizzala.
  • nella stessa classe esegue il refactoring del metodo Extract.
  • nelle classi della stessa gerarchia Estrai metodo e Tiralo su. Una gerarchia potrebbe essere creata per trovare un posto per i metodi.
  • nelle classi di gerarchie separate utilizzare la delega a nuovi oggetti.
  • Se i metodi non richiedono alcuno stato di inclusione, è possibile applicare il modello "lib" (ovvero un contenitore per metodi statici, generalmente chiamato SthUtilo SthLib).

casi di switch/casee if/elseche testano sempre per lo stesso insieme di condizioni .

  • Questi dovrebbero essere sostituiti con polimorfismo.

Moduli che implementano algoritmi simili . Questi sono i più difficili da trovare, poiché nessun rilevatore di cloni può trovarli.

  • Poiché lo scopo è maggiore, vengono utilizzati schemi di progettazione. Il modello di progettazione Metodo metodo potrebbe essere applicato per gli algoritmi all'interno di una gerarchia di classi.
  • Il modello di progettazione della strategia potrebbe essere applicato a qualsiasi algoritmo utilizzato in luoghi diversi.

Anche un punto valido menzionato da Oded, quando si ha a che fare con diverse versioni di librerie

  • consolidare in un'unica versione. Il modello di progettazione della facciata potrebbe aiutare qui.

Alla fine la migliore frase per rispondere alla mia domanda è da stimoli:

il metodo di riutilizzo del codice utilizzato nei linguaggi OO è oggetti.


5

In generale, consolidare il codice duplicato in un'unica posizione e assicurarsi che il sito di duplicazione originale stia chiamando la posizione consolidata.

Nei tuoi esempi, all'interno di una classe questo sarebbe il metodo estratto e all'interno di un insieme di classi il metodo pull-up all'interno della classe base.

Nel codice copia-incolla, ciò significherebbe rimuovere i duplicati e garantire che tutti gli utenti ora utilizzino la singola copia (a qualunque livello sia).

Quando si ha a che fare con versioni diverse di librerie, consolidare su un'unica versione (se possibile).


Non sarebbe il metodo "pull-down" se si trova in una classe base? Immagino sempre le classi base come fisicamente sotto le classi derivate.
Dave Nay,

Il nome proprio dal libro Refactoring è "pull up".
Peter Kofler,

1

Immagino che questa sia una domanda a risposta aperta ma dipende anche dallo stato del codice. Voglio dire che puoi tollerare un po 'il codice duplicato a seconda del contesto. La regola del tre va bene per questa faccenda.

Regola dei tre La prima volta che fai qualcosa, lo fai e basta. La seconda volta che fai qualcosa di simile, sussulti alla duplicazione, ma fai comunque la cosa duplicata. La terza volta che fai qualcosa di simile, rifletti.

Anche se questo è praticamente discutibile, questo post considera anche i casi in cui tollereresti codice duplicato.


1
+1 sulla "regola dei tre". Sono sempre stupito di quanto sia ampiamente applicabile.
Andy Mango,

1
Questo non risponde alla domanda how .
Jan Doggen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.