Refactoring (Refaktorisierung) Seminar Programmierstil Klemens Stelzmüller WS 2002.

Slides:



Advertisements
Ähnliche Präsentationen
M a r c – o l i v e r p a h l Informatik I – Kapitel 7 Klassen und höhere Datentypen Zusammenfassung des Kapitel 7 Küchlin, Weber, Einführung in die Informatik,
Advertisements

Ziele von EINI I + II Einführen in „Informatik“
mit Entwicklungsumgebungen (Eclipse) Software verbessern
Einführung in die Informatik: Programmierung und Software-Entwicklung
Titel | Title {How to give a Presentation} Autor, Arbeitgeber | Author, Affiliation {M. Schubert, FH Regensburg, Univ. of Applied Sciences, Regensburg,
Einführung in die Programmierung Zusammenfassung
Kurt Rosenberg. C# für.NET oder.NET für C# is(C# == C++ && Java)? true : false ; reines C# Ausblick Überblick.
Agenda Sitzung 2 für den Programmaufbau
Eine Photostory machen
Klassen in Java.
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik F Verteilte Software - Java.
Verteilte Software - Java - Prozedurale Programmierung 1
Design by Contract with JML - Teil 2
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Universität Stuttgart Institut für Kernenergetik und Energiesysteme Was ist Refactoring? Bevor man die Integration angeht, mag es angebracht sein, den.
es gibt (fast) nichts, was nicht anders gemacht werden könnte
FH-Hof Animation - Teil 1 Richard Göbel. FH-Hof Themen Darstellung der Geometrie ändern (Transformation, Appearance, etc.) Geometrie ändern (Morphing)
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 4 Vererbung Sommersemester 2003 Lars Bernard.
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Transaction Script Software Component Technology for Distributed Applications.
F açade P attern By Nicolas Lanquetin. Façade Pattern Structural Pattern Bietet ein gemeinsames Interface, anstatt vieler Interfaces eines Subsystems.
Modulare Programmierung
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
Light and Color in Nature
Java in 9 Folien Besser: Online-Buch Go to Java 2.
© 2004 Pohlig - Taulien Dokumentation mit JavaDoc.
Präsentieren Klausurtagung des Graduiertenkollegs Eichtheorien – experimentelle Tests und theoretische Grundlagen Bullay an der Mosel, PD Dr.
Struktogramme IF-ELSE FOR – Schleife
Template Pattern Richard Göbel.
Wir bauen uns eine Webapplikation!
Testing using Mock Obejcts
Medien zwischen Technologie und Gesellschaft Dozent: Herr Prof. Dr. Manfred Thaller SS 13 Referent: Christian Braun.
Apps go business Ein wirtschaftlich sinnvoller Trend? Martin Schevaracz Bereichsleiter Marketing & Vertrieb der APA-IT Informations Technologie GmbH.
Passive Angriffe ... nicht-invasiv.
Tutorial im Rahmen des Software(technik)praktikums
Zustandsautomat.
OO implementieren Teil IV Objekte erzeugen. © René ProbstModul 226IV - 2 Von der Klasse zum Objekt Plan Bau Objekt Klasse Instanzierung Objekt Das Objekt.
Michael Lukas, Beate Wallner
Module, Klassen, Verträge
Java Performance Tuning Performance Tuning is similar to playing a strategy game but happily you usually get paid for it.
ETS4 - Was ist neu? - Wie fange ich an? - Noch Fragen?
Test Driven Development - Romano Adler-
Automated Software Testing
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Christian Binder Senior Platform Strategy Manager Microsoft
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Abteilung für Telekooperation Übung Softwareentwicklung 2 für Wirtschaftsinformatik Dr. Wieland Schwinger
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
XML IV: Cocoon 2.
Style Guidelines für Java und .NET
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
Equals, Hashcode und CompareTo Micha Kessler
Testtechniken-Praktikum WS 2005/06 1 Testen mit Mock- Objekten Andreas Höfer Dr. Matthias Müller.
Testtechniken-Praktikum WS 2005/06 1 Testgetriebene Entwicklung Andreas Höfer Dr. Matthias Müller mit Beiträgen von Johannes Link.
CuP - Java Zwölfte Vorlesung Klassen – Komposition und Vererbung Freitag, 15. November 2002.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Transaktionale Systeme Projektteil B Verteilte Transaktionen, Workflow- und Transaktions-Manager.
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Tutorium Software-Engineering SS14 Florian Manghofer.
Rekursion – Speicherverwaltung
Felder in Java.
Definition Felder Konstruktor Methoden Beispiel
 Präsentation transkript:

Refactoring (Refaktorisierung) Seminar Programmierstil Klemens Stelzmüller WS 2002

Was ist Refactoring? [Fowl00] Refaktorisierung (Substantiv): Eine Änderung an der internen Struktur einer Software, um sie leichter verständlich zu machen und einfacher zu verändern, ohne ihr beobachtbares Verhalten zu ändern. Refaktorisieren (Verb): Eine Software umstrukturieren, ohne ihr beobachtbares Verhalten zu ändern, indem man eine Reihe von Refaktorisierungen anwendet. Refaktorisieren gibt mir die Freiheit, meine Meinung zu ändern!

Gründe für den Einsatz Warum soll man refaktorisieren? Verbesserung & Pflege des Designs Software wird verständlicher Fehler werden gefunden Hilfe, um schneller zu programmieren Wann soll man refaktorisieren? Beim Hinzufügen neuer Funktionalität Bei der Fehlersuche & -behebung Code-Reviews

Wo einsetzen? Bad Smells Bad SmellAbhilfe Duplizierter CodeMethode extrahieren Template Methode bilden Lange MethodeMethode extrahieren NeidMethode extrahieren Methode verschieben Temp. VariableTemp. Variable durch Abfrage ersetzen Switch-StatementsTypenschl. durch Unterklassen ers. Anderer Gestank Katalog nach Fowler! [Fowl00] If it stinks, change it – Kent Beck

Wie einsetzen? Umfangreiche Testsuite aufbauen (Bsp: xUnit-Familie) Refaktorisierungen in kleinen Schritten durchführen Stellen mit größtem Gestank auswählen Nach jeder Änderung testen keine Änderungen am Verhalten! Bei Erfolg weitermachen Bei Fehlern von vorne beginnen – nicht Fehler suchen! Die 2 Hüte nicht vergessen!

Beispiel Videoverleih Rechnungen für Kunden erstellen & drucken Welche Filme wie lange ausgeliehen Miete abhängig von der Art des Films Regulär Neuerscheinung Kinderfilm Zusätzlich Bonuspunkte

Problem: Customer.Statement public string Statement { get { double totalAmount = 0.0; int frequentRenterPoints = 0; string result = "Rental Record for " + Name + "\n"; foreach(Rental rental in rentals) { double thisAmount = 0.0; switch(rental.Movie.PriceCode) { case MoviePriceCode.Regular: thisAmount += 2; if(rental.DaysRented > 2) thisAmount += (rental.DaysRented - 2) * 1.5; break; case MoviePriceCode.NewRelease: thisAmount += rental.DaysRented * 3; break; case MoviePriceCode.Childrens: thisAmount += 1.5; if(rental.DaysRented > 3) thisAmount += (rental.DaysRented - 3) * 1.5; break; } Beträge/Zeile ermitteln Kopfzeile füllen

Problem: Customer.Statement frequentRenterPoints++; if(rental.Movie.PriceCode == MoviePriceCode.NewRelease && rental.DaysRented > 1) frequentRenterPoints++; result += "\t" + rental.Movie.Title + "\t" + thisAmount+ "\n"; totalAmount += thisAmount; } result += "Amount owed is " + totalAmount + "\n"; result += "You earned " + frequentRenterPoints + " frequent renter pts"; return result; } In anderen Klassen sollte geschehen: Preise abhängig von Film-Art berechnen Bonuspunkte abhängig von Film-Art berechnen Erschwert Erweiterung (HTML-Rechnung) Bonuspunkte berechnen Fußzeile füllen Rechnungs- zeile füllen

Refaktorisierungen im Detail 1. Methode extrahieren (aus Statement) Switch nach AmountFor ziehen 2. Methode verschieben AmountFor nach Rental kopieren, Wrapper einrichten Wrapper durch tatsächlichen Aufruf ersetzen 3. Temp. Variable durch Abfrage ersetzen thisAmount aus Statement entfernen 4. Methode extrahieren & verschieben Berechnung der Bonuspunkte nach Rental ziehen 5. Temp. Variable durch Abfrage ersetzen totalAmount & frequentRenterPoints entfernen

1) Methode extrahieren private double AmountFor(Rental rental) { double thisAmount = 0; switch(rental.Movie.PriceCode) { case MoviePriceCode.Regular: thisAmount += 2; if(rental.DaysRented > 2) thisAmount += (rental.DaysRented - 2) * 1.5; break; case MoviePriceCode.NewRelease: thisAmount += rental.DaysRented * 3; break; case MoviePriceCode.Childrens: thisAmount += 1.5; if(rental.DaysRented > 3) thisAmount += (rental.DaysRented - 3) * 1.5; break; } return thisAmount; } Switch nach AmountFor ziehen:

1) Methode extrahieren public string Statement { get { double totalAmount = 0.0; int frequentRenterPoints = 0; string result = "Rental Record for " + Name + "\n"; foreach(Rental rental in rentals) { double thisAmount = 0.0; thisAmount = AmountFor(rental); frequentRenterPoints++; if(rental.Movie.PriceCode == MoviePriceCode.NewRelease && rental.DaysRented > 1) frequentRenterPoints++; result += "\t" + rental.Movie.Title + "\t" + thisAmount + "\n"; totalAmount += thisAmount; } result += "Amount owed is " + totalAmount + "\n"; result += "You earned " + frequentRenterPoints + " frequent renter pts"; return result; } AmountFor statt Switch benutzen:

2) Methode verschieben Als Charge in Rental einfügen:

3) Temp. Variable als Abfrage thisAmount aus Statement entfernen: public string Statement { get { double totalAmount = 0.0; int frequentRenterPoints = 0; string result = "Rental Record for " + Name + "\n"; foreach(Rental rental in rentals) { frequentRenterPoints++; if(rental.Movie.PriceCode == MoviePriceCode.NewRelease && rental.DaysRented > 1) frequentRenterPoints++; result += "\t" + rental.Movie.Title + "\t" + rental.Charge + "\n"; totalAmount += rental.Charge; } result += "Amount owed is " + totalAmount + "\n"; result += "You earned " + frequentRenterPoints + " frequent renter pts"; return result; }

4) Methode extrah. & versch. Berechnung der Bonus- punkte nach Rental:

5) Temp. Variable als Abfrage public string Statement { get { string result = "Rental Record for " + Name + "\n"; foreach(Rental rental in rentals) { result += "\t" + rental.Movie.Title + "\t" + rental.Charge + "\n"; } result += "Amount owed is " + TotalCharge + "\n"; result += "You earned " + TotalFrequentRenterPoints + " frequent renter pts"; return result; } totalAmount & frequentRenterPoints entfernen:

6) Erweiterung einführen Die HTML-Rechnung einbauen: public string HtmlStatement { get { string result = " Rentals for " + Name + " "; foreach(Rental rental in rentals) { result += rental.Movie.Title + ": " + rental.Charge + " \n"; } result += " Amount owed is " + TotalCharge + " \n"; result += "You earned " + TotalFrequentRenterPoints + " frequent renter points "; return result; }

Und danach? Switch refaktorisieren Berechnungen nach Movie Zustandsmuster für Arten Vererbung Polymorphismus Verwendung in Customer einarbeiten

Probleme in der Praxis Skepsis der Entwickler & Manager Zeitlicher Aufwand & Kosten Nutzen nicht unmittelbar ersichtlich Refaktorisierung nicht immer möglich Wahl zwischen verschiedenen Alternativen schwierig Globale Auswirkungen eines Schrittes oft lokal nicht abschätzbar Aufklärung, Erfahrung & Werkzeuge

Literatur Martin Fowler: Refactoring – Wie Sie das Design vorhandener Software verbessern, Addison-Wesley, 2000 [Fowl00] William C. Wake: Refactoring Workbook, Draft Martin Fowler, Refactoring Home Page Einfach nach Refactoring googlen