Facebook
Twitter
Google+
Kommentare
9

Refactoring, Refaktorisierung und Refaktorierung

Wir haben Mittwoch und ich habe diese Woche noch nichts dazugelernt. Ich glaube meine Theorie vom Montag war also nicht ganz so richtig. Aber wie Cem schon gesagt hat, man sollte sich seine Fehler eingestehen, was ich hiermit gemacht habe. Ich glaube zwar nicht, dass sich jemand von euch an meine Aussage erinnert, ich mache es aber trotzdem. Wenn ich Smileys nicht so hassen würde, würde ich hier ein zwinkerndes hinmachen.

So schon fast einen ganzen Artikel geschrieben und noch nichts gesagt, scheint wohl meine Spezialität zu sein. Genug geschwafelt, fangen wir an, denn heute möchte ich ein paar Sätze zum Thema Refactoring verlieren. Es ist ein Buzzword, das man in letzter Zeit immer wieder hört. Und das zurecht! Aber worum geht es dabei eigentlich? Ich versuche mich mal in der Definition. Halb aus der Erinnerung, halb aus meinem Verständnis  heraus.

Refactoring ist die Verbesserung der Codequalität ohne dabei die Funktionalität zu verändern.

Bitte zitiert mich aber nicht, das ist wirklich nur meine Definition. Eigentlich geht es ja nur darum, dass man sich ein Stück Code nimmt und dieses so umschreibt, dass es schneller, besser oder einfach nur aktueller ist, ohne dabei das Verhalten nach außen zu zu verändern.

Wer jetzt denkt: „Wow! Refactoring rockt, dass muss ich gleich ausprobieren“, der sei gewarnt. Um seinen Code mit gutem Gewissen umzuschreiben, dem seit eine hohe Testabdeckung mit Unit Tests ans Herz gelegt. Aber ihr kennt das wahrscheinlich selbst, ihr habt eine Methode und ihr wisst nicht ganz genau, wie sie funktioniert, wollt sie aber umschreiben. Ihr habt also keine Ahnung, ob es irgendwelche Seiteneffekte gibt. Jetzt wäre es natürlich toll, wenn ihr die möglichen Anwendungsfälle über Tests bereits prüft. Ansonsten ist es wirklich ein Glücksspiel. In den meisten Projekten wird es diese Abdeckung leider nicht geben, deswegen gibt es da ein paar andere Tricks, die man beherzigen kann. Auf diese will ich aber heute noch nicht eingehen. Kommt aber in der nächsten Zeit.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

9 Comments

  1. Ich bin zwar kein Freund von refactoring, da meine Erfahrungen mich gelehrt haben, dass sich dabei doch zu leicht Fehler einnisten, wobei einem Unit Testst leider auch nicht immer behilflich sind. Wer die Patterns dazu noch nicht kennt der kann sich auch hier mal umschauen: http://www.refactoring.com/catalog/

    Reply
  2. Aber ohne Refactoring wird der Code doch immer unwartbarer und irgendwann muss man es dann doch anfassen. Also führt eigentlich kaum ein Weg ums Refactoring herum, wenn man sein Projekt lange warten muss.

    Reply
  3. Da hast du natürlich recht, da führt über lange Sicht kein Weg dran vorbei. Ich habe ja nicht gesagt das es sich vermeiden lässt, sondern nur das ich kein Freund davon bin 😉

    Reply
  4. Ich denke Refactoring betreibt am effektivsten laufend nebenher, immer mit dem Ziel den Code etwas besser zu committen als man ihn ausgecheckt hat. Die Kunst dabei ist es wirklich effektive Verbesserungen zu erzielen und nicht nur nach Lust und Laune Code hin und herzuschieben.

    Reply
  5. Die PHP IDEs, die zur Zeit auf dem Markt sind, machen es einen aber leider auch nicht so einfach. Wenn ich mir Eclipse für Java anschaue, dann hinken wir da wirklich 5 Jahre hinterher. Schade eigentlich.

    Reply
  6. Refactoring steht bei mir auch ganz weit im Vordergrund, besonders wenn man ein Projekt über eine längere Zeit wartet und entwickelt, da man sich schließlich immer weiterbildet und so sich sehr oft wundert, was man denn für einen eigenartigen Code prodzuiert hat.
    Jedoch ist mir Unit Testing ein neuer Begriff. Ich hab ihn schon hier und da aufgeschnappt, doch selbst nie aktiv Unittesting betrieben.
    Wie sieht das denn bei Refactoring aus?
    Steckt da mehr als Benchmarking dahinter, sofern dies auch ein Teil davon ist?

    Reply
  7. Unit-Tests im urspründlichen Sinne sollen Funktionen testen. Dazu rufst du beispielsweise eine Funktion einer Klasse auf, und vergleichst dessen Rückgabewert mit einem vorher definierten Erwartungswert.
    Für solche Tests gibt es Frameworks, und du schreibst dann für alle möglichen und unmöglichen Parameter solche Tests, sodass du die Logik innerhalb der Funktion überprüft hast. Idealerweise erreichst du dabei eine Pfadabdeckung von 100% (was aber schwer ist für große Projekte).

    Wenn du dann später den Inhalt der Funktion umschreibst/verbesserst/refactorst, sollten alle Tests immernoch funktionieren wie vorher, ansonsten hast du das Verhalten der Funktion verändert (und wahrscheinlich einen Bug eingebaut).

    Man könnte natürlich nach dem ändern einer Funktion alle Funktionen der Software manuell prüfen, d.h. im Falle einer Webseite mal Formularfelder leerlassen, ungültige Werte eintragen usw. Da es dabei aber schnell hunderte oder tausende Testfälle gibt, möchte man sie nicht nach jeder Änderung manuell machen, was häufig Stunden oder Tage dauern würde. Wenn man Unit-Tests hat, lässt man sie schnell durchlaufen, und hat nach wenigen Minuten Gewissheit, dass alles noch so funktioniert wie es soll.

    Heutzutage kann man Unit-Tests aber für viel mehr nutzen, beispielsweise auch „einen Browser simulieren“ und den generierten HTML-Code untersuchen, ob darin bestimmte Worte etc drin vorkommen.

    Es gibt noch viele weitere Tools, um seinen Code zu testen und zu verbessern. Hier im Blog gibt es sehr viele Texte dazu, beispielsweise wie man kopierte oder doppelt vorkommende Zeilen suchen kann, nicht initialisierte Variablen entdecken kann usw.

    Einfach mal die letzten 2-3 Monate durchblättern. Auch Google wird dir reichlich Lesestoff bieten können. Ein guter Anfangspunkt ist immer die Dokumentation von PhpUnit.

    Reply
  8. @Nils Langner ITA mit der IDE wenn ich da so an den Intelli J für Java denke *Trübsal blas*. Kann sich nicht mal einer hinsetzen und ne geile IDE für PHP entwickeln. Da kann man bestimmt noch richtig Geld machen, frei nach dem Leitspruch „use the best IDE money can buy“. Aber ich will jetzt keine Diskussion starten.

    Reply
  9. Ich kann nur PhpStorm empfehlen. Da kann auch Zend Studio nicht mithalten. Bei der Arbeit mit dieser IDE merkt sofort, dass sich die Entwickler wirklich gedanken gemacht haben. Viele tausend Kleinigkeiten, die dann zusammengenommen spürbar die Effizienz steigern. Also ich möchte keine sndere IDE mehr haben.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen