AW refactoring improving the design of existing code

468 892 0
AW refactoring improving the design of existing code

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Sandini Bib Refactoring Sandini Bib Professionelle Softwareentwicklung Sandini Bib Martin Fowler Mit Beiträgen von Kent Beck, John Brant, William Opdyke und Don Roberts Refactoring Wie Sie das Design vorhandener Software verbessern Deutsche Übersetzung von Prof Dr Bernd Kahlbrandt An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam Sandini Bib Die Deutsche Bibliothek – CIP-Einheitsaufnahme Ein Titeldatensatz für diese Publikation ist bei der Deutschen Bibliothek erhältlich Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen Trotzdem können Fehler nicht vollständig ausgeschlossen werden Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden Umwelthinweis: Dieses Produkt wurde auf chlorfrei gebleichtem Papier gedruckt Die Einschrumpffolie – zum Schutz vor Verschmutzung – ist aus umweltverträglichem und recyclingfähigem PE-Material Die amerikanische Originalausgabe trägt den Titel: »Refactoring Improving The Design Of Existing Code Martin Fowler With contributions by Kent Beck, John Brant, William Opdyke and Don Roberts Foreword by Erich Gamma« ISBN 0-201-48567-2 10 04 03 02 01 00 ISBN 3-8273-1630-8 © 2000 by Addison-Wesley Verlag, ein Imprint der Pearson Education Deutschland GmbH, Martin-Kollar-Straße 10–12, D-81829 München/Germany Alle Rechte vorbehalten Einbandgestaltung: vierviertel Gestaltung, Köln, unter Verwendung einer Architekturzeichnung von Anna und Angela Krug, Bonn Übersetzung: Prof Dr Bernd Kahlbrandt Lektorat: Susanne Spitzer, sspitzer@pearson.de Korrektorat: Friederike Daenecke, Zülpich Herstellung: Anna Plenk, aplenk@pearson.de Satz: reemers publishing services gmbh, Krefeld Druck und Verarbeitung: Schoder, Gersthofen Printed in Germany Sandini Bib Für Cindy Sandini Bib Sandini Bib Inhaltsverzeichnis Vorwort des Übersetzers xiii Geleitwort xv Vorwort xvii Was ist Refaktorisieren? xviii Was finden Sie in diesem Buch? xix Warum sollten Sie dieses Buch lesen? xx Von anderen erarbeitete Grundlagen xxi Danksagungen xxii Refaktorisieren, ein erstes Beispiel 1.1 Der Ausgangspunkt 1.2 Der erste Faktorisierungsschritt 1.3 Zerlegen und Umverteilen der Methode statement 1.4 Ersetzen der Bedingung durch Polymorphismus 28 1.5 Schlussgedanken 40 Prinzipien des Refaktorisierens 41 2.1 Definition des Refaktorisierens 41 2.2 Warum sollten Sie refaktorisieren? 43 2.3 Wann sollten Sie refaktorisieren? 46 2.4 Wie sag ich’s meinem Chef? 49 2.5 Probleme beim Refaktorisieren 52 2.6 Refaktorisieren und Design 57 2.7 Refaktorisieren und Performance 60 2.8 Woher stammt Refaktorisieren? 62 Übel riechender Code 67 3.1 Duplizierter Code 68 3.2 Lange Methode 69 3.3 Große Klasse 71 3.4 Lange Parameterliste 72 3.5 Divergierende Änderungen 72 Sandini Bib viii Inhaltsverzeichnis 3.6 Schrotkugeln herausoperieren 73 3.7 Neid 74 3.8 Datenklumpen 74 3.9 Neigung zu elementaren Typen 75 3.10 Switch-Befehle 76 3.11 Parallele Vererbungshierarchien 77 3.12 Faule Klasse 77 3.13 Spekulative Allgemeinheit 77 3.14 Temporäre Felder 78 3.15 Nachrichtenketten 78 3.16 Vermittler 79 3.17 Unangebrachte Intimität 79 3.18 Alternative Klassen mit verschiedenen Schnittstellen 80 3.19 Unvollständige Bibliotheksklasse 80 3.20 Datenklassen 81 3.21 Ausgeschlagenes Erbe 81 3.22 Kommentare 82 Tests aufbauen 83 4.1 Der Wert selbst testenden Codes 83 4.2 Das JUnit-Test-Framework 86 4.3 Komponenten- und Funktionstest 92 4.4 Hinzufügen weiterer Tests 93 Hin zu einem Katalog von Faktorisierungen 99 5.1 Gliederung der Refaktorisierungen 99 5.2 Finden von Referenzierungen 101 5.3 Wie ausgereift sind diese Refaktorisierungen? 103 Methoden zusammenstellen 105 6.1 Methode extrahieren 106 6.2 Methode integrieren 114 6.3 Temporäre Variable integrieren 116 6.4 Temporäre Variable durch Abfrage ersetzen 117 6.5 Erklärende Variable einführen 121 6.6 Temporäre Variable zerlegen 125 Sandini Bib Inhaltsverzeichnis ix 6.7 Zuweisungen zu Parametern entfernen 128 6.8 Methode durch Methodenobjekt ersetzen 132 6.9 Algorithmus ersetzen 136 Eigenschaften zwischen Objekten verschieben 139 7.1 Methode verschieben 139 7.2 Feld verschieben 144 7.3 Klasse extrahieren 148 7.4 Klasse integrieren 153 7.5 Delegation verbergen 155 7.6 Vermittler entfernen 158 7.7 Fremde Methode einführen 161 7.8 Lokale Erweiterung einführen 163 Daten organisieren 169 8.1 Eigenes Feld kapseln 171 8.2 Wert durch Objekt ersetzen 175 8.3 Wert durch Referenz ersetzen 179 8.4 Referenz durch Wert ersetzen 183 8.5 Array durch Objekt ersetzen 186 8.6 Beobachtete Werte duplizieren 190 8.7 Gerichtete Assoziation durch bidirektionale ersetzen 199 8.8 Bidirektionale Assoziation durch gerichtete ersetzen 203 8.9 Magische Zahl durch symbolische Konstante ersetzen 208 8.10 Feld kapseln 209 8.11 Collection kapseln 211 8.12 Satz durch Datenklasse ersetzen 220 8.13 Typenschlüssel durch Klasse ersetzen 221 8.14 Typenschlüssel durch Unterklassen ersetzen 227 8.15 Typenschlüssel durch Zustand/Strategie ersetzen 231 8.16 Unterklasse durch Feld ersetzen 236 Bedingte Ausdrücke vereinfachen 241 9.1 Bedingung zerlegen 242 9.2 Bedingte Ausdrücke konsolidieren 244 9.3 Redundante Bedingungsteile konsolidieren 247 Sandini Bib x Inhaltsverzeichnis 9.4 Steuerungsvariable entfernen 9.5 Geschachtelte Bedingungen durch Wächterbedingungen ersetzen 254 9.6 Bedingten Ausdruck durch Polymorphismus ersetzen 259 9.7 Null-Objekt einführen 264 9.8 Zusicherung einführen 273 10 Methodenaufrufe vereinfachen 248 277 10.1 Methode umbenennen 279 10.2 Parameter ergänzen 281 10.3 Parameter entfernen 283 10.4 Abfrage von Veränderung trennen 285 10.5 Methode parametrisieren 289 10.6 Parameter durch explizite Methoden ersetzen 292 10.7 Ganzes Objekt übergeben 295 10.8 Parameter durch Methode ersetzen 299 10.9 Parameterobjekt einführen 303 10.10 set-Methode entfernen 308 10.11 Methode verbergen 312 10.12 Konstruktor durch Fabrikmethode ersetzen 313 10.13 Downcast kapseln 317 10.14 Fehlercode durch Ausnahme ersetzen 319 10.15 Ausnahme durch Bedingung ersetzen 325 11 Der Umgang mit der Generalisierung 329 11.1 Feld nach oben verschieben 330 11.2 Methode nach oben verschieben 331 11.3 Konstruktorrumpf nach oben verschieben 334 11.4 Methode nach unten verschieben 337 11.5 Feld nach unten verschieben 339 11.6 Unterklasse extrahieren 340 11.7 Oberklasse extrahieren 346 11.8 Schnittstelle extrahieren 351 11.9 Hierarchie abflachen 354 11.10 Template-Methode bilden 355 11.11 Vererbung durch Delegation ersetzen 363 11.12 Delegation durch Vererbung ersetzen 366 Sandini Bib 430 16 Literatur [Fowler, AP] Fowler, M.: Analysis Patterns: Reusable Object Models Reading, Mass.u.a.: Addison-Wesley, 1997 Ein Buch über Muster in Anwendungsbereichen Enthält eine Diskussion einer Reihe von Mustern [Gang of Four] Gamma, E., R Helm, R Johnson, und J Vlissides: Design Patterns: Elements of Reusable Object Oriented Software Reading, Mass.u.a.: Addison-Wesley 1995 Vielleicht das wichtigste einzelne Buch über objektorientiertes Design Sie können heute nicht mehr den Eindruck machen, etwas über Objektorientierung zu wissen, ohne kompetent über Strategie, Singleton und die Verantwortlichkeitskette reden zu können; auch in deutscher Übersetzung erhältlich [Jackson, 1993] Jackson, Michael: Michael Jackson’s Beer Guide Mitchell Beazley 1993 Ein nützlicher Führer zu einem Thema, das man gern praktiziert [Java Spec] Gosling, James, Bill Joy und Guy Steele: The Java Language Specification Reading, Mass.u.a.: Addison-Wesley 1996 Die Autorität für alle Java-Fragen, auch wenn eine aktualisierte Auflage wünschenswert wäre [JUnit] Beck, Kent und Erich Gamma: JUnit Open-Source Testing Framework Erhältlich über das Internet von der Homepage das Autors (http://www.MartinFowler.com) Ein unentbehrliches Werkzeug für die Arbeit mit Java Ein einfaches Framework, das Ihnen hilft, Komponententests zu schreiben, zu verwalten und auszuführen Ähnliche Frameworks stehen für Smalltalk und C++ zur Verfügung [Lea] Lea, Doug: Concurrent Programming in Java: Design Principles and Patterns Reading, Mass.u.a.: Addison-Wesley 1997 Der Compiler sollten jeden stoppen, der Runnable implementiert, ohne dieses Buch gelesen zu haben [McConnell] McConnell, Steve: Code Complete: A Practical Handbook of Software Construction Redmond, Wash.: Microsoft Press 1993 Sandini Bib 16 Literatur 431 Ein hervorragender Führer durch Programmierstil und Softwareentwicklung Vor Java geschrieben gelten fast alle seine Ratschläge immer noch [Meyer] Meyer, Bertrand: Object Oriented Software Construction Aufl Upper Saddle River, N.J.: Prentice Hall 1997 Ein sehr gutes, allerdings sehr dickes Buch über objektorientiertes Design Es enthält eine detaillierte Diskussion von »design by contract« [Opdyke] Opdyke, William F.: Refactoring Object-Oriented Frameworks Dissertation, University of Illionois at Urbana-Champaign 1992 Siehe ftp://st.cs.uiuc.edu/pub/papers/refactoring/opdyke-thesis.ps.Z Die erste umfangreichere Arbeit über das Refaktorisieren Geht es unter einem etwas akademischen und werkzeugorientierten Blickwinkel an (schließlich ist es eine Doktorarbeit), aber eine lesenswerte Quelle für die, die mehr über die Theorie des Refaktorisierens wissen wollen [Refactoring Browser] Brant, John und Don Roberts: Refactoring Browser Tool http://st-www.cs.uiuc.edu/~brant/RefactoringBrowser Die Zukunft von Softwareentwicklungswerkzeugen [Woolf] Woolf, Bobby: Null Object In: Pattern Languages of Program Design Hrsg Von R Martin, F Buschmann und D Riehle Reading, Mass.u.a.: Addison-Wesley 1998 Eine Diskussion des Null-ObjektMusters Sandini Bib Sandini Bib 17 Liste der Merksätze Seite Wenn Sie zu einem Programm etwas hinzufügen müssen und die Struktur des Programms erlaubt dies nicht auf einfache Art und Weise, so refaktorisieren Sie zunächst das Programm so, dass Sie die Erweiterung leicht hinzufügen können, und fügen sie anschließend hinzu Seite Bevor Sie zu refaktorisieren beginnen, prüfen Sie, ob Sie eine solide Menge von Testfällen haben Diese Tests müssen selbst überprüfend sein Seite 11 Beim Refaktorisieren ändern Sie Programme in kleinen Schritten Machen Sie einen Fehler, so ist er leicht zu finden Seite 13 Jeder Dummkopf kann Code schreiben, den ein Computer versteht Gute Programmierer schreiben Code, den Menschen verstehen Seite 41 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 Seite 41 Refaktorisieren (Verb): Refaktorisieren (Verb): Eine Software umstrukturieren, ohne ihr beobachtbares Verhalten zu ändern, indem man eine Reihe von Refaktorisierungen anwendet Seite 46 Drei Mal und Sie refaktorisieren Seite 55 Veröffentlichen Sie keine unausgereiften Schnittstellen Ändern Sie die Besitzverhältnisse am Code, um das Refaktorisieren zu vereinfachen Seite 82 Wenn Sie glauben, einen Kommentar zu benötigen, refaktorisieren Sie den Code, so dass jeder Kommentar überflüssig wird Seite 84 Stellen Sie sicher, dass alle Tests vollständig automatisiert werden und dass sie ihre Ergebnisse selbst überprüfen Seite 84 Eine Testsuite ist ein leistungsfähiger Fehlerdetektor, der die Zeit für die Fehlersuche dramatisch reduziert Seite 89 Führen Sie Ihre Tests oft aus Verwenden Sie Ihre Tests bei jeder Umwandlung – jeden Test mindestens einmal täglich Seite 92 Bekommen Sie einen Fehlerbericht, so schreiben Sie einen Komponententest, der den Fehler erkennt Seite 93 Es ist besser, unvollständige Tests zu schreiben und durchzuführen, als vollständige Tests nicht auszuführen Sandini Bib 434 17 Liste der Merksätze Seite 95 Denken Sie an die Randbedingungen, unter denen Dinge schief gehen können, und konzentrieren Sie Ihre Tests auf diese Seite 96 Vergessen Sie nicht, Ausnahmen zu testen, die ausgelöst werden, wenn etwas schief gegangen ist Seite 97 Lassen Sie sich durch die Furcht, nicht alle Fehler zu finden, nicht davon abhalten, die Tests zu schreiben, die die meisten Fehler finden Sandini Bib Stichwortverzeichnis A Abfrage von Veränderung trennen 285ff Beispiel 286 Motivation 285 Vorgehen 285 Ableitungsbaum 420 Account-Klasse 134, 142ff., 146f., 304, 306f., 309f., 321ff Änderung, divergierende 72 Algorithmus ersetzen 136f Motivation 136 Vorgehen 137 Allgemeinheit, spekulative 77 alternative Klassen 80 amountFor 11ff Anwendung von der Präsentation trennen 382ff., 386f Beispiel 384 Motivation 382 Vorgehen 383 API 55 Array, durch Objekt ersetzen 186, 189 Beispiel 187 Vorgehen 186 Array durch Objekt ersetzen 186ff Motivation 186 Array kapseln 219f Beispiel 219 Assoziation bidirectionale 203ff., 207 gerichtete 199f., 202 ausgeschlagenes Erbe 81 Ausnahme durch Bedingung ersetzen 325ff Beispiel 326 Motivation 325 Vorgehen 326 AWT (Abstract Windows Toolkit) 71 B back pointer siehe Rückverweis Baum, Ableitungs- 420 Bedingte Ausdrücke konsolidieren Beispiel 245f Motivation 244 Vorgehen 245 244ff Bedingten Ausdruck durch Polymorphismus ersetzen 259ff., 264 Beispiel 261 Motivation 260 Vorgehen 260 Bedingung zerlegen 242f Beispiel 243 Motivation 242 Vorgehen 242 Befehle, switch- 76 Beobachtete Werte duplizieren 190ff Beispiel 192 Motivation 190 Vorgehen 191 Betragsberechnung, verschieben der 13 Bibliotheksklasse, unvollständige 80 bidirectional, Assoziation 203, 204, 205, 207 Bidirektionale Assoziation durch gerichtete ersetzen 203ff Beispiel 205 Motivation 203 Vorgehen 204 BSD (Berkeley Software Distribution) 404 C C++-Programm Abschlussbemerkungen 403 refaktorisieren 399 Sprachelemente, die refaktorisieren erleichtern 400 Sprachelemente, die refaktorisieren erschweren 401 ChildrensPrice-Klasse 33 Code duplizierter 68 Fettdruck redundant 43 selbst testend 83ff Code-Review, Refaktorisieren und 47 Collection kapseln 211ff Beispiel 213, 217, 219 Motivation 211 Vorgehen 211 CRC card siehe Klassenkarte Customer-Klasse 1, 267 Sandini Bib 436 D DataRange siehe Zeitraum Datenbank Probleme mit 53 Programm- 419f Datenklasse 81, 381 Datenklumpen 74 Delegation durch Vererbung ersetzen 366ff Beispiel 368 Motivation 367 Vorgehen 367 Delegation verbergen 155ff Beispiel 157 Motivation 156 Vorgehen 156 Department-Klasse 348, 350f Diagramm, UML- 20, 48, 99 divergierend, Änderung 72 Downcast kapseln 317ff Beispiel 318 Motivation 317 Vorgehen 318 Dreierregel 46 duplizierter Code 68 E each Eigenes Feld kapseln 171ff Beispiel 172 Motivation 171 Vorgehen 172 Employee-Klasse 100, 229f., 232ff., 262, 275, 290, 293f., 314ff., 336, 342, 344, 348, 350f., 353, 368f EmployeeType-Klasse 235, 262 Engineer-Klasse 229 entfernen, temporäre Variable 22, 23, 24, 26 Entry-Klasse 304 Entwurfsmuster, Viererbande 32 Erbe, ausgeschlagenes 81 Ereignisbeobachter 198 Erklärende Variable einführen 121ff Beispiel 122f Motivation 121 Vorgehen 122 event listener siehe Ereignisbeobachter extreme Programmierung 48 Stichwortverzeichnis F faule Klasse 77 Fehler Komponententest 92 refaktorisieren beim Beheben 47 refaktorisieren hilft finden 45 Fehlercode durch Ausnahme ersetzen 319ff Beispiel 321ff Motivation 320 Vorgehen 320 Fehlerdektor und Testsuite 84 Feld, temporäres 78 Feld kapseln 209f Motivation 209 Vorgehen 210 Feld nach oben verschieben 330 Motivation 330 Vorgehen 330 Feld nach unten verschieben 339 Motivation 339 Vorgehen 339 Feld verschieben 144ff Beispiel 146f Motivation 145 Vorgehen 145 Female-Klasse 240 Fettdruck, Code FileReaderTester-Klasse 86ff., 90f., 94, 97 Fremde Methode einführen 161f Beispiel 162 Motivation 161 Vorgehen 162 funktionaler Test 92f G Ganzes Objekt übergeben 295ff Beispiel 297 Motivation 295 Vorgehen 296 gerichtet, Assoziation 199, 200, 202 Gerichtete Assoziation durch bidirektionale ersetzen 199ff Beispiel 200 Motivation 199 Vorgehen 200 Geschachtelte Bedingungen durch Wächterbedingung ersetzen 254ff Beispiel 256f Motivation 255 Vorgehen 255 getCharge 14, 28ff., 34ff Sandini Bib Stichwortverzeichnis getFrequentRenterPoints 30, 37 große Klasse 71 GUI-Klasse 71, 170, 192, 198, 384, 386 H herausoperieren, Schrotkugeln 73 Hierarchie abflachen 354f Motivation 354 Vorgehen 354 Hierarchie extrahieren 387ff Beispiel 389 Motivation 388 Vorgehen 388 HtmlStatement-Klasse 357f., 362 htmlStatement-Methode I Indirektion, und Refaktorisieren 50 IntervalWindow-Klasse 192, 194f., 197f Intimität, unangebrachte 79 J Java 1.1 101, 212, 217f 54, 101, 212f Wertübergabe 129f JobItem-Klasse 342ff K Klasse Account 134, 142ff., 146f., 304, 306f., 309f., 321ff ChildrensPrice 33 Customer 1, 267 Customer implements nullable 268 Daten- 81, 220 Department 348, 350f Employee 100, 229f., 232ff., 262, 275, 290, 293f., 314ff., 336, 342, 344, 348, 350f., 353, 368f EmployeeType 235, 262 Engineer 229 Entry 304 faule 77 Female 240, 316 FileReaderTester 86ff., 90f., 94, 97 große 71 GUI- 71, 170, 192, 198, 384, 386 HtmlStatement 357f., 362 IntervalWindow 192, 194f., 197f JobItem 342ff LaborItem 342ff., 346 Male 240, 316 437 Manager 264, 336 MasterTester 97 Movie 1ff., 9ff., 16, 19, 28ff., 37 NewReleasePrice- 33f., 36f NullCustomer 268 Party 349 Person 316 Price 32f., 37f RegularPrice 33 Rental 3, 13f., 18ff., 27ff Salesman 234, 264 Site 267ff., 318 Statement 357 TextStatement 358f., 361f Zeitraum 59, 305 Klasse extrahieren 148ff., 152 Beispiel 149 Motivation 148 Vorgehen 149, 153 Klasse integrieren 153ff Beispiel 154 Motivation 153 Klassen, alternative 80 Klassenkarte 48 Kommentar 82 konstante Methode 236 Konstruktor durch Fabrikmethode ersetzen 313ff Beispiel 314f Motivation 313 Vorgehen 314 Konstruktorrumpf nach oben verschieben 334ff Beispiel 336 Motivation 335 Vorgehen 335 L LaborItem-Klasse 342ff., 346 lange Methode 69 lange Parameterliste 72 Lokale Erweiterung einführen 163ff., 168 Beispiel 164ff Motivation 163 Vorgehen 164 M Magische Zahl 208f Magische Zahl durch symbolische Konstante ersetzen 208f Motivation 208 Vorgehen 209 Sandini Bib 438 Male-Klasse 240 Manager-Klasse 264, 336 MasterTester-Klasse 97 Methode htmlStatement konstant 236 lange 69 statement Methode durch Methodenobjekt ersetzen 132ff Beispiel 134 Motivation 133 Vorgehen 133 Methode extrahieren 106ff., 113 Beispiel 108ff Motivation 106 Vorgehen 107 Methode integrieren 114f Motivation 114 Vorgehen 115 Methode nach oben verschieben 331ff Beispiel 333 Motivation 331 Vorgehen 332 Methode nach unten verschieben 337f Motivation 338 Vorgehen 338 Methode parametrisieren 289ff Beispiel 290 Motivation 289 Vorgehen 290 Methode umbenennen 279ff Beispiel 280 Motivation 279 Vorgehen 280 Methode verbergen 312f Motivation 312 Vorgehen 312 Methode verschieben 139ff Beispiel 142 Motivation 140 Vorgehen 141 Methoden zusammenstellen 105 Model-View-Controller 190, 382 Movie-Klasse 1ff., 9ff., 16, 19, 28ff., 37 MVC(Model-View-Controller) 190, 382 N Nachrichtenkette 78 Neid 74 Neigung zu elementaren Typen 75 NewReleasePrice-Klasse 33f., 36f Stichwortverzeichnis NullCustomer-Klasse 268 Null-Objekt einführen 264ff Beispiel 267, 271 Motivation 265 Vorgehen 266 O Oberklasse extrahieren Beispiel 348 Motivation 346 Vorgehen 347 Objekt Referenz- 179 Wert- 179 346ff P paarweise Programmierung 48 parallele Vererbungshierarchie 77 Parameter durch explizite Methode ersetzen 292ff Beispiel 293 Motivation 292 Vorgehen 293 Parameter durch Methode ersetzen 299ff Beispiel 300 Motivation 299 Vorgehen 300 Parameter entfernen 283f Motivation 283 Vorgehen 284 Parameter ergänzen 281f Motivation 281 Vorgehen 282 Parameterliste, lange 72 Parameterobjekt einführen 303ff Beispiel 304 Motivation 303 Vorgehen 303 Party-Klasse 349 Performance und Refaktorisieren 60ff Person 316 Price-Klasse 32f., 37f Programmdatenbank 419f Programmierung extreme 48 paarweise 48 Prozedurale Entwürfe in Objekte überführen 380ff Beispiel 382 Motivation 381 Vorgehen 381 Sandini Bib Stichwortverzeichnis R Randbedingung 94 Redundante Bedingungsteile konsolidieren 247f Beispiel 248 Motivation 247 Vorgehen 247 redundanter Code 43 Refactoring Browser 417f., 422f Refaktorisieren C++-Programm 399 kurzfristige Ziele 403 Prinzipien 41ff., 49f., 52f., 55ff., 59f., 62 und Code-Review 47 und Design 57 und Indirektion 50 und Performance 60ff refaktorisieren erster Schritt Verb 41 Refaktorisieren und Performance 60ff Refaktorisierung, Substantiv 41 Refaktorisierungs-Werkzeug 417ff Referenz, Objekt 179 Referenz durch Wert ersetzen 183ff Beispiel 184 Motivation 183 Vorgehen 184 RegularPrice-Klasse 33 Rental-Klasse 3, 13f., 18ff., 27ff Rückverweis 199 S Salesman-Klasse 234, 264 Satz durch Datenklasse ersetzen 220f Motivation 220 Vorgehen 221 Schnittstelle, veröffentlichen 54 Schnittstelle extrahieren 351ff Beispiel 353 Motivation 352 Vorgehen 352 Schrotkugeln herausoperieren 73 selbst testend, Code 83, 84, 85 set-Methode entfernen 308f., 311 Beispiel 309 Motivation 308 Vorgehen 309 Site-Klasse 267ff., 318 spekulative Allgemeinheit 77 439 statement Methode, zerlegen und umverteilen Statement-Klasse 357 statement-Methode Steuerungsvariable entfernen 248ff Beispiel 250, 252 Motivation 249 Vorgehen 249 switch-Befehle 76 T Technologietransfer 414 Template-Methode bilden 355ff., 359, 361f Beispiel 356 Motivation 356 Vorgehen 356 temporäre Variable, entfernen 22, 23, 24, 26 Temporäre Variable durch Abfrage ersetzen 117ff Beispiel 119 Motivation 117 Vorgehen 118 Temporäre Variable integrieren 115f Motivation 116 Vorgehen 116 Temporäre Variable zerlegen 125f., 128 Beispiel 126 Motivation 125 Vorgehen 126 temporäres Feld 78 Test, funktional 92, 93 Testsuite, als Fehlerdetektor 84 TextStatement-Klasse 358f., 361f thisAmount Typenschlüssel durch Klasse ersetzen 221ff Beispiel 223 Motivation 221 Vorgehen 222 Typenschlüssel durch Unterklassen ersetzen 227ff Beispiel 229 Motivation 227 Vorgehen 228 Typenschlüssel durch Zustand/Strategie ersetzen 231ff Beispiel 232 Motivation 231 Vorgehen 231 Sandini Bib 440 U UML (Unified Modeling Language UML (Unified Modeling Language) 20, 48, 99 UML-Diagramm 20, 48, 99 unangebrachte Intimität 79 Unterklasse durch Feld ersetzen 236ff Beispiel 238 Motivation 236 Vorgehen 237 Unterklasse extrahieren 340, 342ff., 346 Beispiel 342 Motivation 340 Vorgehen 340 unvollständige Bibliotheksklasse 80 V Vererbung durch Delegation ersetzen 363ff Beispiel 365 Motivation 364 Vorgehen 364 Vererbungshierachie, parallele 77 Vererbungsstrukturen entzerren 374ff., 378, 380 Beispiel 376 Motivation 375 Vorgehen 375 Vermittler 79 Vermittler entfernen 158ff Beispiel 159 Motivation 159 Vorgehen 159 veröffentlichen, Schnittstelle 54 Viererbande, Entwurfsmuster 32 Stichwortverzeichnis W Werkzeug, Refaktorisierungs- 417, 418, 419, 420 Wert durch Objekt ersetzen 175ff Beispiel 176 Motivation 175 Vorgehen 175 Wert durch Referenz ersetzen 179ff Beispiel 180 Motivation 179 Vorgehen 180 Wertobjekt 179 Wertübergabe, in Java 129, 130 Z Zahl, magisch 208, 209 Zeitraum-Klasse 59, 305 Zusicherung einführen 273f., 276 Beispiel 274 Motivation 273 Vorgehen 274 Zuweisungen zu Parametern entfernen 128ff., 132 Beispiel 130 Motivation 128 Vorgehen 129 Sandini Bib Liste der Refaktorisierungen Abfrage von Veränderung trennen 285 Algorithmus ersetzen 136 Anwendung von der Präsentation trennen 382 Array durch Objekt ersetzen 186 Ausnahme durch Bedingung ersetzen 325 Bedingte Ausdrücke konsolidieren 244 Bedingten Ausdruck durch Polymorphismus ersetzen 259 Bedingung zerlegen 242 Beobachtete Werte duplizieren 190 Bidirektionale Assoziation durch gerichtete ersetzen 203 Collection kapseln 211 Delegation durch Vererbung ersetzen 366 Delegation verbergen 155 Downcast kapseln 317 Eigenes Feld kapseln 171 Erklärende Variable einführen 121 Fehlercode durch Ausnahme ersetzen 319 Feld kapseln 209 Feld nach oben verschieben 330 Feld nach unten verschieben 339 Feld verschieben 144 Fremde Methode einführen 161 Ganzes Objekt übergeben 295 Gerichtete Assoziation durch bidirektionale ersetzen 199 Geschachtelte Bedingungen durch Wächterbedingungen ersetzen Hierarchie abflachen 354 Hierarchie extrahieren 387 Klasse extrahieren 148 Klasse integrieren 153 Konstruktor durch Fabrikmethode ersetzen 313 Konstruktorrumpf nach oben verschieben 334 Lokale Erweiterung einführen 163 Magische Zahl durch symbolische Konstante ersetzen 208 Methode durch Methodenobjekt ersetzen 132 Methode extrahieren 106 Methode integrieren 114 254 Sandini Bib Methode nach oben verschieben 331 Methode nach unten verschieben 337 Methode parametrisieren 289 Methode umbenennen 279 Methode verbergen 312 Methode verschieben 139 Null-Objekt einführen 264 Oberklasse extrahieren 346 Parameter durch explizite Methoden ersetzen 292 Parameter durch Methode ersetzen 299 Parameter entfernen 283 Parameter ergänzen 281 Parameterobjekt einführen 303 Prozedurale Entwürfe in Objekte überführen 380 Redundante Bedingungsteile konsolidieren 247 Referenz durch Wert ersetzen 183 Satz durch Datenklasse ersetzen 220 Schnittstelle extrahieren 351 set-Methode entfernen 308 Steuerungsvariable entfernen 248 Template-Methode bilden 355 Temporäre Variable durch Abfrage ersetzen 117 Temporäre Variable integrieren 116 Temporäre Variable zerlegen 125 Typenschlüssel durch Klasse ersetzen 221 Typenschlüssel durch Unterklassen ersetzen 227 Typenschlüssel durch Zustand/Strategie ersetzen 231 Unterklasse durch Feld ersetzen 236 Unterklasse extrahieren 340 Vererbung durch Delegation ersetzen 363 Vererbungsstrukturen entzerren 374 Vermittler entfernen 158 Wert durch Objekt ersetzen 175 Wert durch Referenz ersetzen 179 Zusicherung einführen 273 Zuweisungen zu Parametern entfernen 128 Sandini Bib Geruch Refaktorisierungen Alternative Klassen mit verschiedenen Schnittstellen, S 80 Methode umbenennen (279) Methode verschieben (139) Ausgeschlagenes Erbe, S 81 Vererbung durch Delegation ersetzen (363) Datenklassen, S 81 Collection kapseln (211) Feld kapseln (209) Methode verschieben (139) Datenklumpen, S 74 Ganzes Objekt übergeben (295) Klasse extrahieren (148) Parameterobjekt einführen (303) Divergierende Änderungen, S 72 Klasse extrahieren (148) Duplizierter Code, S 68 Klasse extrahieren (148) Methode extrahieren (106) Methode nach oben verschieben (331) Template-Methode bilden (355) Faule Klasse, S 77 Hierarchie abflachen (354) Klasse integrieren (153) Große Klasse, S 71 Klasse extrahieren (148) Schnittstelle extrahieren (351) Unterklasse extrahieren (340) Wert durch Objekt ersetzen (175) Kommentare, S 82 Methode extrahieren (106) Zusicherung einführen (273) Lange Methode, S 69 Bedingung zerlegen (242) Methode durch Methodenobjekt ersetzen (132) Methode extrahieren (106) Temporäre Variable durch Abfrage ersetzen (117) Lange Parameterliste, S 72 Ganzes Objekt übergeben (295) Parameter durch Methode ersetzen (299) Parameterobjekt einführen (303) Nachrichtenketten, S 78 Delegation verbergen (155) Neid, S 74 Feld verschieben (144) Methode extrahieren (106) Methode verschieben (139) Neigung zu elementaren Typen, Array durch Objekt ersetzen (186) S 75 Klasse extrahieren (106) Parameterobjekt einführen (303) Typenschlüssel durch Klasse ersetzen (221) Typenschlüssel durch Unterklassen ersetzen (227) Typenschlüssel durch Zustand/Strategie ersetzen (231) Wert durch Objekt ersetzen (175) Sandini Bib Geruch Refaktorisierungen Parallele Vererbungshierarchien, S 77 Feld verschieben (144) Methode verschieben (139) Schrotkugeln herausoperieren, S 73 Feld verschieben (144) Klasse integrieren (153) Methode verschieben (139) Spekulative Allgemeinheit, S 77 Hierarchie abflachen (354) Klasse integrieren (153) Methode umbenennen (279) Parameter entfernen (283) Switch-Befehle, S 76 Bedingten Ausdruck durch Polymorphismus ersetzen (259) Null-Objekt einführen (264) Parameter durch explizite Methoden ersetzen (292) Typenschlüssel durch Unterklassen ersetzen (227) Typenschlüssel durch Zustand/Strategie ersetzen (231) Temporäre Felder, S 78 Klasse extrahieren (148) Null-Objekt einführen (264) Unangebrachte Intimität, S 79 Bidirektionale Assoziation durch gerichtete ersetzen (203) Delegation verbergen (155) Feld verschieben (144) Methode verschieben (139) Vererbung durch Delegation ersetzen (363) Unvollständige Bibliotheksklasse, S 80 Fremde Methode einführen (161) Lokale Erweiterung einführen (163) Vermittler, S 79 Delegation durch Vererbung ersetzen (366) Methode integrieren (114) Vermittler entfernen (158)

Ngày đăng: 18/04/2017, 10:53

Từ khóa liên quan

Mục lục

  • Refactoring - Wie Sie das Design vorhandener Software verbessern

  • Inhaltsverzeichnis

    • Vorwort des Übersetzers

    • Geleitwort

    • Vorwort

    • 1 Refaktorisieren, ein erstes Beispiel

    • 2 Prinzipien des Refaktorisierens

    • 3 Übel riechender Code

    • 4 Tests aufbauen

    • 5 Hin zu einem Katalog von Faktorisierungen

    • 6 Methoden zusammenstellen

    • 7 Eigenschaften zwischen Objekten verschieben

    • 8 Daten organisieren

    • 9 Bedingte Ausdrücke vereinfachen

    • 10 Methodenaufrufe vereinfachen

    • 11 Der Umgang mit der Generalisierung

    • 12 Große Refaktorisierungen

    • 13 Refaktorisieren, Recycling und Realität

    • 14 Refaktorisierungswerkzeuge

    • 15 Schlusswort

    • 16 Literatur

    • 17 Liste der Merksätze

    • Stichwortverzeichnis

  • Vorwort des Übersetzers

  • Geleitwort

  • Vorwort

    • Was ist Refaktorisieren?

    • Was finden Sie in diesem Buch?

    • Refaktorisieren in Java

    • Warum sollten Sie dieses Buch lesen?

    • Von anderen erarbeitete Grundlagen

    • Danksagungen

  • 1 Refaktorisieren, ein erstes Beispiel

    • 1.1 Der Ausgangspunkt

      • 1.1.1 Movie

      • 1.1.2 Rental

      • 1.1.3 Customer

      • 1.1.4 Kommentare zum Ausgangsprogramm

    • 1.2 Der erste Faktorisierungsschritt

    • 1.3 Zerlegen und Umverteilen der Methode

      • 1.3.1 Verschieben der Betragsberechnung

      • 1.3.2 Extrahieren der Bonuspunkte

      • 1.3.3 Entfernen temporärer Variablen

    • 1.4 Ersetzen der Bedingung durch Polymorphismus

      • 1.4.1 Zu guter Letzt ... Vererbung

    • 1.5 Schlussgedanken

  • 2 Prinzipien des Refaktorisierens

    • 2.1 Definition des Refaktorisierens

      • 2.1.1 Die zwei Hüte

    • 2.2 Warum sollten Sie refaktorisieren?

      • 2.2.1 Refaktorisieren verbessert das Design von Software

      • 2.2.2 Refaktorisieren macht Software leichter verständlich

      • 2.2.3 Refaktorisieren hilft Fehler zu finden

      • 2.2.4 Refaktorisieren hilft Ihnen schneller zu programmieren

    • 2.3 Wann sollten Sie refaktorisieren?

      • 2.3.1 Die Dreierregel

      • 2.3.2 Refaktorisieren Sie beim Hinzufügen von Funktionen

      • 2.3.3 Refaktorisieren Sie, wenn Sie einen Fehler beheben müssen

      • 2.3.4 Refaktorisieren Sie bei Code-Reviews

    • 2.4 Wie sag ich’s meinem Chef?

    • 2.5 Probleme beim Refaktorisieren

      • 2.5.1 Datenbanken

      • 2.5.2 Veränderung von Schnittstellen

      • 2.5.3 Schwer durchzuführende Entwurfsänderungen

      • 2.5.4 Wann sollten Sie nicht refaktorisieren?

    • 2.6 Refaktorisieren und Design

    • 2.7 Refaktorisieren und Performance

    • 2.8 Woher stammt Refaktorisieren?

  • 3 Übel riechender Code

    • 3.1 Duplizierter Code

    • 3.2 Lange Methode

    • 3.3 Große Klasse

    • 3.4 Lange Parameterliste

    • 3.5 Divergierende Änderungen

    • 3.6 Schrotkugeln herausoperieren

    • 3.7 Neid

    • 3.8 Datenklumpen

    • 3.9 Neigung zu elementaren Typen

    • 3.10 Befehle

    • 3.11 Parallele Vererbungshierarchien

    • 3.12 Faule Klasse

    • 3.13 Spekulative Allgemeinheit

    • 3.14 Temporäre Felder

    • 3.15 Nachrichtenketten

    • 3.16 Vermittler

    • 3.17 Unangebrachte Intimität

    • 3.18 Alternative Klassen mit verschiedenen Schnittstellen

    • 3.19 Unvollständige Bibliotheksklasse

    • 3.20 Datenklassen

    • 3.21 Ausgeschlagenes Erbe

    • 3.22 Kommentare

  • 4 Tests aufbauen

    • 4.1 Der Wert selbst testenden Codes

    • 4.2 Das JUnit-Test-Framework

    • 4.3 Komponenten- und Funktionstest

    • 4.4 Hinzufügen weiterer Tests

  • 5 Hin zu einem Katalog von Faktorisierungen

    • 5.1 Gliederung der Refaktorisierungen

    • 5.2 Finden von Referenzierungen

    • 5.3 Wie ausgereift sind diese Refaktorisierungen?

  • 6 Methoden zusammenstellen

    • 6.1 Methode extrahieren

      • 6.1.1 Motivation

      • 6.1.2 Vorgehen

      • 6.1.3 Beispiel: Ohne lokale Variablen

      • 6.1.4 Beispiel: Einsatz lokaler Variablen

      • 6.1.5 Beispiel: Neue Zuweisung einer lokalen Variablen

    • 6.2 Methode integrieren

      • 6.2.1 Motivation

      • 6.2.2 Vorgehen

    • 6.3 Temporäre Variable integrieren

      • 6.3.1 Motivation

      • 6.3.2 Vorgehen

    • 6.4 Temporäre Variable durch Abfrage ersetzen

      • 6.4.1 Motivation

      • 6.4.2 Vorgehen

      • 6.4.3 Beispiel

    • 6.5 Erklärende Variable einführen

      • 6.5.1 Motivation

      • 6.5.2 Vorgehen

      • 6.5.3 Beispiel

      • 6.5.4 Beispiel mit Methode extrahieren

    • 6.6 Temporäre Variable zerlegen

      • 6.6.1 Motivation

      • 6.6.2 Vorgehen

      • 6.6.3 Beispiel

    • 6.7 Zuweisungen zu Parametern entfernen

      • 6.7.1 Motivation

      • 6.7.2 Vorgehen

      • 6.7.3 Beispiel

      • 6.7.4 Übergabe von Werten in Java

    • 6.8 Methode durch Methodenobjekt ersetzen

      • 6.8.1 Motivation

      • 6.8.2 Vorgehen

      • 6.8.3 Beispiel

    • 6.9 Algorithmus ersetzen

      • 6.9.1 Motivation

      • 6.9.2 Vorgehen

  • 7 Eigenschaften zwischen Objekten verschieben

    • 7.1 Methode verschieben

      • 7.1.1 Motivation

      • 7.1.2 Vorgehen

      • 7.1.3 Beispiel

    • 7.2 Feld verschieben

      • 7.2.1 Motivation

      • 7.2.2 Vorgehen

      • 7.2.3 Beispiel

      • 7.2.4 Beispiel mit Kapselung eines eigenen Feldes

    • 7.3 Klasse extrahieren

      • 7.3.1 Motivation

      • 7.3.2 Vorgehen

      • 7.3.3 Beispiel

    • 7.4 Klasse integrieren

      • 7.4.1 Motivation

      • 7.4.2 Vorgehen

      • 7.4.3 Beispiel

    • 7.5 Delegation verbergen

      • 7.5.1 Motivation

      • 7.5.2 Vorgehen

      • 7.5.3 Beispiel

    • 7.6 Vermittler entfernen

      • 7.6.1 Motivation

      • 7.6.2 Vorgehen

      • 7.6.3 Beispiel

    • 7.7 Fremde Methode einführen

      • 7.7.1 Motivation

      • 7.7.2 Vorgehen

      • 7.7.3 Beispiel

    • 7.8 Lokale Erweiterung einführen

      • 7.8.1 Motivation

      • 7.8.2 Vorgehen

      • 7.8.3 Beispiele

      • 7.8.4 Beispiel: Verwenden einer Unterklasse

      • 7.8.5 Beispiel: Verwenden einer Hülle

  • 8 Daten organisieren

    • 8.1 Eigenes Feld kapseln

      • 8.1.1 Motivation

      • 8.1.2 Vorgehen

      • 8.1.3 Beispiel

    • 8.2 Wert durch Objekt ersetzen

      • 8.2.1 Motivation

      • 8.2.2 Vorgehen

      • 8.2.3 Beispiel

    • 8.3 Wert durch Referenz ersetzen

      • 8.3.1 Motivation

      • 8.3.2 Vorgehen

      • 8.3.3 Beispiel

    • 8.4 Referenz durch Wert ersetzen

      • 8.4.1 Motivation

      • 8.4.2 Vorgehen

      • 8.4.3 Beispiel

    • 8.5 Array durch Objekt ersetzen

      • 8.5.1 Motivation

      • 8.5.2 Vorgehen

      • 8.5.3 Beispiel

    • 8.6 Beobachtete Werte duplizieren

      • 8.6.1 Motivation

      • 8.6.2 Vorgehen

      • 8.6.3 Beispiel

      • 8.6.4 Die Verwendung von Ereignisbeobachtern

    • 8.7 Gerichtete Assoziation durch bidirektionale ersetzen

      • 8.7.1 Motivation

      • 8.7.2 Vorgehen

      • 8.7.3 Beispiel

    • 8.8 Bidirektionale Assoziation durch gerichtete ersetzen

      • 8.8.1 Motivation

      • 8.8.2 Vorgehen

      • 8.8.3 Beispiel

    • 8.9 Magische Zahl durch symbolische Konstante ersetzen

      • 8.9.1 Motivation

      • 8.9.2 Vorgehen

    • 8.10 Feld kapseln

      • 8.10.1 Motivation

      • 8.10.2 Vorgehen

    • 8.11 Collection kapseln

      • 8.11.1 Motivation

      • 8.11.2 Vorgehen

      • 8.11.3 Beispiele

      • 8.11.4 Beispiel: Java 2

      • 8.11.5 Verhalten in die Klasse verschieben

      • 8.11.6 Beispiel: Java 1.1

      • 8.11.7 Beispiel: Arrays kapseln

    • 8.12 Satz durch Datenklasse ersetzen

      • 8.12.1 Motivation

      • 8.12.2 Vorgehen

    • 8.13 Typenschlüssel durch Klasse ersetzen

      • 8.13.1 Motivation

      • 8.13.2 Vorgehen

      • 8.13.3 Beispiel

    • 8.14 Typenschlüssel durch Unterklassen ersetzen

      • 8.14.1 Motivation

      • 8.14.2 Vorgehen

      • 8.14.3 Beispiel

    • 8.15 Typenschlüssel durch Zustand/Strategie ersetzen

      • 8.15.1 Motivation

      • 8.15.2 Vorgehen

      • 8.15.3 Beispiel

    • 8.16 Unterklasse durch Feld ersetzen

      • 8.16.1 Motivation

      • 8.16.2 Vorgehen

      • 8.16.3 Beispiel

  • 9 Bedingte Ausdrücke vereinfachen

    • 9.1 Bedingung zerlegen

      • 9.1.1 Motivation

      • 9.1.2 Vorgehen

      • 9.1.3 Beispiel

    • 9.2 Bedingte Ausdrücke konsolidieren

      • 9.2.1 Motivation

      • 9.2.2 Vorgehen

      • 9.2.3 Beispiel: Oder

      • 9.2.4 Beispiel: Und

    • 9.3 Redundante Bedingungsteile konsolidieren

      • 9.3.1 Motivation

      • 9.3.2 Vorgehen

      • 9.3.3 Beispiel

    • 9.4 Steuerungsvariable entfernen

      • 9.4.1 Motivation

      • 9.4.2 Vorgehen

      • 9.4.3 Beispiel: Eine einfache Steuerungsvariable durch ersetzen

      • 9.4.4 Beispiel: Verwendung von return mit einer Steuerungsvariablen als Ergebnis

    • 9.5 Geschachtelte Bedingungen durch Wächterbedingungen ersetzen

      • 9.5.1 Motivation

      • 9.5.2 Vorgehen

      • 9.5.3 Beispiel

      • 9.5.4 Beispiel: Bedingungen umdrehen

    • 9.6 Bedingten Ausdruck durch Polymorphismus ersetzen

      • 9.6.1 Motivation

      • 9.6.2 Vorgehen

      • 9.6.3 Beispiel

    • 9.7 Null-Objekt einführen

      • 9.7.1 Motivation

      • 9.7.2 Vorgehen

      • 9.7.3 Beispiel

      • 9.7.4 Beispiel: Eine testende Schnittstelle

      • 9.7.5 Andere Sonderfälle

    • 9.8 Zusicherung einführen

      • 9.8.1 Motivation

      • 9.8.2 Vorgehen

      • 9.8.3 Beispiel

  • 10 Methodenaufrufe vereinfachen

    • 10.1 Methode umbenennen

      • 10.1.1 Motivation

      • 10.1.2 Vorgehen

      • 10.1.3 Beispiel

    • 10.2 Parameter ergänzen

      • 10.2.1 Motivation

      • 10.2.2 Vorgehen

    • 10.3 Parameter entfernen

      • 10.3.1 Motivation

      • 10.3.2 Vorgehen

    • 10.4 Abfrage von Veränderung trennen

      • 10.4.1 Motivation

      • 10.4.2 Vorgehen

      • 10.4.3 Beispiel

      • 10.4.4 Nebenläufigkeitsfragen

    • 10.5 Methode parametrisieren

      • 10.5.1 Motivation

      • 10.5.2 Vorgehen

      • 10.5.3 Beispiel

    • 10.6 Parameter durch explizite Methoden ersetzen

      • 10.6.1 Motivation

      • 10.6.2 Vorgehen

      • 10.6.3 Beispiel

    • 10.7 Ganzes Objekt übergeben

      • 10.7.1 Motivation

      • 10.7.2 Vorgehen

      • 10.7.3 Beispiel

    • 10.8 Parameter durch Methode ersetzen

      • 10.8.1 Motivation

      • 10.8.2 Vorgehen

      • 10.8.3 Beispiel

    • 10.9 Parameterobjekt einführen

      • 10.9.1 Motivation

      • 10.9.2 Vorgehen

      • 10.9.3 Beispiel

    • 10.10 set-Methode entfernen

      • 10.10.1 Motivation

      • 10.10.2 Vorgehen

      • 10.10.3 Beispiel

    • 10.11 Methode verbergen

      • 10.11.1 Motivation

      • 10.11.2 Vorgehen

    • 10.12 Konstruktor durch Fabrikmethode ersetzen

      • 10.12.1 Motivation

      • 10.12.2 Vorgehen

      • 10.12.3 Beispiel

      • 10.12.4 Beispiel: Unterklasse mit einem String erzeugen

      • 10.12.5 Unterklasse mit expliziten Methoden erzeugen

    • 10.13 Downcast kapseln

      • 10.13.1 Motivation

      • 10.13.2 Vorgehen

      • 10.13.3 Beispiel

    • 10.14 Fehlercode durch Ausnahme ersetzen

      • 10.14.1 Motivation

      • 10.14.2 Vorgehen

      • 10.14.3 Beispiel

      • 10.14.4 Beispiel: Nicht überwachte Ausnahme

      • 10.14.5 Beispiel: Überwachte Ausnahme

    • 10.15 Ausnahme durch Bedingung ersetzen

      • 10.15.1 Motivation

      • 10.15.2 Vorgehen

      • 10.15.3 Beispiel

  • 11 Der Umgang mit der Generalisierung

    • 11.1 Feld nach oben verschieben

      • 11.1.1 Motivation

      • 11.1.2 Vorgehen

    • 11.2 Methode nach oben verschieben

      • 11.2.1 Motivation

      • 11.2.2 Vorgehen

      • 11.2.3 Beispiel

    • 11.3 Konstruktorrumpf nach oben verschieben

      • 11.3.1 Motivation

      • 11.3.2 Vorgehen

      • 11.3.3 Beispiel

    • 11.4 Methode nach unten verschieben

      • 11.4.1 Motivation

      • 11.4.2 Vorgehen

    • 11.5 Feld nach unten verschieben

      • 11.5.1 Motivation

      • 11.5.2 Vorgehen

    • 11.6 Unterklasse extrahieren

      • 11.6.1 Motivation

      • 11.6.2 Vorgehen

      • 11.6.3 Beispiel

    • 11.7 Oberklasse extrahieren

      • 11.7.1 Motivation

      • 11.7.2 Vorgehen

      • 11.7.3 Beispiel

    • 11.8 Schnittstelle extrahieren

      • 11.8.1 Motivation

      • 11.8.2 Vorgehen

      • 11.8.3 Beispiel

    • 11.9 Hierarchie abflachen

      • 11.9.1 Motivation

      • 11.9.2 Vorgehen

    • 11.10 Template-Methode bilden

      • 11.10.1 Motivation

      • 11.10.2 Vorgehen

      • 11.10.3 Beispiel

    • 11.11 Vererbung durch Delegation ersetzen

      • 11.11.1 Motivation

      • 11.11.2 Vorgehen

      • 11.11.3 Beispiel

    • 11.12 Delegation durch Vererbung ersetzen

      • 11.12.1 Motivation

      • 11.12.2 Vorgehen

      • 11.12.3 Beispiel

  • 12 Große Refaktorisierungen

    • 12.1 Der Sinn des Spiels

    • 12.2 Warum große Refaktorisierungen so wichtig sind

    • 12.3 Vier große Refaktorisierungen

    • 12.4 Vererbungsstrukturen entzerren

      • 12.4.1 Motivation

      • 12.4.2 Vorgehen

      • 12.4.3 Beispiele

    • 12.5 Prozedurale Entwürfe in Objekte überführen

      • 12.5.1 Motivation

      • 12.5.2 Vorgehen

      • 12.5.3 Beispiel

    • 12.6 Anwendung von der Präsentation trennen

      • 12.6.1 Motivation

      • 12.6.2 Vorgehen

      • 12.6.3 Beispiel

    • 12.7 Hierarchie extrahieren

      • 12.7.1 Motivation

      • 12.7.2 Vorgehen

      • 12.7.3 Beispiel

  • 13 Refaktorisieren, Recycling und Realität

    • 13.1 Eine Nagelprobe

    • 13.2 Warum weigern sich Entwickler, ihre eigenen Programme zu refaktorisieren?

      • 13.2.1 Wie und wann refaktorisiert man?

      • 13.2.2 Refaktorisieren, um kurzfristige Ziele zu erreichen

      • 13.2.3 Den Aufwand für Refaktorisieren verringern

      • 13.2.4 Sicheres Refaktorisieren

    • 13.3 Eine zweite Nagelprobe

    • 13.4 Quellen und Belege zum Refaktorisieren

    • 13.5 Konsequenzen für Wiederverwendung und Techniktransfer

    • 13.6 Eine letzte Bemerkung

    • 13.7 Literatur

  • 14 Refaktorisierungswerkzeuge

    • 14.1 Refaktorisieren mit einem Werkzeug

    • 14.2 Technische Kriterien für ein Refaktorisierungswerkzeug

      • 14.2.1 Programmdatenbank

      • 14.2.2 Ableitungsbäume

      • 14.2.3 Genauigkeit

    • 14.3 Praktische Kriterien für ein Refaktorisierungswerkzeug

      • 14.3.1 Geschwindigkeit

      • 14.3.2 Rückgängig machen

      • 14.3.3 Integration mit Werkzeugen

      • 14.3.4 Zusammenfassung

  • 15 Schlusswort

  • 16 Literatur

  • 17 Liste der Merksätze

  • Stichwortverzeichnis

    • A

    • B

    • C

    • D

    • E

    • F

    • G

    • H

    • I

    • J

    • K

    • L

    • M

    • N

    • O

    • P

    • R

    • S

    • T

    • U

    • V

    • W

    • Z

  • Liste der Refaktorisierungen

  • Ins Internet: Weitere Infos zum Buch, Downloads, etc.

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan