Refactoring/Funktionalität extrahieren



  • Hi,

    ein Problem, das mir relativ häufig über den Weg läuft, ist folgendes:

    Ich brauche Teile der Funktionalität einer viel zu langen Methode und weiß nicht, wie ich ohne hacks oder Code-Wiederholung da rankomme.
    Das könnte z.B. so was sein wie eine Methode, die über ein GUI-Event auf einen Button-Click reagiert und Projektdaten speichert, dabei weitere Dialoge wie "Wollen sie existierendes Zeugs überschreiben ja/nein" oder "Sie haben noch ungespeicherten Krempel, verwerfen? Ja/nein" anzeigt.
    Dann will ich die Funktion so aufrufen, dass prinzipiell alles gespeichert und überschrieben wird, ohne diese Dialoge anzuzeigen. Nun hab ich aber das Problem, dass ich vereinzelte Code-Schnipsel oder if-Abfragen aus dem Code entfernen müsste.
    Zeitlich verhältnismäßig schnell zu lösen ist es durch die Einführung einer weiteren Methode, die diese überflüssigen Schnipsel eben nicht enthält, aber eben doppelten Code einführt.
    Möglich wären dann noch so hacks wie ein flag als Parameter einzuführen und nicht benötigte Teile in ifdef/else-Manier zu umschiffen. Der sauberste Weg wäre sicherlich, alle Teile der Methode in separate Helper-Funktionen auszulagern und in einer neuen Methode jeweils die nun gut separierten Funktionalitäten ohne Zusatzdialoge zusammenzustellen.
    Ist aber entsprechend viel Arbeit, weil man die Methode fast komplett neu schreiben muss, und auch mit ner gewissen Gefahr verbunden, dass man in existierenden Code evtl. Bugs einführt.

    Gibts da irgendwas, vielleicht in Richtung Design-Patterns, das weniger fehleranfällig, aber auch halbwegs elegant ist?



  • Wenn Du diese eine viel zu lange Methode schon hast, dann ist der Fehler doch gelaufen. Ansonsten würde sich Deine Arbeit auf das abstrahieren einer kleinen, schon vorhanden Methode beschränken, die du per Default-Parameter darauf anpasst, dass sie sich für den alten Code exakt gleich verhält.
    Fehler immer an der Quelle beseitigen!

    Das unbelassen gibt es Tools wie Visual Assist X oder das was Eclipse mitbringt, die Refactoring-Tools enthalten, welche einigermaßen funktionieren.



  • Und vermutlich wird demnächst eine Fülle solcher Tools erscheinen, sobald Clang weiter Verbreitung findet und auf allen Plattformen gut angepasst ist... Mit Eclipse meinte ich natürlich Eclipse CDT.



  • Nun ja, in der Arbeitswelt läuft das halt leicht anders. Da haben Methoden 500 LOC und mehr, weil irgendjemand die gerade benötigte Funktionalität für ne Deadline hingerotzt hat, und wenn ich jetzt derjenige bin, der sämtliche Methoden für ne eigentliche Kleinigkeit refactored und ordentlich designed, dann brauche ich ebenfalls 10x so lange wie nötig und gefährde damit auch meine Abgabefristen.
    Längerfristig wäre es so natürlich die beste Lösung, aber solange die Projektleiter nicht mehr Zeit für solche Refactorings einplanen, lässt sich da wohl nichts machen, und es wird munter weitergehackt und verunstaltet, bis man irgendwann vor dem totalen Chaos steht. 👍



  • 👍



  • nabshee schrieb:

    Ist aber entsprechend viel Arbeit, weil man die Methode fast komplett neu schreiben muss, und auch mit ner gewissen Gefahr verbunden, dass man in existierenden Code evtl. Bugs einführt.

    => Unit Tests



  • Die kompletten Unit Tests für ne 500 LOC Methode zu schreiben dauert ungefähr 1 Woche



  • klar schrieb:

    Die kompletten Unit Tests für ne 500 LOC Methode zu schreiben dauert ungefähr 1 Woche

    Ob man da was mit Templates machen kann?



  • volkard schrieb:

    klar schrieb:

    Die kompletten Unit Tests für ne 500 LOC Methode zu schreiben dauert ungefähr 1 Woche

    Ob man da was mit Templates machen kann?

    In Haskell ginge das mit QuickCheck.


Anmelden zum Antworten