Ich weiß, dass Refactoring "die Struktur eines Programms so ändert, dass die Funktionalität nicht geändert wird". Ich habe mit einigen der Leute gesprochen, mit denen ich an meinem Abschlussprojekt an der Universität zusammenarbeite, und ich war überrascht, dass sie eine viel expansivere (aus Mangel an einem besseren Wort) Sicht auf Refactoring haben.
Ich betrachte Refactoring als Dinge wie das Extrahieren von Methoden und das Umbenennen von Klassen. Sie schlugen auch Dinge wie das Ändern von Datenstrukturen (wie Java LinkedList
in ein ArrayList
), das Ändern von Algorithmen (Verwenden der Zusammenführungssortierung anstelle der Blasensortierung) und sogar das Umschreiben großer Codestücke als Refactoring vor.
Ich war mir ziemlich sicher, dass sie falsch lagen, aber ich konnte keinen guten Grund angeben, warum, weil das, was sie vorschlugen, das Programm geändert (und vermutlich verbessert) hat, ohne sein Verhalten zu ändern. Habe ich recht und was noch wichtiger ist, warum?
quelle
Fowler zieht eine klare Linie zwischen Änderungen am Code, die sich auf das Verhalten auswirken, und solchen, die sich nicht auf das Verhalten auswirken. Er nennt diejenigen, die dies nicht tun, "Refactoring". Dies ist eine wichtige Unterscheidung, denn wenn wir unsere Arbeit in Refactoring- und Nicht-Refactoring-Code-Modifikationsaktivitäten unterteilen (Fowler nennt es "verschiedene Hüte tragen"), können wir verschiedene, zielgerichtete Techniken anwenden.
Wenn wir ein Refactoring oder eine verhaltenserhaltende Codeänderung vornehmen:
Wenn wir eine verhaltensverändernde Codeänderung vornehmen:
Wenn wir diese Unterscheidung aus den Augen verlieren, sind unsere Erwartungen für eine bestimmte Code-Änderungsaufgabe durcheinander und komplex oder jedenfalls verwirrter und komplexer, als wenn wir uns dessen bewusst sind. Deshalb sind das Wort und seine Bedeutung wichtig.
quelle
Um meine Ansicht zu geben:
Kleine, inkrementelle Änderungen, die den Code in einem besseren Zustand belassen, als er gefunden wurde
Auf jeden Fall Ja: "Kosmetische" Änderungen, die nicht direkt mit Funktionen zusammenhängen (dh sie können nicht als Änderungsanforderung abgerechnet werden).
Auf jeden Fall Nein: Das Umschreiben großer Teile verstößt eindeutig gegen den "kleinen, inkrementellen" Teil. Refactoring wird oft als das Gegenteil eines Umschreibens verwendet: Anstatt es erneut zu tun, verbessern Sie das vorhandene.
Auf jeden Fall vielleicht: Das Ersetzen von Datenstrukturen und Algorithmen ist ein Grenzfall. Der entscheidende Unterschied hier IMO sind die kleinen Schritte: Seien Sie bereit zu liefern, seien Sie bereit, an einem anderen Fall zu arbeiten.
Beispiel: Stellen Sie sich vor, Sie haben ein Report Randomizer-Modul, das durch die Verwendung eines Vektors verlangsamt wird. Sie haben profiliert, dass Vektoreinfügungen der Engpass sind, aber leider ist das Modul an vielen Stellen auf zusammenhängenden Speicher angewiesen, sodass bei Verwendung einer Liste die Dinge stillschweigend kaputt gehen.
Das Umschreiben würde bedeuten, dass das Modul ein besseres und schnelleres Gebäude von Grund auf weggeworfen wird, indem nur einige Teile aus dem alten ausgewählt werden. Oder schreiben Sie einen neuen Kern und fügen Sie ihn dann in den vorhandenen Dialog ein.
Refactoring würde bedeuten, kleine Schritte zu unternehmen, um die Zeigerarithmetik zu entfernen, so dass der Schalter. Vielleicht erstellen Sie sogar eine Dienstprogrammfunktion, die die Zeigerarithmetik umschließt, die direkte Zeigermanipulation durch Aufrufe dieser Funktion ersetzt und dann zu einem Iterator wechselt, sodass sich der Compiler über Stellen beschwert, an denen die Zeigerarithmetik noch verwendet wird, und dann zu a
list
wechselt und dann die entfernt Ultilitätsfunktion.Die Idee dahinter ist, dass Code von selbst schlechter wird. Wenn Sie Fehler beheben und Funktionen hinzufügen, nimmt die Qualität in kleinen Schritten ab - die Bedeutung einer Variablen ändert sich geringfügig, eine Funktion erhält einen zusätzlichen Parameter, der die Isolation aufhebt, eine Schleife wird etwas zu komplex usw. Keiner dieser Fehler ist ein echter Fehler Geben Sie keine Zeilenanzahl an, die die Schleife zu komplex macht, aber Sie beeinträchtigen die Lesbarkeit und Wartung.
Ebenso sind das Ändern eines Variablennamens oder das Extrahieren einer Funktion keine konkreten Verbesserungen für sich. Aber insgesamt bekämpfen sie die langsame Erosion.
Wie eine Kieselwand, an der man jeden Tag zu Boden fällt. Und jeden Tag nimmt ein Passant es auf und legt es zurück.
quelle
In Anbetracht der Definition von Martin Fowler
... Ich denke du hast eindeutig recht.
Das Ändern eines Algorithmus auf etwas viel schnelleres ist offensichtlich kein Refactoring, da sich das externe Verhalten ändert! (Andererseits, wenn der Effekt nie spürbar ist, könnte man es vielleicht doch Refactoring nennen - und auch vorzeitige Optimierung. :-)
Dies ist ein Liebling von mir; Es ist ärgerlich, wenn Leute den Begriff schlampig verwenden - ich bin sogar auf einige gestoßen, die gelegentlich Refactoring für grundsätzlich jede Art von Änderung oder Korrektur verwenden. Ja, es ist ein hippes und cooles Schlagwort und alles, aber es ist nichts Falsches an einfachen alten Begriffen wie Ändern , Umschreiben oder Leistungsverbesserung . Wir sollten diese gegebenenfalls verwenden und Refactoring für Fälle reservieren, in denen Sie wirklich nur die interne Struktur Ihrer Software verbessern. Insbesondere in einem Entwicklungsteam ist es wichtig , eine gemeinsame Sprache für die genaue Diskussion Ihrer Arbeit zu haben.
quelle
Wenn sich die Schnittstelle zu einem Teil des Codes ändert, halte ich das für mehr als Refactoring.
Der typische Fall für Refactoring ist
Dies bedeutet, dass sich der Begriff Refactoring auf die von Ihnen diskutierte Schnittstelle bezieht. Das heißt, Sie könnten den Code hinter einer Schnittstelle umgestalten, während Sie den Code einer anderen Schnittstelle auf einer niedrigeren Ebene ausführlicher ändern (möglicherweise sorgt diese Unterscheidung für die Verwirrung zwischen Ihnen und Ihren Kollegen hier?).
quelle
Ich denke, Sie haben Recht, aber über die Bedeutung eines Wortes zu streiten ist nicht besonders interessant oder produktiv.
quelle
http://en.wikipedia.org/wiki/Code_refactoring
Ich bin damit einverstanden, dass das Refactoring von Code das Brechen von vorhandenem Code beinhaltet. Stellen Sie einfach sicher, dass Sie Unit-Tests haben, damit Sie keine Fehler einführen und der Rest des Codes kompiliert wird. Die Verwendung von Refactoring-Tools wie Resharper für C # macht dies so einfach!
quelle
Ich bin anderer Meinung :
Sie kennen bereits die genaueren Begriffe, die für Teilmengen des Refactorings verwendet werden, und ja, es ist ein sehr allgemeiner Begriff.
quelle
Ich denke, dass niemand von einer zu starken Definition des Begriffs „Refactoring“ profitieren kann. Die Grenze zwischen Ihrer Wahrnehmung und Ihren Kollegen ist verschwommen und kann abhängig von vielen Fakten näher an ihrer oder Ihrer Ansicht liegen. Da es dynamisch ist, versuchen wir es zu definieren. Definieren Sie zunächst die Grenzen des Systems oder Subsystems, das Sie umgestalten möchten.
Wenn es sich um eine Methode handelt, behalten Sie den Namen, die Eingabeargumente, den Typ des zurückgegebenen Werts und möglicherweise die auslösenden Anweisungen bei. Wenden Sie alle Änderungen innerhalb der Methode an, ohne zu ändern, wie sie außerhalb angezeigt wird.
Wenn Sie eine Klasse umgestalten, ihre öffentliche API korrigieren und Umbenennungsvariablen verwenden, ändern Extraktionsmethoden und alle anderen verfügbaren Techniken die Klasse so, dass sie lesbarer und / oder leistungsfähiger ist.
Wenn der Teil des Codes, den Sie umgestalten, ein Paket oder ein Modul ist, führen Sie das darin enthaltene Refactoring möglicherweise um, indem Sie Klassen umbenennen, löschen, Schnittstellen einführen, Code in Super- / Unterklassen verschieben / ziehen.
quelle
Refactoring = Verbesserung der nicht funktionalen Anforderungen unter Beibehaltung der funktionalen Anforderungen.
Nicht funktionale Anforderungen = Modularität, Testbarkeit, Wartbarkeit, Lesbarkeit, Trennung von Bedenken, Liskov-Prinzipien und so weiter ...
quelle