www.wikidata.de-de.nina.az
Refactoring auch Refaktorisierung Refaktorierung oder Restrukturierung bezeichnet in der Software Entwicklung die manuelle oder automatisierte Strukturverbesserung von Quelltexten unter Beibehaltung des beobachtbaren Programmverhaltens Dabei sollen Lesbarkeit Verstandlichkeit Wartbarkeit und Erweiterbarkeit verbessert werden mit dem Ziel den jeweiligen Aufwand fur Fehleranalyse und funktionale Erweiterungen deutlich zu senken Refactoring ist ein zentraler Bestandteil der Agilen Softwareentwicklung Dort wird meist von kontinuierlichem Refactoring 1 oder kompromisslosem Refactoring 2 gesprochen Refactoring ist in der agilen Softwareentwicklung wie Kodieren oder Modultesten ein integraler Bestandteil des Softwareentwicklungsprozesses und nicht auf bestimmte Zeiten bzw Phasen beschrankt Inhaltsverzeichnis 1 Begriffsherkunft 2 Vorgehensweise 3 Vorteile und Nachteile 4 Risiken und deren Handhabung 5 Beispiel 6 Literatur 7 Weblinks 8 EinzelnachweiseBegriffsherkunft BearbeitenDer Begriff wurde zum ersten Mal in einer Arbeit von Ralph Johnson und William Opdyke 1990 gebraucht Refactoring An aid in designing application frameworks and evolving object oriented systems In Proceedings of Symposion on Object Oriented Programming Emphasizing Practical Applications SOOPPA September 1990 Opdyke promovierte 1992 zu dem Thema Sie entwickelten die Idee einer Software Refactory die das Umgestalten eben das Refactoring von Computerprogrammen erleichtern sollte Die unzutreffende Ubersetzung Refaktorisierung stammt aus einer Verwechslung mit einer haufig zitierten Analogie die ursprunglich nicht Begriffsinhalt war Refactoring ist eine Art ein Programm so zu modifizieren dass verborgene Strukturen offengelegt werden ohne die Funktionalitat zu andern Dies so der falschliche Analogieschluss entspreche dem Vorgehen der Faktorisierung von Polynomen in der Mathematik Vorgehensweise BearbeitenRefactoring wird hauptsachlich auf unschone Stellen im Code siehe Code Smell angewandt Dabei wird der Quelltext eines Computerprogramms umgestaltet wobei die tatsachliche Programmfunktion unverandert bleiben soll Die Umgestaltung des Quelltextes erfolgt meist nach folgenden Gesichtspunkten Lesbarkeit Ubersichtlichkeit Verstandlichkeit Erweiterbarkeit Vermeidung von Redundanz TestbarkeitDie Gesichtspunkte des Refactorings hangen eng mit den daraus resultierenden Vorteilen zusammen Das Refactoring hat ein Analogon in der Mathematik in einer Vorgehensweise die als algebraische Umformung bezeichnet wird bei der das Ziel der Umformung ebenfalls eine bessere Lesbarkeit Verstandlichkeit und gegebenenfalls Erweiterbarkeit des Gleichungssystems ist Aus diesem Grunde sind funktionale Sprachen Lisp Haskell OCaml Erlang und so weiter wesentlich besser geeignet ein Refactoring durchzufuhren da sie auf einem mathematischen Paradigma der Programmierung basieren Das Refactoring wird erleichtert und unterstutzt durch Unit Tests die als Regressionstests belegen konnen dass sich das Verhalten des Programmes unter gleichen Bedingungen nicht geandert hat und durch das Refactoring nicht versehentlich Fehler eingefuhrt wurden Werkzeuge insbesondere integrierte Entwicklungsumgebungen die eine Unterstutzung bei der Durchfuhrung von Refactorings anbieten funktionale Programmiersprachen unter anderem weil man Code bei funktionalen Sprachen mit mathematischen Methoden auf Korrektheit prufen kann eine Programmiersprache mit einem strengen Typsystem z B bei der Programmiersprache OCaml welches schon im Vorfeld zur Compile Time viele Fehler ausschliesst weil es dafur sorgt dass die Signatur Interface dieselbe bleibt auch wenn die Struktur Implementierung sich andert Dies erspart viele Unit Tests schon im Vorfeld da es viele Fehlerquellen ausschliesst Mogliche Refactorings Folgende Massnahmen oder Arbeiten werden beim Refactoring besonders haufig durchgefuhrt Anderung eines Symbolnamens z B das Vergeben von sprechenden Namen fur Variablen Konstanten Methoden etc Verschieben eines Symbols in ein anderes Modul z B eine Methode in eine andere Klasse Aufteilung eines Moduls z B Paket Klasse Methode in mehrere kleinere Module oder Zusammenlegung kleinerer Module zu einem grosseren Im weitesten Sinne auch die Umformatierung eines Quelltextes z B mit einem Beautifier Bei geanderten Geschaftsprozessen bei Darstellung mittels der Unified Modeling Language UML kann mittels Refactoring der Programmcode geandert werden Dadurch wird eine robuste und stabile Systemarchitektur geschaffen da unubersichtliche Anderungen nicht im Code initiiert werden mussen Anwenden von Funktionen hoherer Ordnung in funktionalen Programmiersprachen Auslagern refactor n der gemeinsamen abstrakten Logik mehrerer Module in Funktoren Funktoren sind parametrisierte Module die Module als Parameter erhalten und Module als Ergebnis liefern Zusammenfassen Abstrahieren zwei oder mehrerer generisch sehr ahnlicher Funktionalitaten zu einer allgemeingultigen Funktionalitat Reduzierung von mehrfach dupliziertem Code mit sehr hoher Ahnlichkeit Beseitigen von totem CodeVorteile und Nachteile BearbeitenVorteileRefactoring dient der Verbesserung der Wartbarkeit des Designs in der Art dass es fur den Programmierer leichter wird den bestehenden Code funktional zu erweitern oder an anderer Stelle wiederzuverwenden Dies versucht man zu erreichen indem man den Code insbesondere bezuglich folgender Kriterien verbessert Lesbarkeit so dass moglichst viele Programmierer verstehen was der Code tatsachlich macht Modularitat und Redundanz so dass konkrete Problemlosungen von anderer Stelle genutzt werden konnen und nicht mehrfach implementiert sind Kopplung und Kohasion damit zukunftige Anderungen nur lokale Auswirkungen haben Testbarkeit siehe Unit Test so dass es moglich wird die korrekte Arbeitsweise des Codes fur die Zukunft durch Regressionstests abzusichernIm ublichen Softwareentwicklungszyklus ist ein fortwahrender Kreislauf von Spezifikation Design Implementierung und Tests vorgesehen Nach jedem Durchlauf kann das Softwareprodukt immer wieder neu in diesen Kreislauf einsteigen Mit den klassischen Techniken hiess das jedoch dass nach einer Anderung der Spezifikation oder einem Redesign oft Teile oder sogar das ganze Programm vollig neu geschrieben werden mussten Refactoring erlaubt dem Entwickler diesen Zyklus permanent im Kleinen ablaufen zu lassen und so sein Produkt kontinuierlich zu verbessern NachteileJe nach Umsetzung kann Refactoring auch einige Nachteile mit sich ziehen Durch das Refactoring konnen wie bei jeder andern Codeanderung auch neue unerwartete Fehler entstehen Da Fehler entstehen konnen entsteht wenn die Regressionstests nicht automatisiert sind Testaufwand fur Regressionstests Neben allgemein gultigen Designprinzipien kann Refactoring auch in Richtung spezifischer Designauspragungen gemacht werden welche nicht der Verbesserung der Wiederverwendung dienen In diesem Fall ware das Refactoring Zeitverbrauch ohne wirklichen Nutzen fur den Kunden welcher von wichtigeren Aufgaben ablenkt Risiken und deren Handhabung BearbeitenRefactoring wird nur auf funktionierendem Code ausgefuhrt dessen Funktionalitat erhalten bleiben soll Dies beinhaltet aber auch das Risiko ungewunschter Anderungen und Fehler Um dieses Risiko zu vermeiden oder wenigstens zu minimieren verwendet man verschiedene Regeln die den Prozess des Refaktorisierens weniger gefahrlich machen Zuerst sollte man eine Reihe automatisch ablaufender Unit Tests haben Diese werden vor dem Refactoring angewandt und man beginnt erst wenn die Tests alle funktionieren Zusatzlich sollte mit Hilfe eines geeigneten Programms die Testabdeckung ermittelt und gepruft werden ob die zu andernde Stelle im Code tatsachlich durch automatisierte Tests geschutzt ist Dies stellt sicher dass das Programm richtig lauft Nach Ausfuhrung des Refactoring wird wieder die Testsuite ausgefuhrt So kann man einige Fehler beim Refactoring sofort erkennen Falsch ware jedoch die Aussage dass Unit Tests das Refactoring sicher machen konnten Unit Tests senken lediglich die Risiken des Refactorings Weiterhin gilt das Prinzip der kleinen Anderungen Wenn man nur wenig verandert so kann man zum einen hoffen auch nur wenig zu zerstoren falls man durch das Refactoring Fehler eintragt trotzdem konnen kleine Ursachen grosse Auswirkungen haben Zum anderen lassen sich gemachte Fehler dann auch leichter finden Meistens kann man komplexe Refactorings die man plant in einfache kleine Einheiten zerlegen Vor und nach jedem Schritt wird wieder durch die Tests die Integritat des Systems gepruft Durch die Verwendung automatisierter Refactoring Funktionen wie sie z B von Eclipse oder Borland Delphi ab Version 2005 zur Verfugung gestellt werden lassen sich ebenfalls Fehlerquellen effektiv ausschliessen sowie der eigene Arbeitsaufwand minimieren Schliesslich gibt es einen Katalog von Refactoring Mustern die ahnlich wie die Entwurfsmuster eingesetzt werden um Fehler zu vermeiden Dabei ist in jedem Muster eine Reihe von Parametern definiert Da ware erstmal das Ziel des Musters Methode extrahieren Klasse umbenennen etc und dazu dann eine Reihe von Arbeitsanweisungen die fur diese Aktion ausgefuhrt werden mussen Viele dieser Muster konnen heutzutage automatisch von Werkzeugen umgesetzt werden Man trifft als Softwareentwickler nur noch die Entscheidung welches Muster worauf angewendet wird um den Quelltext zu verbessern Es ist jedoch zu beachten dass die Mechanismen oftmals noch recht fehleranfallig sind Im besten Fall kommt es durch so verursachte Fehler zu einem Problem beim Ubersetzen aber auch Laufzeitfehler konnen die Folge sein Ein umfangreiches moglichst automatisiertes Testen ist daher nach einem Refactoring immer erforderlich Beispiel BearbeitenDieser Java Code vor dem Refactoring enthalt eine temporare Variable die fur mehrere Zwecke verwendet wird und einen nichtssagenden Namen besitzt double x 2 breite hoehe System out println Umfang x x breite hoehe System out println Flache x Durch Refactoring wird fur jeden der Verwendungszwecke eine getrennte Variable deklariert die jeweils einen aussagekraftigen Namen tragt double umfang 2 breite hoehe System out println Umfang umfang double flaeche breite hoehe System out println Flache flaeche Durch weiteres Refactoring konnen die beiden lokalen Variablen eliminiert werden Nachteile Bedeutung der Ausdrucke wird unklarer Ausdrucke konnen schlechter im Debugger angezeigt werden Der entstehende Code wird weder besser noch schlechter da Compiler seit Mitte der 1990er Jahre Common subexpression elimination wie auch Live variable analysis beherrschen System out println Umfang 2 breite hoehe System out println Flache breite hoehe Man konnte die Berechnung auch in eine Klasse verlegen und diese verwenden Rechteck rechteck new Rechteck breite hoehe System out println Umfang rechteck umfang System out println Flache rechteck flaeche System out println Eckenanzahl rechteck ecken System out println Diagonalen rechteck diagonale 0 1 Literatur BearbeitenMartin Fowler Refactoring Wie Sie das Design vorhandener Software verbessern Addison Wesley Verlag Munchen 2000 ISBN 3 8273 1630 8 2 Auflage Refactoring Improving the Design of Existing Code Addison Wesley 2018 ISBN 978 0 13 475759 9 Robert C Martin Clean Code Refactoring Patterns Testen und Techniken fur sauberen Code mitp Frechen 2009 ISBN 978 3 8266 5548 7 William C Wake Refactoring Workbook ISBN 0 321 10929 5 Ch Bommer M Spindler V Barr Softwarewartung Grundlagen Management und Wartungstechniken dpunkt verlag Heidelberg 2008 ISBN 3 89864 482 0 Joshua Kerievsky Refactoring to Patterns Programmer s Choice 1 Auflage Addison Wesley 2006 ISBN 978 3 8273 2503 7 englisch industriallogic com abgerufen am 14 Marz 2013 Originaltitel Refactoring to Patterns William G Grisworld William F Opdyke The Birth of Refactoring A Retrospective on the Nature of High Impact Software Engineering Research in IEEE Software Vol 32 6 November December 2015 IEEE Computer Society Digital Library Weblinks BearbeitenWas ist Refactoring c2 com Artikel englisch Refactoring Motivation Herleitung und Demonstration in Eclipse Ubersetzung von Fowlers Refactoring Katalog Wie wird unwartbarer Quelltext geschrieben von Roedy Green englisch Refactoring von Martin Fowler englisch Smells to Refactorings Quick Reference Guide PDF 116 kB Refactoring Catalog von Martin FowlerWerkzeuge bicyclerepair Refactoringwerkzeug fur PythonEinzelnachweise Bearbeiten Floyd Marinescu Abel Avram Domain Driven Design Quickly Hrsg C4Media InfoQ 2007 ISBN 978 1 4116 0925 9 S 57 59 englisch infoq com abgerufen am 7 Marz 2013 Refactor Mercilessly Portland Pattern Repository abgerufen am 7 Marz 2013 englisch Abgerufen von https de wikipedia org w index php title Refactoring amp oldid 223200456