
Refactoring
Description
Alles über E-Books | Antworten auf Fragen rund um E-Books, Kopierschutz und Dateiformate finden Sie in unserem Info- & Hilfebereich.
- Umfassend überarbeitete und aktualisierte Neuauflage des Standardwerks in vollständig neuer Übersetzung
- Verbesserungsmöglichkeiten von bestehender Software anhand von Code-Smells erkennen und Code effizient überarbeiten
- Umfassender Katalog von Refactoring-Methoden mit Code-Beispielen in JavaScript
Seit mehr als zwanzig Jahren greifen erfahrene Programmierer rund um den Globus auf dieses Buch zurück, um bestehenden Code zu verbessern und leichter lesbar zu machen sowie Software besser warten und erweitern zu können.
In diesem umfassenden Standardwerk zeigt Ihnen Martin Fowler, was die Vorteile von Refactoring sind, wie Sie verbesserungsbedürftigen Code erkennen und wie Sie ein Refactoring - unabhängig von der verwendeten Programmiersprache - erfolgreich durchführen. In einem umfangreichen Katalog gibt Fowler Ihnen verschiedene Refactoring-Methoden mit ausführlicher Erläuterung, Motivation, Vorgehensweise und einfachen Beispielen in JavaScript an die Hand.
Darüber hinaus behandelt er insbesondere folgende Schwerpunkte:
- Allgemeine Prinzipien und Durchführung des Refactorings
- Refactoring anwenden, um die Lesbarkeit, Wartbarkeit und Erweiterbarkeit von Programmen zu verbessern
- Code-Smells erkennen, die auf Verbesserungsmöglichkeiten durch Refactoring hinweisen
- Entwicklung zuverlässiger Tests für das Refactoring
- Erkennen von Fallstricken und notwendigen Kompromissen bei der Durchführung eines Refactorings
Diese vollständig neu übersetzte Ausgabe wurde von Grund auf überarbeitet, um den maßgeblichen Veränderungen der modernen Programmierung Rechnung zu tragen. Sie enthält einen aktualisierten Katalog von Refactoring-Methoden sowie neue Beispiele für einen funktionalen Programmieransatz.
Aus dem Inhalt:- Definition und Grund-lagen von Refactoring
- Der richtige Zeitpunkt für ein Refactoring
- Verbesserungsbedürftigen Code erkennen (Code-Smells)
- Tests und selbsttestender Code
-
Umfangreicher Refactoring-Katalog:
- Kapselung
- Verschiebungen
- Daten organisieren
- Bedingungen vereinfachen
- Refactoring von APIs
- Umgang mit Vererbung
»Dieses Buch gibt einen sehr guten Einstieg in das Refactoring und hält auch eine übersichtliche, gut erklärte Sammlung von Refactoring-Patterns parat. Ein Buch, das sich jeder Programmierer unters Kopfkissen legen sollte.«
More details
Other editions
Additional editions

Person
Content
- Cover
- Titel
- Impressum
- Inhaltsverzeichnis
- Vorwort zur ersten Auflage
- Über den Fachkorrektor der deutschen Ausgabe
- Einleitung
- Was ist Refactoring?
- Worum geht es in diesem Buch?
- Wer sollte dieses Buch lesen?
- Von anderen geschaffene Grundlagen
- Danksagungen
- Kapitel 1: Refactoring: Ein erstes Beispiel
- 1.1 Der Ausgangspunkt
- 1.2 Anmerkungen zum ersten Programm
- 1.3 Der erste Schritt des Refactorings
- 1.4 Aufteilung der statement-Funktion
- 1.4.1 Entfernen der Variable play
- 1.4.2 Extrahieren der Berechnung von Treuepunkten
- 1.4.3 Entfernen der Variable format
- 1.4.4 Entfernen der Gesamtzahl der Treuepunkte
- 1.5 Status: Eine Menge verschachtelter Funktionen
- 1.6 Die Phasen Berechnung und Formatierung voneinander trennen
- 1.7 Status: Aufgeteilt in zwei Dateien (und Phasen)
- 1.8 Neuorganisation der Berechnungen nach Art
- 1.8.1 Berechnen der Kosten einer Vorstellung
- 1.8.2 Funktionen in die Klasse verschieben
- 1.8.3 Polymorphes Verhalten der Klasse PerformanceCalculator
- 1.9 Status: Erzeugen der Daten mit der polymorphen Klasse PerformanceCalculator
- 1.10 Abschließende Überlegungen
- Kapitel 2: Prinzipien des Refactorings
- 2.1 Refactoring: Definition
- 2.2 Die beiden Hüte
- 2.3 Gründe für ein Refactoring
- 2.3.1 Refactoring verbessert das Design der Software
- 2.3.2 Refactoring macht Software besser verständlich
- 2.3.3 Refactoring hilft mir, Bugs aufzuspüren
- 2.3.4 Refactoring hilft mir, schneller zu programmieren
- 2.4 Der richtige Zeitpunkt für ein Refactoring
- 2.4.1 Vorbereitendes Refactoring: Hinzufügen eines Features vereinfachen
- 2.4.2 Refactoring zwecks Verbesserung der Verständlichkeit des Codes
- 2.4.3 Refactoring als Abfallentsorgung
- 2.4.4 Geplantes Refactoring und spontanes Refactoring
- 2.4.5 Langfristiges Refactoring
- 2.4.6 Refactoring beim Code-Review
- 2.4.7 Wie sag ich's meinem Chef?
- 2.4.8 Wann sollte man kein Refactoring durchführen?
- 2.5 Probleme beim Refactoring
- 2.5.1 Verlangsamung der Entwicklung neuer Features
- 2.5.2 Code-Eigentümerschaft
- 2.5.3 Entwicklungszweige
- 2.5.4 Testen
- 2.5.5 Legacy Code
- 2.5.6 Datenbanken
- 2.6 Refactoring, Architektur und Yagni
- 2.7 Refactoring und der Softwareentwicklungsprozess
- 2.8 Refactoring und Performance
- 2.9 Ursprünge des Refactorings
- 2.10 Automatisiertes Refactoring
- 2.11 Weiterführende Literatur
- Kapitel 3: Code-Smells: Schlechte Gerüche im Code
- 3.1 Rätselhafte Bezeichnung
- 3.2 Redundanter Code
- 3.3 Lange Funktion
- 3.4 Lange Parameterliste
- 3.5 Globale Daten
- 3.6 Veränderliche Daten
- 3.7 Divergierende Änderungen
- 3.8 Chirurgie mit der Schrotflinte
- 3.9 Feature-Neid
- 3.10 Datenklumpen
- 3.11 Obsession für elementare Datentypen
- 3.12 Wiederholte switch-Anweisungen
- 3.13 Schleifen
- 3.14 Träges Element
- 3.15 Spekulative Generalisierung
- 3.16 Temporäres Feld
- 3.17 Mitteilungsketten
- 3.18 Vermittler
- 3.19 Insiderhandel
- 3.20 Umfangreiche Klasse
- 3.21 Alternative Klassen mit unterschiedlichen Schnittstellen
- 3.22 Datenklasse
- 3.23 Ausgeschlagenes Erbe
- 3.24 Kommentare
- Kapitel 4: Tests erstellen
- 4.1 Der Nutzen selbsttestenden Codes
- 4.2 Beispielcode zum Testen
- 4.3 Ein erster Test
- 4.4 Hinzufügen eines weiteren Tests
- 4.5 Ändern des Test-Fixtures
- 4.6 Austesten der Grenzen
- 4.7 Und noch viel mehr
- Kapitel 5: Der Katalog
- 5.1 Format der Refactorings
- 5.2 Die Auswahl der Refactorings
- Kapitel 6: Eine erste Zusammenstellung von Refactorings
- 6.1 Funktion extrahieren (Extract Function)
- 6.1.1 Motivation
- 6.1.2 Vorgehen
- 6.1.3 Beispiel: Keine Variablen außerhalb des Gültigkeitsbereichs
- 6.1.4 Beispiel: Verwendung lokaler Variablen
- 6.1.5 Beispiel: Zuweisung zu einer lokalen Variable
- 6.2 Funktion inline platzieren (Inline Function)
- 6.2.1 Motivation
- 6.2.2 Vorgehen
- 6.2.3 Beispiel
- 6.3 Variable extrahieren (Extract Variable)
- 6.3.1 Motivation
- 6.3.2 Vorgehen
- 6.3.3 Beispiel
- 6.3.4 Beispiel mit einer Klasse
- 6.4 Variable inline platzieren (Inline Variable)
- 6.4.1 Motivation
- 6.4.2 Vorgehen
- 6.5 Funktionsdeklaration ändern (Change Function Declaration)
- 6.5.1 Motivation
- 6.5.2 Vorgehen
- 6.5.3 Beispiel: Umbenennen einer Funktion (einfaches Vorgehen)
- 6.5.4 Beispiel: Umbenennen einer Funktion (Migrationsansatz)
- 6.5.5 Beispiel: Hinzufügen eines Parameters
- 6.5.6 Beispiel: Einen Parameter durch eine seiner Eigenschaften ersetzen
- 6.6 Variable kapseln (Encapsulate Variable)
- 6.6.1 Motivation
- 6.6.2 Vorgehen
- 6.6.3 Beispiel
- 6.7 Variable umbenennen (Rename Variable)
- 6.7.1 Motivation
- 6.7.2 Vorgehen
- 6.7.3 Beispiel
- 6.8 Parameterobjekt einführen (Introduce Parameter Object)
- 6.8.1 Motivation
- 6.8.2 Vorgehen
- 6.8.3 Beispiel
- 6.9 Funktionen zu einer Klasse vereinen (Combine Functions into Class)
- 6.9.1 Motivation
- 6.9.2 Vorgehen
- 6.9.3 Beispiel
- 6.10 Funktionen zu einer Transformation vereinen (Combine Functions into Transform)
- 6.10.1 Motivation
- 6.10.2 Vorgehen
- 6.10.3 Beispiel
- 6.11 Phase aufteilen (Split Phase)
- 6.11.1 Motivation
- 6.11.2 Vorgehen
- 6.11.3 Beispiel
- Kapitel 7: Kapselung
- 7.1 Datensatz kapseln (Encapsulate Record)
- 7.1.1 Motivation
- 7.1.2 Vorgehen
- 7.1.3 Beispiel
- 7.1.4 Beispiel: Kapselung eines verschachtelten Datensatzes
- 7.2 Collection kapseln (Encapsulate Collection)
- 7.2.1 Motivation
- 7.2.2 Vorgehen
- 7.2.3 Beispiel
- 7.3 Elementaren Wert durch Objekt ersetzen (Replace Primitive with Object)
- 7.3.1 Motivation
- 7.3.2 Vorgehen
- 7.3.3 Beispiel
- 7.4 Temporäre Variable durch Abfrage ersetzen (Replace Temp with Query)
- 7.4.1 Motivation
- 7.4.2 Vorgehen
- 7.4.3 Beispiel
- 7.5 Klasse extrahieren (Extract Class)
- 7.5.1 Motivation
- 7.5.2 Vorgehen
- 7.5.3 Beispiel
- 7.6 Klasse inline platzieren (Inline Class)
- 7.6.1 Motivation
- 7.6.2 Vorgehen
- 7.6.3 Beispiel
- 7.7 Delegation verbergen (Hide Delegate)
- 7.7.1 Motivation
- 7.7.2 Vorgehen
- 7.7.3 Beispiel
- 7.8 Vermittler entfernen (Remove Middle Man)
- 7.8.1 Motivation
- 7.8.2 Vorgehen
- 7.8.3 Beispiel
- 7.9 Algorithmus ersetzen (Substitute Algorithm)
- 7.9.1 Motivation
- 7.9.2 Vorgehen
- Kapitel 8: Verschiebungen
- 8.1 Funktion verschieben (Move Function)
- 8.1.1 Motivation
- 8.1.2 Vorgehen
- 8.1.3 Beispiel: Verschieben einer verschachtelten Funktion in die oberste Ebene
- 8.1.4 Beispiel: Verschiebungen zwischen Klassen
- 8.2 Feld verschieben (Move Field)
- 8.2.1 Motivation
- 8.2.2 Vorgehen
- 8.2.3 Beispiel
- 8.2.4 Beispiel: Verschiebung in ein gemeinsam genutztes Objekt
- 8.3 Anweisungen in Funktion verschieben (Move Statements into Function)
- 8.3.1 Motivation
- 8.3.2 Vorgehen
- 8.3.3 Beispiel
- 8.4 Anweisungen in Aufrufer verschieben (Move Statements to Caller)
- 8.4.1 Motivation
- 8.4.2 Vorgehen
- 8.4.3 Beispiel
- 8.5 Inline-Code durch Funktionsaufruf ersetzen (Replace Inline Code with Function Call)
- 8.5.1 Motivation
- 8.5.2 Vorgehen
- 8.6 Anweisungen verschieben (Slide Statements)
- 8.6.1 Motivation
- 8.6.2 Vorgehen
- 8.6.3 Beispiel
- 8.6.4 Beispiel: Verschiebungen und bedingte Anweisungen
- 8.6.5 Literaturhinweis
- 8.7 Schleife aufteilen (Split Loop)
- 8.7.1 Motivation
- 8.7.2 Vorgehen
- 8.7.3 Beispiel
- 8.8 Schleife durch Pipeline ersetzen (Replace Loop with Pipeline)
- 8.8.1 Motivation
- 8.8.2 Vorgehen
- 8.8.3 Beispiel
- 8.8.4 Literaturhinweis
- 8.9 Toten Code entfernen (Remove Dead Code)
- 8.9.1 Motivation
- 8.9.2 Vorgehen
- Kapitel 9: Daten organisieren
- 9.1 Variable aufteilen (Split Variable)
- 9.1.1 Motivation
- 9.1.2 Vorgehen
- 9.1.3 Beispiel
- 9.1.4 Beispiel: Zuweisung zu einem Eingabeparameter
- 9.2 Feld umbenennen (Rename Field)
- 9.2.1 Motivation
- 9.2.2 Vorgehen
- 9.2.3 Beispiel: Umbenennen eines Feldes
- 9.3 Abgeleitete Variable durch Abfrage ersetzen (Replace Derived Variable with Query)
- 9.3.1 Motivation
- 9.3.2 Vorgehen
- 9.3.3 Beispiel
- 9.3.4 Beispiel: Mehr als eine Quelle
- 9.4 Referenz durch Wert ersetzen (Change Reference to Value)
- 9.4.1 Motivation
- 9.4.2 Vorgehen
- 9.4.3 Beispiel
- 9.5 Wert durch Referenz ersetzen (Change Value to Reference)
- 9.5.1 Motivation
- 9.5.2 Vorgehen
- 9.5.3 Beispiel
- Kapitel 10: Bedingungen vereinfachen
- 10.1 Bedingung zerlegen (Decompose Conditional)
- 10.1.1 Motivation
- 10.1.2 Vorgehen
- 10.1.3 Beispiel
- 10.2 Bedingten Ausdruck zusammenfassen (Consolidate Conditional Expression)
- 10.2.1 Motivation
- 10.2.2 Vorgehen
- 10.2.3 Beispiel
- 10.2.4 Beispiel: Verwendung von »and«
- 10.3 Verschachtelte Bedingung durch Wächterbedingung ersetzen (Replace Nested Conditional with Guard Clauses)
- 10.3.1 Motivation
- 10.3.2 Vorgehen
- 10.3.3 Beispiel
- 10.3.4 Beispiel: Umkehrung der Bedingungen
- 10.4 Bedingung durch Polymorphie ersetzen (Replace Conditional with Polymorphism)
- 10.4.1 Motivation
- 10.4.2 Vorgehen
- 10.4.3 Beispiel
- 10.4.4 Beispiel: Polymorphie für Variationen verwenden
- 10.5 Sonderfall einführen (Introduce Special Case)
- 10.5.1 Motivation
- 10.5.2 Vorgehen
- 10.5.3 Beispiel
- 10.5.4 Beispiel: Verwendung eines Objekts mit Literalen
- 10.5.5 Beispiel: Verwenden einer Transformation
- 10.6 Assertion einführen (Introduce Assertion)
- 10.6.1 Motivation
- 10.6.2 Vorgehen
- 10.6.3 Beispiel
- Kapitel 11: Refactoring von APIs
- 11.1 Abfrage von Veränderung trennen (Separate Query from Modifier)
- 11.1.1 Motivation
- 11.1.2 Vorgehen
- 11.1.3 Beispiel
- 11.2 Funktion parametrisieren (Parameterize Function)
- 11.2.1 Motivation
- 11.2.2 Vorgehen
- 11.2.3 Beispiel
- 11.3 Steuerungs-Flag entfernen (Remove Flag Argument)
- 11.3.1 Motivation
- 11.3.2 Vorgehen
- 11.3.3 Beispiel
- 11.4 Vollständiges Objekt erhalten (Preserve Whole Object)
- 11.4.1 Motivation
- 11.4.2 Vorgehen
- 11.4.3 Beispiel
- 11.4.4 Beispiel: Eine Variante zum Erstellen der neuen Funktion
- 11.5 Parameter durch Abfrage ersetzen (Replace Parameter with Query)
- 11.5.1 Motivation
- 11.5.2 Vorgehen
- 11.5.3 Beispiel
- 11.6 Abfrage durch Parameter ersetzen (Replace Query with Parameter)
- 11.6.1 Motivation
- 11.6.2 Vorgehen
- 11.6.3 Beispiel
- 11.7 Setter entfernen (Remove Setting Method)
- 11.7.1 Motivation
- 11.7.2 Vorgehen
- 11.7.3 Beispiel
- 11.8 Konstruktor durch Fabrikfunktion ersetzen (Replace Constructor with Factory Function)
- 11.8.1 Motivation
- 11.8.2 Vorgehen
- 11.8.3 Beispiel
- 11.9 Funktion durch Befehl ersetzen (Replace Function with Command)
- 11.9.1 Motivation
- 11.9.2 Vorgehen
- 11.9.3 Beispiel
- 11.10 Befehl durch Funktion ersetzen (Replace Command with Function)
- 11.10.1 Motivation
- 11.10.2 Vorgehen
- 11.10.3 Beispiel
- Kapitel 12: Der Umgang mit Vererbung
- 12.1 Methode nach oben verschieben (Pull Up Method)
- 12.1.1 Motivation
- 12.1.2 Vorgehen
- 12.1.3 Beispiel
- 12.2 Feld nach oben verschieben (Pull Up Field)
- 12.2.1 Motivation
- 12.2.2 Vorgehen
- 12.3 Konstruktorrumpf nach oben verschieben (Pull Up Constructor Body)
- 12.3.1 Motivation
- 12.3.2 Vorgehen
- 12.3.3 Beispiel
- 12.4 Methode nach unten verschieben (Push Down Method)
- 12.4.1 Motivation
- 12.4.2 Vorgehen
- 12.5 Feld nach unten verschieben (Push Down Field)
- 12.5.1 Motivation
- 12.5.2 Vorgehen
- 12.6 Typenschlüssel durch Unterklassen ersetzen (Replace Type Code with Subclasses)
- 12.6.1 Motivation
- 12.6.2 Vorgehen
- 12.6.3 Beispiel
- 12.6.4 Beispiel: Indirekte Vererbung
- 12.7 Unterklasse entfernen (Remove Subclass)
- 12.7.1 Motivation
- 12.7.2 Vorgehen
- 12.7.3 Beispiel
- 12.8 Basisklasse extrahieren (Extract Superclass)
- 12.8.1 Motivation
- 12.8.2 Vorgehen
- 12.8.3 Beispiel
- 12.9 Hierarchie abbauen (Collapse Hierarchy)
- 12.9.1 Motivation
- 12.9.2 Vorgehen
- 12.10 Unterklasse durch Delegation ersetzen (Replace Subclass with Delegate)
- 12.10.1 Motivation
- 12.10.2 Vorgehen
- 12.10.3 Beispiel
- 12.10.4 Beispiel: Ersetzen einer Hierarchie
- 12.11 Basisklasse durch Delegation ersetzen (Replace Superclass with Delegate)
- 12.11.1 Motivation
- 12.11.2 Vorgehen
- 12.11.3 Beispiel
- Anhang A: Bibliografie
- Anhang B: Liste der Refactorings
- Anhang C: Code-Smells
- Stichwortverzeichnis
System requirements
File format: PDF
Copy protection: Watermark-DRM (Digital Rights Management)
System requirements:
- Computer (Windows; MacOS X; Linux): Use the free software Adobe Reader, Adobe Digital Editions, or any other PDF viewer of your choice (see eBook Help).
- Tablet/Smartphone (Android; iOS): Install the free app Adobe Digital Editions or another reading app for eBooks, e.g., PocketBook (see eBook Help).
- E-reader: Bookeen, Kobo, Pocketbook, Sony, Tolino and many more (only limited: Kindle).
The file format PDF always displays a book page identically on any hardware. This makes PDF suitable for complex layouts such as those used in textbooks and reference books (images, tables, columns, footnotes). Unfortunately, on the small screens of e-readers or smartphones, PDFs are rather annoying, requiring too much scrolling.
This eBook uses Watermark-DRM, a „soft” copy protection. This means that there are no technical restrictions to prevent illegal distribution. However, there is a personalised watermark embedded in the eBook that can be used to identify the purchaser of the eBook in the event of misuse and to provide evidence for legal purposes.
For more information, see our eBook Help page.