목차
서문 ... 4
추천사 ... 12
옮긴이의 말 ... 14
CHAPTER 01 맛보기 예제
   원래의 프로그램 ... 24
   리팩토링 첫 단계 ... 29
statement 메서드 분해와 기능 재분배 ... 30
   가격 책정 부분의 조건문을 재정의로 교체 ... 56
   고찰 ... 74
CHAPTER 02 리팩토링 개론
   리팩토링은 무엇인가 ... 75
   리팩토링은 왜 해야 하나 ... 77
   리팩토링은 어떨 때 필요한가 ... 80
   팀장에게 어떻게 말을 꺼내나 ... 84
   리팩토링 관련 문제들 ... 86
   리팩토링과 설계 ... 90
   리팩토링과 성능 ... 94
   리팩토링의 유래 ... 96
CHAPTER 03 코드의 구린내
   중복 코드(Duplicated Code) ... 100
   장황한 메서드(Long Method) ... 101
   방대한 클래스(Large Class) ... 102
   과다한 매개변수(Long Parameter List) ... 103
   수정의 산발(Divergent Change) ... 104
   기능의 산재(Shotgun Surgery) ... 105
   잘못된 소속(Feature Envy) ... 105
   데이터 뭉치(Data Clumps) ... 106
   강박적 기본 타입 사용(Primitive Obsession) ... 107
switch 문(Switch Statements) ... 108
   평행 상속 계층(Parallel Inheritance Hierarchies) ... 109
   직무유기 클래스(Lazy Class) ... 109
   막연한 범용 코드(Speculative Generality) ... 110
   임시 필드(Temporary Field) ... 110
   메시지 체인(Message Chains) ... 111
   과잉 중개 메서드(Middle Man) ... 112
   지나친 관여(Inappropriate Intimacy) ... 112
   인터페이스가 다른 대용 클래스(Alternative Classes with Different Interfaces) ... 113
   미흡한 라이브러리 클래스(Incomplete Library Class) ... 113
   데이터 클래스(Data Class) ... 114
   방치된 상속물(Refused Bequest) ... 114
   불필요한 주석(Comments) ... 115
CHAPTER 04 테스트 작성
   자가 테스트 코드의 가치 ... 117
   JUnit 테스트 프레임워크 ... 120
   테스트 추가 ... 128
CHAPTER 05 리팩토링 기법 카탈로그에 대해
   각 리팩토링 기법 절의 구성 ... 135
   참조 검색 ... 137
   리팩토링 기법의 성숙도 ... 138
CHAPTER 06 메서드 정리
   메서드 추출(Extract Method) ... 142
   메서드 내용 직접 삽입(Inline Method) ... 150
   임시변수 내용 직접 삽입(Inline Temp) ... 152
   임시변수를 메서드 호출로 전환(Replace Temp with Query) ... 153
   직관적 임시변수 사용(Introduce Explaining Variable) ... 157
   임시변수 분리(Split Temporary Variable) ... 162
   매개변수로의 값 대입 제거(Remove Assignments to Parameters) ... 166
   메서드를 메서드 객체로 전환(Replace Method with Method Object) ... 170
   알고리즘 전환(Substitute Algorithm) ... 174
CHAPTER 07 객체 간의 기능 이동
   메서드 이동(Move Method) ... 178
   필드 이동(Move Field) ... 183
   클래스 추출(Extract Class) ... 187
   클래스 내용 직접 삽입(Inline Class) ... 192
   대리 객체 은폐(Hide Delegate) ... 195
   과잉 중개 메서드 제거(Remove Middle Man) ... 198
   외래 클래스에 메서드 추가(Introduce Foreign Method) ... 201
   국소적 상속확장 클래스 사용(Introduce Local Extension) ... 203
CHAPTER 08 데이터 체계화
   필드 자체 캡슐화(Self Encapsulate Field) ... 211
   데이터 값을 객체로 전환(Replace Data Value with Object) ... 215
   값을 참조로 전환(Change Value to Reference) ... 219
   참조를 값으로 전환(Change Reference to Value) ... 224
   배열을 객체로 전환(Replace Array with Object) ... 227
   관측 데이터 복제(Duplicate Observed Data) ... 231
   클래스의 단방향 연결을 양방향으로 전환(Change Unidirectional Association to Bidirectional) ... 240
   클래스의 양방향 연결을 단방향으로 전환(Change Bidirectional Association to Unidirectional) ... 244
   마법 숫자를 기호 상수로 전환(Replace Magic Number with Symbolic Constant) ... 248
   필드 캡슐화(Encapsulate Field) ... 250
   컬렉션 캡슐화(Encapsulate Collection) ... 252
   레코드를 데이터 클래스로 전환(Replace Record with Data Class) ... 262
   분류 부호를 클래스로 전환(Replace Type Code with Class) ... 263
   분류 부호를 하위클래스로 전환(Replace Type Code with Subclasses) ... 269
   분류 부호를 상태/전략 패턴으로 전환(Replace Type Code with State/Strategy) ... 273
   하위클래스를 필드로 전환(Replace Subclass with Fields) ... 279
CHAPTER 09 조건문 간결화
   조건문 쪼개기(Decompose Conditional) ... 286
   중복 조건식 통합(Consolidate Conditional Expression) ... 288
   조건문의 공통 실행 코드 빼내기(Consolidate Duplicate Conditional Fragments) ... 291
   제어 플래그 제거(Remove Control Flag) ... 293
   여러 겹의 조건문을 감시 절로 전환(Replace Nested Conditional with Guard Clauses) ... 299
   조건문을 재정의로 전환(Replace Conditional with Polymorphism) ... 305
   Null 검사를 널 객체에 위임(Introduce Null Object) ... 310
   어설션 넣기(Introduce Assertion) ... 319
CHAPTER 10 메서드 호출 단순화
   메서드명 변경(Rename Method) ... 325
   매개변수 추가(Add Parameter) ... 327
   매개변수 제거(Remove Parameter) ... 329
   상태 변경 메서드와 값 반환 메서드를 분리(Separate Query from Modifier) ... 331
   메서드를 매개변수로 전환(Parameterize Method) ... 336
   매개변수를 메서드로 전환(Replace Parameter with Explicit Methods) ... 338
   객체를 통째로 전달(Preserve Whole Object) ... 342
   매개변수 세트를 메서드로 전환(Replace Parameter with Method) ... 347
   매개변수 세트를 객체로 전환(Introduce Parameter Object) ... 351
   쓰기 메서드 제거(Remove Setting Method) ... 357
   메서드 은폐(Hide Method) ... 361
   생성자를 팩토리 메서드로 전환(Replace Constructor with Factory Method) ... 362
   하향 타입 변환을 캡슐화(Encapsulate Downcast) ... 367
   에러 부호를 예외 통지로 교체(Replace Error Code with Exception) ... 369
   예외 처리를 테스트로 교체(Replace Exception with Test) ... 374
CHAPTER 11 일반화 처리
   필드 상향(Pull Up Field) ... 380
   메서드 상향(Pull Up Method) ... 381
   생성자 내용 상향(Pull Up Constructor Body) ... 385
   메서드 하향(Push Down Method) ... 388
   필드 하향(Push Down Field) ... 389
   하위클래스 추출(Extract Subclass) ... 390
   상위클래스 추출(Extract Superclass) ... 397
   인터페이스 추출(Extract Interface) ... 403
   계층 병합(Collapse Hierarchy) ... 406
   템플릿 메서드 형성(Form Template Method) ... 407
   상속을 위임으로 전환(Replace Inheritance with Delegation) ... 416
   위임을 상속으로 전환(Replace Delegation with Inheritance) ... 419
CHAPTER 12 복합 리팩토링
   상속 구조 정리(Tease Apart Inheritance) ... 426
   절차 코드를 객체로 전환(Convert Procedural Design to Objects) ... 432
   도메인 로직을 표현과 분리(Separate Domain from Presentation) ... 434
   계층구조 추출(Extract Hierarchy) ... 439
CHAPTER 13 리팩토링, 재사용, 현실성
   현실성 검토 ... 444
   개발자가 리팩토링을 꺼리는 이유 ... 445
   현실성 다시 검토하기 ... 459
   리팩토링 자료와 참고문헌 ... 460
   소프트웨어 재사용과 기술 변경이 미치는 영향 ... 461
   끝 인사 ... 462
   참고문헌 ... 462
CHAPTER 14 리팩토링 도구
   도구를 이용한 리팩토링 ... 467
   리팩토링 도구의 기술적 요건 ... 469
   리팩토링 도구의 실무적 요건 ... 472
   맺음말 ... 473
CHAPTER 15 조각 맞추기
   부록 A 참고문헌 ... 481
   부록 B 주요 지침과 정의 ... 485
   부록 C 리팩토링 기법 찾아보기 ... 487
   부록 D 구린내와 탈취 기법 ... 491
찾아보기 ... 493
닫기