Come rimuovere il codice duplicato (in generale)?

10

In un linguaggio OO (ad esempio, ma non limitato a Java) come si risolve il codice duplicato a seconda dell'ambito del suo verificarsi? Vorrei iniziare con (per esempio)

  • nella stessa classe (scope) eseguono il refactoring del metodo Extract (fix)
  • in classi della stessa gerarchia (scope) eseguono Extract Method e Pull Up (fix)
  • ...
posta Peter Kofler 11.09.2011 - 23:00
fonte

3 risposte

6

Recentemente ho trovato una buona risposta alla mia domanda nel "Codice pulito" di Uncle Bob, che voglio condividere. Distingue tre tipi di duplicazione

Pezzi di codice identico dovrebbero essere sostituiti con un singolo metodo. Quindi la soluzione sarebbe estrarre il metodo e delegare al comportamento comune.

  • nello stesso metodo, eseguire Estrai la variabile locale e riutilizzarla.
  • nella stessa classe eseguono il refactoring del metodo Extract.
  • in classi della stessa gerarchia Extract Method e Pull it Up. È possibile creare una gerarchia per trovare un posto per i metodi.
  • in classi di gerarchie separate usano la delega a nuovi oggetti.
  • Se i metodi non necessitano di uno stato di inclusione, allora potrebbe essere applicato il modello "lib" (cioè un contenitore per i metodi statici, solitamente chiamato SthUtil o SthLib ).

casi di switch/case e if/else che verificano sempre lo stesso insieme di condizioni .

  • Questi dovrebbero essere sostituiti con il polimorfismo.

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

  • Poiché lo scope è più ampio, vengono utilizzati i pattern di progettazione. È possibile applicare il modello di progettazione modello di metodo 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 tratta di diverse versioni di librerie

  • consolidare su una singola versione. Il modello di progettazione delle facciate potrebbe aiutarti qui.

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

code reuse method used in OO languages is objects.

    
risposta data 05.02.2012 - 19:49
fonte
5

In generale, consolida il codice duplicato in un unico luogo e assicurati che il sito di duplicazione originale chiami il luogo consolidato.

Nei tuoi esempi, all'interno di una classe questo sarebbe il metodo estratto e all'interno di un set di classi il metodo tirato su all'interno della classe base.

Nel codice copia-incolla, ciò equivale a rimuovere i duplicati e ad assicurare che ogni utente ora usi la copia singola (in qualunque livello si tratti).

Quando si gestiscono versioni diverse di librerie, consolidare su una singola versione (se possibile).

    
risposta data 11.09.2011 - 23:03
fonte
1

Immagino che questa sia una domanda aperta ma dipende anche dallo stato del codice. Voglio dire, puoi tollerare un po 'il codice duplicato a seconda del contesto. La regola del terzo è un bene per questa materia.

Regola dei tre La prima volta che fai qualcosa, lo fai e basta. La seconda volta che lo fai qualcosa di simile, sussulti la duplicazione, ma tu fai il duplicato cosa comunque La terza volta che fai qualcosa di simile, ti rifatti.

Sebbene questo sia praticamente discutibile, questo post considera anche i casi in cui si tollererebbe codice duplicato .

    
risposta data 15.04.2017 - 00:07
fonte

Leggi altre domande sui tag