Ich bin zu der Überzeugung gelangt, dass etwas über das Refactoring hier nicht erwähnt wurde. Ich weiß, dass es hier bereits viele Antworten gibt, aber ich denke, das ist neu.
Ich bin seit jeher ein skrupelloser Umgestalter und ein starker Anhänger von DRY. Meistens liegt es daran, dass ich Probleme habe, eine große Codebasis in meinem Kopf zu behalten, und teilweise daran, dass mir DRY-Codierung und C & P-Codierung nichts Spaß machen. Tatsächlich ist es für mich schmerzhaft und furchtbar langsam.
Die Sache ist, auf DRY zu bestehen, hat mir viel Übung in einigen Techniken gegeben, die ich selten bei anderen sehe. Viele Leute bestehen darauf, dass es schwierig oder unmöglich ist, Java zu DRY zu machen, aber sie versuchen es einfach nicht.
Ein Beispiel von vor langer Zeit, das Ihrem Beispiel etwas ähnlich ist. Die Leute neigen dazu zu denken, dass die Erstellung einer Java-GUI schwierig ist. Natürlich ist es so, wenn Sie wie folgt codieren:
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)
Jeder, der das für verrückt hält, hat absolut Recht, aber es ist nicht Javas Schuld - Code sollte niemals so geschrieben werden. Diese Methodenaufrufe sind Funktionen, die in andere Systeme eingebunden werden sollen. Wenn Sie ein solches System nicht finden können, bauen Sie es!
Offensichtlich können Sie so keinen Code erstellen, also müssen Sie einen Schritt zurücktreten und sich das Problem ansehen. Was macht dieser wiederholte Code tatsächlich? Es spezifiziert einige Zeichenketten und ihre Beziehung (einen Baum) und verbindet die Blätter dieses Baums zu Aktionen. Also, was Sie wirklich wollen, ist zu sagen:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
Sobald Sie Ihre Beziehung auf eine Art und Weise definiert haben, die prägnant und beschreibend ist, schreiben Sie eine Methode, um damit umzugehen. In diesem Fall durchlaufen Sie die Methoden der übergebenen Klasse und erstellen einen Baum. Verwenden Sie dann diese Methode, um Ihre Menüs zu erstellen und Aktionen sowie (offensichtlich) ein Menü anzeigen. Sie werden keine Duplikate haben und Ihre Methode ist wiederverwendbar ... und wahrscheinlich einfacher zu schreiben, als es eine große Anzahl von Menüs gewesen wäre, und wenn Sie tatsächlich Spaß am Programmieren haben, hatten Sie viel mehr Spaß. Das ist nicht schwer - die Methode, die Sie schreiben müssen, besteht wahrscheinlich aus weniger Zeilen als das Erstellen Ihres Menüs von Hand!
Um dies gut zu machen, muss man viel üben. Sie müssen genau analysieren können, welche eindeutigen Informationen in den wiederholten Abschnitten enthalten sind, diese Informationen extrahieren und herausfinden, wie Sie sie gut ausdrücken können. Das Erlernen der Verwendung von Tools wie Zeichenfolgenanalyse und Anmerkungen ist sehr hilfreich. Es ist auch sehr wichtig, zu lernen, wie man Fehlerberichte und -dokumentationen wirklich klar macht.
Sie erhalten "freies" Üben, indem Sie einfach gut codieren - wenn Sie erst einmal gut darin sind, werden Sie feststellen, dass das Codieren von DRY (einschließlich des Schreibens eines wiederverwendbaren Tools) schneller ist als das Kopieren und Einfügen und alle Fehler, duplizierten Fehler und schwierige Änderungen, die diese Art der Codierung verursacht.
Ich glaube nicht, dass ich meine Arbeit genießen könnte, wenn ich nicht so viel DRY-Techniken und Werkzeuge üben würde, wie ich könnte. Wenn ich eine Lohnkürzung vornehmen müsste, um keine Programme kopieren und einfügen zu müssen, würde ich das übernehmen.
Also meine Punkte sind:
- Kopieren und Einfügen kostet mehr Zeit, es sei denn, Sie wissen nicht, wie Sie gut umgestalten können.
- Sie lernen, gut umzugestalten, indem Sie auf DRY bestehen, selbst in den schwierigsten und trivialsten Fällen.
- Sie sind ein Programmierer. Wenn Sie ein kleines Tool benötigen, um Ihren Code DRY zu machen, erstellen Sie es.
always
undnever
als rote Fahnen. Es gibt eine Sache namens "Kontext", in der diealways
undnever
-Regeln, auch wenn sie im Allgemeinen gut sind, möglicherweise nicht so angemessen sind. Hüten Sie sich vor Software-Entwicklern, die absolut handeln. ;)