• Refactoring, Refaktorisierung und Refaktorierung

    von am 20. Mai 2009

    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.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    8 Kommentare »


    • D.Liebmann
      am 20. Mai 2009 um 09:36 Uhr

      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/


    • Nils Langner
      am 20. Mai 2009 um 09:39 Uhr

      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.


    • D.Liebmann
      am 20. Mai 2009 um 10:35 Uhr

      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 ;-)


    • Marko Gräßlin
      am 20. Mai 2009 um 10:39 Uhr

      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.


    • Nils Langner
      am 20. Mai 2009 um 12:33 Uhr

      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.


    • PHPDave / David Olah
      am 20. Mai 2009 um 14:35 Uhr

      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?


    • Michael
      am 20. Mai 2009 um 16:02 Uhr

      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.


    • TomLo3e
      am 19. Mai 2010 um 13:30 Uhr

      @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.

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.