Refactoring: Ist es nicht nur ein schickes Wort für die Bereinigung Ihres Codes? [geschlossen]

21

Bevor Martin Fowlers Buch "Refactoring: Verbessern des Designs von vorhandenem Code" herauskam, nannten wir größere Änderungen an Code "Rearchitecture" und kleinere Änderungen "Cleanup". IMO, Refactoring-Techniken sind alles vernünftige / offensichtliche Dinge, die wir schon immer getan haben.

Glauben Sie, dass Refactoring jemals etwas Neues war? Vielleicht nur eine Möglichkeit, das Management dazu zu bringen, Zeit für die Codebereinigung zuzuweisen?

Chuck Stephanski
quelle
Wenn Sie sagen, "bevor das Buch herauskam", beziehen Sie sich vermutlich auf Martin Folwers Buch, ist das richtig?
AlexC
-1: Was ist der Nutzen dieser Frage?
Jim G.
Ja, Fowlers Buch.
Chuck Stephanski

Antworten:

43

Refactoring ist älter als die Hügel, also nein, es ist nichts Neues.

Und Refactoring räumt nicht auf. Nun, es kann sein, aber es ist nicht auf das Aufräumen beschränkt.

Es geht darum, die Architektur Ihrer Anwendung (egal ob groß oder klein) anzupassen und dabei das Verhalten zu erhalten.

Das bedeutet, dass während ein Teil Ihrer Anwendung gestern möglicherweise perfekt sauber und in Ordnung war, die heutige neue Funktion eine Anpassung dieses Teils erfordert, um die neue Funktion aufzunehmen.

Sie möchten vorhandene Funktionen nicht beeinträchtigen, also passen Sie die Struktur Ihrer Anwendung an, während Sie das Verhalten beibehalten - das Refactoring.

Unabhängig davon, welche Änderungen am Code vorgenommen werden, sollte man immer seine Tests durchführen ... nur für den Fall.

Frank Shearar
quelle
1
Newtopian: Das ist ein wichtiger Punkt. Wenn Sie Ihre Tests nicht durchgeführt haben, wissen Sie nicht, ob Sie zufällig etwas gehackt oder tatsächlich überarbeitet haben . (Und natürlich brauchen Sie eine angemessene Testsuite!)
Frank Shearar
9

Es räumt nur den Code auf. Im Wesentlichen bemerkten Programmierer (insbesondere Martin Fowler), dass sie dazu neigten, jedes Mal dieselben Aufgaben auszuführen, wenn sie ihren Code aufräumten. Sie definierten und beschrifteten die Aufräummethoden und die damit verbundenen Codeprobleme und Presto! Refactoring war geboren.

Ähnlich verhält es sich mit Entwurfsmustern - die Leute bemerkten, dass sie bei bestimmten Problemen immer wieder dieselben Ansätze verwendeten. Sie haben die Ansätze benannt und definiert, und jetzt scheinen Sie kein wirklicher Programmierer zu sein, es sei denn, Sie verwenden immer nur etwa ein Dutzend Muster in Ihrem Code.

Refactoring ist keine Magie. Es ist nur ein neuer Satz von Jargon, um eine alte Praxis zu beschreiben.

Ameise
quelle
William Opdyke, 1992: Refactoring objektorientierter Frameworks . Fowler & Beck & Friends popularisierten Refactoring. Jon Brant und Don Roberts haben das erste automatisierte Tool einige Zeit vor 1999 implementiert. Daher ist "neuer Jargon" nicht sehr genau.
Frank Shearar
Wenn Sie akzeptieren, dass seit Ada Lovelace Mitte des 19. Jahrhunderts Computerprogrammierung betrieben wird, dann ist dies eine relativ neue Fachsprache.
Ameise
1
Ich denke, der Unterschied zu Design Patterns besteht darin, dass fast jeder Entwickler aus dem Buch einige neue Muster und damit einige neue Werkzeuge des Fachs gelernt hat. Mit Refactoring habe ich nicht das Gefühl, dass jemand wirklich etwas gelernt hat. Es ist zweitrangig, einfach einen Namen für etwas zu vergeben (und der Vergleich der Entwurfsmuster hat sich dort bewährt), aber er hätte das auch mit einem Blogbeitrag tun können.
Chuck Stephanski
In der Tat erwähnte ich, dass es sich um eine neue Fachsprache handelte ... im Verhältnis zur Lambda-Rechnung.
Frank Shearar
@Chuck, hast du das Buch Refactoring gelesen? Wenn ja, wäre ich überrascht sehr , wenn man nicht gelernt hat , etwas Neues von ihm.
Marcie
7

Wir machen drei getrennte Dinge in unserem Unternehmen, mit der zugewiesenen Zeit für die drei:

  • Refactoring: besteht darin, die Codestruktur zu ändern und so das Verhalten beizubehalten.

Beispiel: Aufteilen einer hässlichen und unlesbaren 100-Zeilen-Methode, die vier Aufgaben in vier wiederverwendbare Methoden mit jeweils 25 Zeilen erledigt.

  • Bereinigung: Besteht darin, geringfügige Änderungen vorzunehmen, um den Code lesbarer zu machen, ohne dass weder sein Verhalten noch seine Struktur geändert werden.

Beispiel: Entfernen von kommentiertem Code, nachdem sichergestellt wurde, dass dieser Code nicht mehr benötigt wird.

  • Erzwingen von StyleCop / FxCop-Regeln: Besteht darin, zu überprüfen, ob der Code mit dem Standardsatz von StyleCop- oder FxCop-Regeln übereinstimmt, und ihn gegebenenfalls zu ändern, damit er diesen Regeln entspricht.

Beispiel: Hinzufügen Culture.Invariantin string.Format(oder eine andere Kultur , die besser geeignet ist).

In meinem Fall ist Refactoring also etwas ganz anderes als Aufräumen . Bei Bereinigung tun, muss ich nicht wieder Unit - Tests laufen: wenn der Code gearbeitet, es wird nach der Bereinigung arbeiten. Mit anderen Worten, es ist nicht so, dass ich eine leere Zeile entfernt oder einen Kommentar hinzugefügt habe, dass der Code nicht mehr funktioniert. Wenn ich andererseits komplizierte Teile eines alten Codes überarbeite, kann ich einige Fehler machen, so dass ich nach der Überarbeitung Komponententests durchführen muss.

Arseni Mourzenko
quelle
4
Obwohl ich zustimme, dass es einen fundamentalen Unterschied zwischen Aufräumen und Neueinteilen gibt, gibt es viele Fälle, in denen diese Linie ziemlich verwischt ist. Das Entfernen einer toten Klasse und das "Aufräumen" aller Verweise darauf aus Methodensignaturen oder verbleibenden Assoziationen würde als Bereinigen oder Umgestalten betrachtet werden? Ich bin auch nicht der Meinung, dass das Ausführen von Komponententests optional ist. Sie haben keine Ahnung, wie die Dinge brechen könnten. Ich habe Änderungen in der Nachrichtenzeichenfolge eines Ausnahmebedingungscodes festgestellt, weil jemand dachte, es sei eine gute Idee, sie zu analysieren, um auf einige Fehler zu reagieren.
Newtopian
Ich muss Newtopian zustimmen, insbesondere, dass ich keine Tests wiederholen muss. Tatsächlich sollte es eine automatisierte Testsuite geben, die mindestens einmal pro Festschreibung ausgeführt wird. Unabhängig davon, ob es sich um eine Bereinigung oder ein Refactoring handelt , sollten die Tests ausgeführt werden, wenn Sie eine Codeänderung für die Versionskontrolle vornehmen müssen.
Kojiro
Sie sollten nach jeder Bereinigung immer eine vollständige Erstellung durchführen - auch wenn es sich nur um Leerzeichen und Änderungen an Kommentaren handelt. Fragen Sie alle Python- oder Makefile-Autoren danach.
JBRWilkinson
3

Refactoring erweitert Ihren Code um Wissen. Wenn Sie wissen, dass etwas falsch benannt ist, geben Sie ihm einen besseren Namen. Wenn Sie wissen, dass etwas besser gemacht werden kann, verwandeln Sie es in etwas Besseres.

Es sind viele kleine und große Schritte, die hoffentlich zu einem besseren Programm führen.

user1249
quelle
3

Ich bin einverstanden mit "Refactoring ist ein schickes Wort für die Bereinigung Ihres Codes", aber nicht mit "nur". Menschen verwenden ausgefallene Wörter aus einem Grund: Manchmal, weil sie schlau aussehen wollen, und manchmal, weil sie eine größere oder präzisere Bedeutung vermitteln, und IMHO-Refactoring (auch wenn es gelegentlich missbraucht wird) bezieht sich im Allgemeinen auf Letzteres.

"Aufräumen" könnte alles bedeuten, von "ein bisschen neu formatieren" bis "große Teile neu schreiben".

"Refactoring" bedeutet insbesondere so etwas wie "kleine inkrementelle Änderungen am Code, die darauf abzielen, die gleiche Funktionalität beizubehalten und ihn gleichzeitig in ein besseres Design umzuwandeln". Und es gibt eine Reihe bewährter Methoden für die Art der Dinge, die Sie tun: Einige sind ad-hoc, aber es gibt allgemeine Prinzipien, wie die Verwendung von Komponententests, das Extrahieren eines Teils von Funktionen in neue Funktionen oder Klassen usw., die Menschen lernen können und sollten .

Sie sagen "Betrügen Sie die Verwaltung einfach damit, Zeit für die Code-Bereinigung zuzuweisen". Aber wenn die Aussage "Refactoring" das Konzept richtig vermittelt, dass sich eine stetige Investition in Klarheit in Zukunft für die Effizienz auszahlt, dann ist dies kein "Trick", sondern eine klare und effektive Kommunikation.

Jack V.
quelle
2

Refactoring bedeutet Code, während Normalisierung relationale Daten bedeutet. Es geht darum, Konzepte in klarere, klarere und effizientere Darstellungen ihrer Rolle in der Anwendung zu abstrahieren.

sunwukung
quelle
1
Das ist eine interessante Sichtweise. Vielleicht liegt es an meinem Datenbankhintergrund, aber es gibt etwas, das mich über den Stress beim Refactoring ärgert, und Sie haben mir dabei geholfen, meine Finger darauf zu legen. Es ist so, dass in einer Datenbank, was Sie nicht im Design reparieren, 10x länger für das Testen und wahrscheinlich 1000x länger für die Produktion dauert. Ein guter Datenbankadministrator ist es daher wichtig, die Dinge so früh wie möglich richtig zu machen. Mein Bauchgefühl ist, dass zu viel Zeit für spätere Umgestaltungen darauf hindeutet, dass zu wenig Zeit für das Entwerfen aufgewendet wurde.
user21007
@ user21007: Code ist viel komplizierter als ein Datenbankschema, aber viel einfacher zu ändern und bereitzustellen.
Kevin Cline
1

Es kommt darauf an, wie Sie den Begriff Refactoring verstehen. Für die meisten Menschen ist dies ein Prozess der Strukturverbesserung, ohne das Verhalten zu ändern. Wenn Sie damit einverstanden sind, dann haben Sie es schon lange vor Erscheinen dieses Buches getan. Ich weiß, weil ich (unter anderem) Klassen umbenannt, Klassen extrahiert und Methoden extrahiert habe, bevor das Buch geschrieben wurde. Ich nannte es nicht Refactoring, aber im Grunde tat ich genau das Gleiche.

Für mich persönlich ist Refactoring das, was heute als "automatisiertes Code-Refactoring" bezeichnet wird, dh die Unterstützung verschiedener Refactoring-Techniken in einer IDE. Dies ist eine echte Verbesserung gegenüber dem, was ich vorher gemacht habe (was in der Tat sehr schmerzhaft war). Ich kann eine Änderung in einer Klasse durchführen und mache mir keine Sorgen, wie sich dies auf den Rest der Software auswirken wird. Ich denke, Martin hat die Refactoring-Technik so weit formalisiert, dass sie als Algorithmus dargestellt und somit in verschiedenen IDEs implementiert werden kann.

Wenn Sie Refactoring also als Prozess verstehen, ist es nichts Neues. Wenn Sie es als Automatisierung ansehen, dann ist es eine enorme Verbesserung. Versuchen Sie, einige Kernklassen (buchstäblich nicht durch Refactoring-Optionen Ihrer IDE) in einem relativ großen Projekt umzubenennen, um zu sehen, warum :)

Jacek Prucia
quelle
0

Refactoring ist in der Tat eine Code-Bereinigung, aber auch eine Umstrukturierung des Codes. In meinem Team ist Refactoring in der Regel das Letztere. Wenn wir einen "Refactor" -Fall haben, nehmen wir uns Zeit, um unseren Code neu zu strukturieren, z. B. um ihn an eine neue Architektur oder ein neues Informationsmodell anzupassen oder um ihn effizienter zu gestalten.

Code "Bereinigung" ist etwas, das wir kontinuierlich ohne speziell zugewiesene Zeit dafür tun. Für mich bedeutet "Aufräumen" normalerweise Umbenennen, Entfernen von Kommentaren usw.

Mantisen
quelle
1
Das Umbenennen ist eine Standard-Refactoring-Technik!
Chuck Stephanski
0

Ich würde Nein sagen.

Möglicherweise wird der Refactoring-Prozess aufgeräumt, es ist jedoch nicht das Wesentliche.

Die Bereinigung geht von der Annahme aus, dass der vorherige Code nicht sauber ist. In der Realität überarbeiten Entwickler ihren Code, selbst wenn der ursprüngliche Code bereits sauber ist.

DRY ist ein wesentlicher Antrieb für das Refactoring.

Beim Hinzufügen neuer Codes zu einer vorhandenen Codebasis erfolgt das Refactoring natürlich aufgrund des DRY-Prinzips.

Nur meine 0.02

Oh ho
quelle
0

Das Bereinigen Ihres Codes ist wie das Aufräumen Ihres Hauses, das Umgestalten wie das Einreißen einer Mauer und möglicherweise das Aufstellen an einer anderen Stelle

Homde
quelle
0

Wenn jemand anderes Ihr Haus aufräumt, können Sie nichts finden, weil das Ziel darin besteht, die Dinge sauber und aus dem Weg zu räumen. Refactoring würde Räume, Schränke, Schränke, Regale, Mülleimer usw. bauen und etikettieren. Es enthält immer noch die meisten gleichen Dinge (Sie können immer noch ein gegrilltes Käsesandwich in der Küche machen und es im Wohnzimmer essen), sollte es aber machen leichter zu finden und möglicherweise effiziente Orte zu haben, um neue Dinge zu setzen.

JeffO
quelle
Ich bin kein Modewortfan, aber manchmal müssen allgemeine Aufgaben gekennzeichnet und formalisiert werden, damit jeder weiß, wovon Sie sprechen. Ein Client meldet einen Fehler und der Manager schreit: "Mach deinen Code sauber!" Sie wissen, dass sie nicht über Refactoring sprechen.
JeffO
0

Der Begriff Refactoring ist elegant aus der Algebra entlehnt. Es bedeutet, die Begriffe zu vereinfachen, um dasselbe Ergebnis zu erzielen. Es war nicht nur elegant, sondern auch revolutionär - es erforderte eine harte, endliche Herangehensweise an Ihren Code auf einem Niveau, das viele überraschte. Und so war der Begriff selbst bedeutsam und hilfreich.

Smandoli
quelle
-1

Refactoring verbessert die Struktur, ohne das Verhalten zu ändern. Refactoring im engeren Sinne setzt eine gute Testdisziplin voraus. Dies ist nicht unbedingt erforderlich, wenn Sie "aufräumen".

Willie Wheeler
quelle
2
gefährliche Haltung. Das Entfernen einer ganzen Reihe von totem Code und toter Konfiguration bereinigt und ändert die Signatur einer einzelnen Methode eines Refactors. In beiden Fällen würde ich mir jedoch eine gute Testdisziplin wünschen, um sicherzustellen, dass ich nichts kaputt mache.
Newtopian
Ich sage nicht, dass es gut / sicher / wünschenswert ist, größere Änderungen ohne Testdisziplin vorzunehmen. Ich sage, dass Refactoring als Methodik Testdisziplin beinhaltet, während "Aufräumen" überhaupt keine Methodik ist.
Willie Wheeler
Also, wenn ich richtig verstehe, wenn es keinen richtigen ausgefallenen Namen hat, dann können wir loslegen !! : -O nur ein Scherz, ich verstehe, was Sie zu sagen versuchen, stimmt, dass das Aufräumen kaum als eine Methode bezeichnet werden kann, aber andererseits ist auch keine Umgestaltung. Es ist nur ein schickes Wort, das besagt, dass Sie den Code ändern, ohne das Verhalten zu ändern. Es hat für sich genommen keinerlei Auswirkungen auf das Testen. Nach der guten Codierungspraxis sollte der geänderte Code unabhängig davon getestet werden, wie Sie die Aktion aufrufen, die die Änderung ausgelöst hat.
Newtopian
1
Klar, das kann ich kaufen. Bei der Testdisziplin geht es mehr darum, wie man das Refactoring durchführt, aber es ist nicht in der Definition enthalten. Ich weiß nicht, ob ich zustimmen kann, dass Refactoring keine Methode ist - es gibt ganze Bücher mit schrittweisen Mustern und so weiter.
Willie Wheeler
-1

Die beiden überlappen sich ein wenig an den Rändern, aber für mich ist es der Unterschied zwischen der Reinigung des Hauses und dem Umbau des Hauses. Bereinigung impliziert für mich keine strukturellen Änderungen, Refactoring hingegen schon.

Netzteil
quelle
-2

"Refactoring" ist eigentlich dasselbe wie "Rearchitektur", aber mit einer stärkeren Konnotation von "keine Funktionsänderungen". Dies ist auch klarer im Hinblick auf das Ziel der Neuarchitektur, bei der es häufig darum geht, allgemeinen Code in wiederverwendbare Blöcke zu "zerlegen".

DVK
quelle