Object Oriented Reengineering Patterns

Object Oriented Reengineering Patterns

  • ただいまウェブストアではご注文を受け付けておりません。 ⇒古書を探す
  • 製本 Hardcover:ハードカバー版/ページ数 282 p.
  • 言語 ENG,ENG
  • 商品コード 9781558606395
  • DDC分類 005.117

Full Description


The documentation is missing or obsolete, and the original developers have departed. Your team has limited understanding of the system, and unit tests are missing for many, if not all, of the components. When you fix a bug in one place, another bug pops up somewhere else in the system. Long rebuild times make any change difficult. All of these are signs of software that is close to the breaking point. Many systems can be upgraded or simply thrown away if they no longer serve their purpose. Legacy software, however, is crucial for operations and needs to be continually available and upgraded. How can you reduce the complexity of a legacy system sufficiently so that it can continue to be used and adapted at acceptable cost? Based on the authors' industrial experiences, this book is a guide on how to reverse engineer legacy systems to understand their problems, and then reengineer those systems to meet new demands. Patterns are used to clarify and explain the process of understanding large code bases, hence transforming them to meet new requirements. The key insight is that the right design and organization of your system is not something that can be evident from the initial requirements alone, but rather as a consequence of understanding how these requirements evolve. It describes how to reverse engineer a monolithic system to understand how it really works and how to identify potential problems. It includes reengineering patterns that tackle well-known reengineering techniques often encountered in object-oriented programming, such as introducing polymorphism, factoring out common behavior, detecting duplicated code, and understanding design, and shows how to build a culture of continuous reengineering for achieving flexible and maintainable object-oriented systems.

Table of Contents

Preface                                            xvii
Reengineering Patterns 1 (14)
Why Do We Reengineer? 1 (3)
What's Special about Objects? 4 (1)
The Reengineering Life Cycle 5 (4)
Reengineering Patterns 9 (2)
The Form of a Reengineering Pattern 11 (1)
A Map of Reengineering Patterns 11 (4)
PART I Reverse Engineering 15 (104)
Setting Direction 17 (10)
Forces 17 (1)
Overview 18 (9)
Agree on Maxims 18 (1)
Appoint a Navigator 19 (1)
Speak to the Round Table 20 (1)
Most Valuable First 20 (3)
Fix Problems, Not Symptoms 23 (1)
If It Ain't Broke, Don't Fix It 24 (1)
Keep It Simple 24 (3)
First Contact 27 (38)
Forces 27 (2)
Overview 29 (1)
What Next 30 (35)
Chat with the Maintainers 31 (7)
Read All the Code in One Hour 38 (6)
Skim the Documentation 44 (6)
Interview during Demo 50 (8)
Do a Mock Installation 58 (7)
Initial Understanding 65 (30)
Forces 65 (2)
Overview 67 (1)
What Next 67 (28)
Analyze the Persistent Data 68 (8)
Speculate about Design 76 (8)
Study the Exceptional Entities 84 (11)
Detailed Model Capture 95 (24)
Forces 95 (1)
Overview 96 (1)
What Next 97 (22)
Tie Code and Questions 98 (5)
Refactor to Understand 103 (4)
Step through the Execution 107 (2)
Look for the Contracts 109 (4)
Learn from the Past 113 (6)
PART II Reengineering 119 (134)
Tests: Your Life Insurance! 121 (26)
Forces 121 (1)
Overview 122 (25)
Write Tests to Enable Evolution 123 (5)
Grow Your Test Base Incrementally 128 (2)
Use a Testing Framework 130 (6)
Test the Interface, Not the Implementation 136 (3)
Record Business Rules as Tests 139 (3)
Write Tests to Understand 142 (5)
Migration Strategies 147 (26)
Forces 147 (1)
Overview 147 (26)
Involve the Users 149 (2)
Build Confidence 151 (2)
Migrate Systems Incrementally 153 (2)
Prototype the Target Solution 155 (2)
Always Have a Running Version 157 (2)
Regression Test after Every Change 159 (1)
Make a Bridge to the New Town 160 (3)
Present the Right Interface 163 (1)
Distinguish Public from Published 164 (2)
Interface
Deprecate Obsolete Interfaces 166 (2)
Conserve Familiarity 168 (1)
Use Profiler before Optimizing 169 (4)
Detecting Duplicated Code 173 (14)
Forces 173 (1)
Overview 174 (13)
Compare Code Mechanically 175 (5)
Visualize Code as Dotplots 180 (7)
Redistribute Responsibilities 187 (28)
Forces 187 (1)
Overview 188 (27)
Move Behavior Close to Data 190 (9)
Eliminate Navigation Code 199 (9)
Split Up God Class 208 (7)
Transform Conditionals to Polymorphism 215 (38)
Forces 215 (1)
Overview 216 (37)
Transform Self Type Checks 217 (8)
Transform Client Type Checks 225 (9)
Factor Out State 234 (3)
Factor Out Strategy 237 (3)
Introduce Null Object 240 (3)
Transform Conditionals into Registration 243 (10)
Appendix Thumbnail patterns 253 (6)
Testing Patterns 253 (1)
A.1 Retest Persistent Problems 253 (1)
A.2 Test fuzzy Features 254 (1)
A.3 Test Old Bugs 254 (1)
Refactorings 254 (2)
A.4 Encapsulate Field 254 (1)
A.5 Extract Method 255 (1)
A.6 Move Method 255 (1)
A.7 Rename Attribute 255 (1)
A.8 Rename Method 255 (1)
A.9 Replace Conditional with Polymorphism 255 (1)
Design Patterns 256 (3)
A.10 Abstract Factory 256 (1)
A.11 Adapter 256 (1)
A.12 Facade 256 (1)
A.13 Factory Method 256 (1)
A.14 Flyweight 256 (1)
A.15 Null Object 257 (1)
A.16 Quantity 257 (1)
A.17 Singleton 257 (1)
A.18 State 257 (1)
A.19 State Patterns 257 (1)
A.20 Strategy 258 (1)
A.21 Template Method 258 (1)
A.22 Visitor 258 (1)
References 259 (8)
Index 267