Refactoring

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, Verständlichkeit, Wartbarkeit und Erweiterbarkeit verbessert werden, mit dem Ziel, den jeweiligen Aufwand für 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 beschränkt.

Begriffsherkunft

Der 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 Übersetzung Refaktorisierung stammt aus einer Verwechslung mit einer häufig zitierten Analogie, die ursprünglich nicht Begriffsinhalt war: Refactoring ist eine Art, ein Programm so zu modifizieren, dass verborgene Strukturen offengelegt werden, ohne die Funktionalität zu ändern. Dies, so der (fälschliche) Analogieschluss, entspreche dem Vorgehen der Faktorisierung von Polynomen in der Mathematik.

Vorgehensweise

Refactoring wird hauptsächlich auf unschöne Stellen im Code (siehe Code-Smell) angewandt. Dabei wird der Quelltext eines Computerprogramms umgestaltet, wobei die tatsächliche Programmfunktion unverändert bleiben soll. Die Umgestaltung des Quelltextes erfolgt meist nach folgenden Gesichtspunkten:

  • Lesbarkeit
  • Übersichtlichkeit
  • Verständlichkeit
  • Erweiterbarkeit
  • Vermeidung von Redundanz
  • Testbarkeit

Die Gesichtspunkte des Refactorings hängen 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, Verständlichkeit und gegebenenfalls Erweiterbarkeit (des Gleichungssystems) ist. Aus diesem Grunde sind funktionale Sprachen (Lisp, Haskell, OCaml, Erlang und so weiter) wesentlich besser geeignet, ein Refactoring durchzuführen, da sie auf einem mathematischen Paradigma der Programmierung basieren.

Das Refactoring wird erleichtert und unterstützt durch:

  • Unit-Tests, die als Regressionstests belegen können, dass sich das Verhalten des Programmes unter gleichen Bedingungen nicht geändert hat und durch das Refactoring nicht versehentlich Fehler eingeführt wurden,
  • Werkzeuge, insbesondere integrierte Entwicklungsumgebungen, die eine Unterstützung bei der Durchführung von Refactorings anbieten,
  • funktionale Programmiersprachen (unter anderem, weil man Code bei funktionalen Sprachen mit mathematischen Methoden auf Korrektheit prüfen kann),
  • eine Programmiersprache mit einem strengen Typsystem (z. B. bei der Programmiersprache OCaml), welches schon im Vorfeld (zur Compile-Time) viele Fehler ausschließt, weil es dafür sorgt, dass die Signatur (Interface) dieselbe bleibt, auch wenn die Struktur (Implementierung) sich ändert. Dies erspart viele Unit-Tests schon im Vorfeld (da es viele Fehlerquellen ausschließt).

Mögliche Refactorings
Folgende Maßnahmen oder Arbeiten werden beim Refactoring besonders häufig durchgeführt:

  • Änderung eines Symbolnamens, z. B. das Vergeben von sprechenden Namen für 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 größeren.
  • Im weitesten Sinne auch die Umformatierung eines Quelltextes, z. B. mit einem Beautifier
  • Bei geänderten Geschäftsprozessen bei Darstellung mittels der Unified Modeling Language UML kann mittels „Refactoring“ der Programmcode geändert werden. Dadurch wird eine robuste und stabile Systemarchitektur geschaffen, da unübersichtliche Änderungen nicht im Code initiiert werden müssen.
  • Anwenden von Funktionen höherer 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 ähnlicher Funktionalitäten zu einer allgemeingültigen Funktionalität
    (Reduzierung von mehrfach dupliziertem Code mit sehr hoher Ähnlichkeit)
  • Beseitigen von totem Code

Vorteile und Nachteile

Vorteile

Refactoring dient der Verbesserung der Wartbarkeit des Designs in der Art, dass es für 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 bezüglich folgender Kriterien verbessert:

  • Lesbarkeit, so dass möglichst viele Programmierer verstehen, was der Code tatsächlich macht
  • Modularität und Redundanz, so dass konkrete Problemlösungen von anderer Stelle genutzt werden können und nicht mehrfach implementiert sind
  • Kopplung und Kohäsion, damit zukünftige Änderungen nur lokale Auswirkungen haben
  • Testbarkeit (siehe Unit-Test), so dass es möglich wird, die korrekte Arbeitsweise des Codes für die Zukunft durch Regressionstests abzusichern

Im üblichen Softwareentwicklungszyklus ist ein fortwährender 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 hieß das jedoch, dass nach einer Änderung der Spezifikation oder einem Redesign oft Teile oder sogar das ganze Programm völlig neu geschrieben werden mussten. Refactoring erlaubt dem Entwickler, diesen Zyklus permanent im Kleinen ablaufen zu lassen, und so sein Produkt kontinuierlich zu verbessern.

Nachteile

Je nach Umsetzung kann Refactoring auch einige Nachteile mit sich ziehen:

  • Durch das Refactoring können, wie bei jeder andern Codeänderung auch, neue, unerwartete Fehler entstehen.
  • Da Fehler entstehen können, entsteht (wenn die Regressionstests nicht automatisiert sind) Testaufwand für Regressionstests.
  • Neben allgemein gültigen Designprinzipien kann Refactoring auch in Richtung spezifischer Designausprägungen gemacht werden, welche nicht der Verbesserung der Wiederverwendung dienen. In diesem Fall wäre das Refactoring Zeitverbrauch ohne wirklichen Nutzen für den Kunden, welcher von „wichtigeren Aufgaben“ ablenkt.

Risiken und deren Handhabung

Refactoring wird nur auf funktionierendem Code ausgeführt (dessen Funktionalität erhalten bleiben soll). Dies beinhaltet aber auch das Risiko ungewünschter Änderungen und Fehler. Um dieses Risiko zu vermeiden (oder wenigstens zu minimieren) verwendet man verschiedene Regeln, die den Prozess des Refaktorisierens weniger gefährlich 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. Zusätzlich sollte mit Hilfe eines geeigneten Programms die Testabdeckung ermittelt und geprüft werden, ob die zu ändernde Stelle im Code tatsächlich durch automatisierte Tests geschützt ist. Dies stellt sicher, dass das Programm richtig läuft. Nach Ausführung des Refactoring wird wieder die Testsuite ausgeführt. So kann man einige Fehler beim Refactoring sofort erkennen. Falsch wäre jedoch die Aussage, dass Unit-Tests das Refactoring sicher machen könnten, Unit-Tests senken lediglich die Risiken des Refactorings.

Weiterhin gilt das Prinzip der kleinen Änderungen. Wenn man nur wenig verändert, so kann man zum einen hoffen, auch nur wenig zu zerstören, falls man durch das Refactoring Fehler einträgt (trotzdem können kleine Ursachen große 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 Integrität des Systems geprüft. Durch die Verwendung automatisierter Refactoring-Funktionen (wie sie z. B. von Eclipse oder Borland Delphi ab Version 2005 zur Verfügung gestellt werden) lassen sich ebenfalls Fehlerquellen effektiv ausschließen sowie der eigene Arbeitsaufwand minimieren.

Schließlich gibt es einen Katalog von Refactoring-Mustern, die ähnlich wie die Entwurfsmuster eingesetzt werden, um Fehler zu vermeiden. Dabei ist in jedem Muster eine Reihe von Parametern definiert. Da wäre erstmal das Ziel des Musters (Methode extrahieren, Klasse umbenennen etc.) und dazu dann eine Reihe von Arbeitsanweisungen, die für diese Aktion ausgeführt werden müssen. Viele dieser Muster können 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 fehleranfällig sind. Im besten Fall kommt es durch so verursachte Fehler zu einem Problem beim Übersetzen, aber auch Laufzeitfehler können die Folge sein. Ein umfangreiches, möglichst automatisiertes Testen ist daher nach einem Refactoring immer erforderlich.

Beispiel

Dieser Java-Code vor dem Refactoring enthält eine temporäre Variable, die für 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("Fläche: " + x);

Durch Refactoring wird für jeden der Verwendungszwecke eine getrennte Variable deklariert, die jeweils einen aussagekräftigen Namen trägt:

    double umfang = 2 * (breite + hoehe);
    System.out.println("Umfang: " + umfang);
    double flaeche = breite * hoehe;
    System.out.println("Fläche: " + flaeche);

Durch weiteres Refactoring können die beiden lokalen Variablen eliminiert werden.

Nachteile:

  • Bedeutung der Ausdrücke wird unklarer.
  • Ausdrücke können 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("Fläche: " + (breite * hoehe));

Man könnte 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("Fläche: "   + rechteck.flaeche() );
    System.out.println("Eckenanzahl: " + rechteck.ecken() );
    System.out.println("Diagonalen: " + rechteck.diagonale(0,1) );

Literatur

  • Martin Fowler: Refactoring. Wie Sie das Design vorhandener Software verbessern. Addison-Wesley Verlag, München 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 für 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. März 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).

Werkzeuge

Einzelnachweise

  1. 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. März 2013]).
  2. Refactor Mercilessly. Portland Pattern Repository, abgerufen am 7. März 2013 (englisch).

Read other articles:

Robert O. Anderson (13 April 1917 – 2 Desember 2007) adalah seorang pemimpin bisnis asal Amerika Serikat. Ia juga merupakan seorang wildcatter dan filantropis legendaris yang mendirikan Atlantic Richfield Oil Co. (mulai tahun 2000 menjadi bagian dari British Petroleum) yang merupakan hasil merger antara Atlantic dengan Richfield oil companies. Ia juga pernah menjabat sebagai chairman Arco selama dua dekade. Anderson menggunakan pengaruhnya untuk membantu banyak organisasi kebu...

МаріакMariac Країна  Франція Регіон Овернь-Рона-Альпи  Департамент Ардеш  Округ Турнон-сюр-Рон Кантон Шейлар Код INSEE 07150 Поштові індекси 07160 Координати 44°52′54″ пн. ш. 4°21′54″ сх. д.H G O Висота 508 - 1075 м.н.р.м. Площа 16,39 км² Населення 551 (01-2020[1]) Густота 39,29 ос./км²...

Strada statale 82della Valle del LiriLocalizzazioneStato Italia Regioni Abruzzo Lazio Province L'Aquila Frosinone Latina DatiClassificazioneStrada statale InizioSS 5 presso Avezzano FineSS 7 presso Itri Lunghezza126,800 km Data apertura1928 Provvedimento di istituzioneLegge 17/05/1928 n°1094[1] GestoreANAS (tratta Avezzano-Arce) e Astral (tratta Ceprano-Itri) dal 2007 Percorso Manuale La strada statale 82 della Valle del Liri (SS 82), ora anche strada re...

Ambassador of the United States of America to ThailandเอกอัครราชทูตสหรัฐอเมริกาประจำประเทศไทยSeal of the United States Department of StateIncumbentRobert F. Godecsince October 7, 2022NominatorThe President of the United StatesAppointerThe President with Senate advice and consentInaugural holderJohn A. Haldermanas Minister Resident/Consul GeneralFormationJuly 13, 1882WebsiteU.S. Embassy - Bangkok This is a list ...

Traditionell hergestelltes Kathedralglas (Fenster in der Kapelle des Waldfriedhofs Dahlem) Kathedralglas ist ein Fensterglas mit rauer Oberfläche, das das durchstrahlende Licht bricht und so einen teilweisen Blickschutz bietet, während die Beleuchtungsfunktion erhalten bleibt. Früher war es oft dick, farbig und gegossen und wurde häufig für Kirchenfenster verwendet.[1] Während der Jugendstilzeit war es das bevorzugte Glas für Glaskuppeln, Fenster, Möbel- und Zimmertüren sowie f

Hieronder volgt een lijst van landen van de wereld in 1811. Uitleg Onder het kopje Onafhankelijke landen zijn de landen in de wereld opgelijst die in 1811 onafhankelijk waren. Alle de facto onafhankelijke staten die niet, of slechts in zeer beperkte mate, door andere landen werden erkend, zijn weergegeven onder het kopje Niet algemeen erkende landen. De afhankelijke gebieden, dat wil zeggen gebieden die niet worden gezien als een integraal onderdeel van de staat waar ze afhankelijk van zijn, ...

Theatre in Wolverhampton, England This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Grand Theatre, Wolverhampton – news · newspapers · books · scholar · JSTOR (March 2012) (Learn how and when to remove this template message) Grand Theatre WolverhamptonAddressLichfield StreetWolverhamptonUnited KingdomOwnerCity...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Holland College – news · newspapers · books · scholar · JSTOR (October 2010) (Learn how and when to remove this template message) 46°14′21″N 63°07′18″W / 46.23917°N 63.12167°W / 46.23917; -63.12167 Holland CollegeCollège Hol...

Canadian musician and producer For other people with the name Nasri, see Nasri. NasriNasri performing live with Magic! in September 2014Background informationBirth nameNasri Tony AtwehBorn (1981-01-10) 10 January 1981 (age 42)Toronto, Ontario, CanadaGenres Pop pop rock reggae reggae fusion reggae rock Occupation(s) Musician singer songwriter record producer Instrument(s) Vocals guitar piano Years active2002–presentLabelsRCAMember of Magic! The Messengers Musical artist Nasri Tony Atweh...

Species of bird White-chinned prinia At Kakamega, Kenya Conservation status Least Concern (IUCN 3.1)[1] Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Chordata Class: Aves Order: Passeriformes Family: Cisticolidae Genus: Schistolais Species: S. leucopogon Binomial name Schistolais leucopogon(Cabanis, 1875) Subspecies S. l. leucopogon S. l. reichenowi The white-chinned prinia (Schistolais leucopogon), also known as the white-chinned warbler, is a specie...

Island in Tasmania, Australia Babel IslandAn aerial photo of Babel Island, with the smaller Cat and Storehouse islands, as viewed from the south east.Babel IslandLocation of Babel Island in Bass StraitGeographyLocationBass StraitCoordinates39°56′24″S 148°19′48″E / 39.94000°S 148.33000°E / -39.94000; 148.33000ArchipelagoFurneaux GroupArea440 ha (1,100 acres)Length3 km (1.9 mi)[1]Width2.8 km (1.74 mi)[1]Highest el...

Postal stationery product Not to be confused with Aereogramme (band). GB Christmas Aerogram (one of two issued in 1967) An aerogram, aerogramme, aérogramme, air letter or airletter is a thin lightweight piece of foldable and gummed paper for writing a letter for transit via airmail, in which the letter and envelope are one and the same. Most postal administrations forbid enclosures in these light letters, which are usually sent abroad at a preferential rate. Printed warnings existed to say t...

Ukrainian television channel Television channel TETCountryUkraineBroadcast areaUkraineHeadquartersKyiv, UkraineProgrammingLanguage(s)UkrainianPicture format16:9 (576i, SDTV)OwnershipOwner1+1 Media GroupHistoryLaunched24 January 1992LinksWebsiteOfficial websiteAvailabilityTerrestrialZeonbudMX-2 (12) TET is a Ukrainian-language national entertainment TV channel broadcasting in Ukraine. It is part of the large 1+1 Media Group, and broadcasts to more than 100 cities in Ukraine, with a technical p...

2017 children's book written by David Walliams and illustrated by Tony Ross The Midnight Gang AuthorDavid WalliamsIllustratorTony RossCountryUnited KingdomLanguageEnglishGenreChildren's fictionPublisherHarperCollinsPublication date3 November 2016ISBN978-0-00-848759-1Preceded byGrandpa's Great Escape Followed byBad Dad  The Midnight Gang is a children's book written by David Walliams and illustrated by Tony Ross. It was released by HarperCollins on November 3, 2016. The sto...

Indian police officer M. Abdul Sathar Kunjuഅബ്ദുൽ സത്താർ കുഞ്ഞ്Abdul Sathar Kunju in the 1990sDirector General of Police, Kerala In office1996- 1997Preceded byR. Radhakrishanan IPSSucceeded byC.A Chaly IPSInspector General of Police, Kerala In office1986-1996 Personal detailsBornM. Abdul Sathar Kunju (1939-06-26) 26 June 1939 (age 84)Oachira, Kollam, Kerala, IndiaSpouseRafiyaParent(s)Mohammed Kunju (father) Saliha Umma (mother)ResidenceThiruvananthapur...

This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (May 2009) (Learn how and when to remove this template message) Identity management theory (also frequently referred to as IMT) is an intercultural communication theory from the 1990s. It was developed by William R. Cupach and Tadasu Todd Imahori on the basis of Erving Goffman's Interaction ritual: Essays on face...

Jane Lumley Retrato de Jane Lumley, Baronesa Lumley, de Steven van der MeulenInformación personalNacimiento 1537 Fallecimiento Marzo de 1577 Cheam (Reino Unido) Sepultura Lumley Chapel FamiliaPadres Henry FitzAlan, 19th Earl of Arundel Lady Catherine Grey Cónyuge John, 1st Baron Lumley Información profesionalOcupación Traductora [editar datos en Wikidata] Jane Lumley, la Baronesa Lumley (1537– 27 de julio de 1578), también conocida por su nombre de soltera en inglés como Lad...

The Basingstoke by-election was a Parliamentary by-election held on 12 March 1906.[1] The constituency returned one Member of Parliament (MP) to the House of Commons of the United Kingdom, elected by the first past the post voting system. The by-election was held due to the death of the incumbent Conservative MP, Arthur Frederick Jeffreys and was won by the Conservative candidate Arthur Salter. Vacancy Arthur Jeffreys had been Conservative MP for the seat since the 1887 Basingstoke by...

Hereford Nomenclatura biológica Bos taurusRegión de origen Herefordshire, InglaterraCaracterísticasTipo BovinoPelaje rojo cereza al rojo abayadoCabeza blancaOtros datosUtilización Producción de carne[editar datos en Wikidata] Hereford es una raza bovina originaria de Inglaterra[1]​[2]​ , productora de carne Los animales de esta raza se identifican por ser colorados desde bayo a cereza con manchas blanco puro en la cabeza, parte posterior de las orejas, pecho, vientr...

Comune in Piedmont, ItalyAngrognaComuneComune di Angrogna Coat of armsLocation of Angrogna AngrognaLocation of Angrogna in ItalyShow map of ItalyAngrognaAngrogna (Piedmont)Show map of PiedmontCoordinates: 44°51′N 7°13′E / 44.850°N 7.217°E / 44.850; 7.217CountryItalyRegionPiedmontMetropolitan cityTurin (TO)FrazioniBaussan, Martel, Pradeltorno, SerreGovernment • MayorMario MalanArea[1] • Total38.88 km2 (15.01 sq ...