Sono arrivato a credere in qualcosa di refactoring che non ho visto menzionato qui, so che ci sono già molte risposte qui, ma penso che questo sia nuovo.
Sono stato uno spietato refactorer e un strong sostenitore di DRY da prima della nascita dei termini. Principalmente è perché ho difficoltà a mantenere una grande base di codice nella mia testa e in parte perché mi piace codificare DRY e non mi piace nulla della codifica C & P, in effetti è doloroso e terribilmente lento per me.
Il fatto è che insistere su DRY mi ha dato molta pratica in alcune tecniche che raramente vedo usare dagli altri. Un sacco di persone insistono sul fatto che Java sia difficile o impossibile da rendere DRY, ma in realtà non ci provano.
Un esempio di molto tempo fa è in qualche modo simile al tuo esempio. Le persone tendono a pensare che la creazione di GUI java sia difficile. Ovviamente lo è se si codifica in questo modo:
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
Chiunque pensi che sia semplicemente folle ha assolutamente ragione, ma non è colpa di Java - il codice non dovrebbe mai essere scritto in questo modo. Queste chiamate al metodo sono funzioni destinate a essere racchiuse in altri sistemi. Se non riesci a trovare un tale sistema, costruiscilo!
Ovviamente non puoi codificare così, quindi devi fare un passo indietro e guardare il problema, che cosa sta facendo effettivamente quel codice ripetuto? Sta specificando alcune stringhe e il loro rapporto (un albero) e unendo le foglie di quell'albero alle azioni.
Quindi quello che vuoi veramente è dire:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
Una volta che hai definito la tua relazione in un modo che è succinta e descrittiva, allora scrivi un metodo per affrontarla - in questo caso fai scorrere i metodi della classe passata e costruisci un albero poi usalo per costruisci i tuoi menu e azioni e (ovviamente) visualizza un menu. Non avrai duplicazioni e il tuo metodo è riutilizzabile ... e probabilmente più facile da scrivere rispetto a un gran numero di menu sarebbe stato, e se ti piace davvero programmare, hai avuto MOLTO più divertimento. Questo non è difficile: il metodo che devi scrivere è probabilmente meno linee rispetto a creare il tuo menu a mano sarebbe!
Il fatto è che, per fare questo bene, devi praticare molto. È necessario essere bravi ad analizzare esattamente quali informazioni uniche si trovano nelle parti ripetute, estrarre tali informazioni e capire come esprimerle bene. Imparare a usare strumenti come l'analisi delle stringhe e le annotazioni aiuta molto. Imparare ad essere molto chiari sulla segnalazione degli errori e sulla documentazione è molto importante.
Prendi la pratica "libera" semplicemente codificando bene - è molto probabile che una volta che ci sarai riuscito a capire che la codifica di qualcosa ASCIUTTO (incluso scrivere uno strumento riutilizzabile) è più veloce della copia e dell'incollatura e di tutti gli errori , errori duplicati e modifiche difficili che il tipo di codifica causa.
Non penso che sarei in grado di godermi il mio lavoro se non avessi esercitato le tecniche di DRY e costruito gli strumenti il più possibile. Se dovessi prendere un taglio in pagamento per non dover fare programmi di copia e incolla, lo prenderei.
Quindi i miei punti sono:
- Copia e amp; Incolla costa più tempo a meno che tu non sappia come rifattorizzare bene.
- Impari bene a fare il refactoring - insistendo su DRY anche nei casi più difficili e banali.
- Sei un programmatore, se hai bisogno di un piccolo strumento per rendere il tuo codice ASCIUTTO, costruiscilo.