목차
저자서문 ... 3
역자서문 ... 4
이 책의 특징 ... 6
이 책의 독자 ... 7
이 책의 구성 ... 8
이 책의 샘플 프로그램 ... 9
이 책의 그림에 개해서 ... 19
00 리팩토링이란
리팩토링이란
리팩토링의 정의 ... 28
리팩토링 퀴즈 ... 28
리팩토링과 유닛테스트(Unit test) ... 29
리팩토링의 목적 ... 30
리팩토링의 한계 ... 32
리팩토링과 코드의 악취 ... 33
코드릐 악취란 ... 33
코드의 악취를 나타내는 표현 ... 35
리팩토링 카탈로그 ... 39
리팩토링 카탈로그란 ... 39
조직적 수정 ... 39
리팩토링의 에센스 ... 40
Step by Step: 한 번에 2개씩 수정하지 않는다 ... 40
Step by Step: 후에 돌아오기 쉽게 ... 41
Step by Step: 단계마다 확인 ... 41
step by step: 오래된 것을 새로운 것으로 바꿔가자 ... 42
리팩토링 Q&A ... 42
리팩토링은 만병통치약인가 ... 42
리팩토링을 배우는 것은 가치가 있는가 ... 43
움직이는 코드에 손을 대는 것은 좋은 것인가? ... 43
어디까지가 '외부'인가 ... 44
초기 설계를 제대로 해두는 것이 유효하지 않을까 ... 44
적절한 리팩토링을 발견하는 것은 ... 45
모두 기억할 필요가 있는가 ... 45
익스트림 프로그래밍과 관계가 있는가 ... 46
디자인 패턴과 관계가 있는가 ... 46
지금의 현장 업부에서 리팩토링은 어렵다? ... 46
연습문제 ... 48
01 소스에 '100'이라고 쓰여져 있다면 매직넘버를 심볼릭 정수로 치환하기
리팩토링 ... 50
매직넘버는 심볼릭 정수로 치환하기 ... 50
샘플 프로그램 ... 53
리팩토링전 ... 53
리팩토링 실행 ... 56
리팩토링후 ... 59
생각 넓히기 ... 61
타입코드를 클래스로 치환하기 ... 61
enum ... 63
심볼릭 정수로 하지 말아야 하는 경우 ... 64
바이트코드에 쓰여있는 정수에 주의 ... 65
연습문제 ... 67
02 제어 플래그 때문에 코드를 읽기 힘들다면 제어 플래그의 삭제
리팩토링 ... 70
제어 플래그의 삭제 ... 70
샘플 프로그램(Findint) ... 72
리팩토링전 ... 72
리팩토링실행(break를 사용하는 경우) ... 74
리팩토링 실핼(retum을 사용하는 경우) ... 75
샘플 프로그램(SimpleDatabase) ... 76
리팩토링전 ... 77
리팩토링 실행 ... 79
생각 넓히기 ... 82
break나 retum으로 인해 가족성이 높아지는 이유 ... 82
인스턴트 필드로 된 제어 플래그의 위험성 ... 83
플래그의 이름 ... 84
boolean 이외의 플래그 ... 85
정규표현 패키지를 사용해 보면 ... 85
연습문제 ... 88
03 '이것이 성립될 것'이라고 하는 주석이 있으면 assertion의 도입
리팩토링 ... 90
assertion의 도입 ... 90
샘플 프로그램 ... 92
리팩토링전 ... 92
리팩토링 실행 ... 95
리팩토링후 ... 96
컴파일과 실행 ... 98
assertion의 동작 확인하기 ... 100
생각 넓히기 ... 102
Jave의 assertion 기법 ... 102
assertion은 오류처리 대신에는 쓸 수 없다 ... 104
Jave의 assertion은 클래스 라이브러리가 아니다 ... 104
assertion의 완전 삭제 ... 105
그외의 언어 환경에서의 assertion ... 105
연습문제 ... 106
04 Null 체크가 너무 많다면 NULL 오브젝트 도입
리팩토링 ... 108
Null 오브젝트의 조입 ... 108
샘플 프로그램 ... 110
리팩토링전 ... 111
리팩토링 실행 ... 114
리팩토링후 ... 118
생각 넓히기 ... 120
Factory Method 패턴 ... 120
Singleton 패턴 ... 120
Null 오브젝트로 네스트란 클래스를 사용 ... 120
Null 체크는 모두 나쁘다? ... 123
패턴광이 되지 않게 ... 123
정수로서의 Null 오브젝트 ... 124
isNull 메소드는 필요한 것인가 ... 125
원래 클래스를 수정할 수 없을 때는 어떻게 할까? ... 125
연습문제 ... 126
05 코드가 너무 길어 읽기 힘들다면 메소드의 추출
리팩토링 ... 128
메소드의 추출 ... 128
샘플 프로그램 ... 131
리팩토링전 ... 131
리팩토링 실행 ... 133
리팩토링후 ... 136
생각 넓히기 ... 138
역 리팩토링 ... 138
메소드의 추출은 당연하다? ... 138
메소드는 길어져 가는 것 ... 139
연습문제 ... 141
06 클래스의 책임이 너무 많다면 클래스의 추출
리팩토링 ... 144
클래스의 추출 ... 144
샘플 프로그램 ... 148
리팩토링전 ... 149
리팩토링 실행 ... 152
리팩토링후 ... 156
생각 넓히기 ... 158
쌍방향 링크는 피한다 ... 158
기능추가와 리팩토링 ... 158
Immutable Interface ... 159
역 리팩토링 클래스의 인라인화 ... 161
연습문제 ... 162
07 오브젝트 식별에 int가 사용되고 있다면 타입코드를 클래스로 치환하기
리팩토링 ... 164
타입코드를 클래스로 치환하기 ... 164
샘플 프로그램 ... 167
리팩토링전 ... 168
기본형을 사용하는 타입코드의 문제점 ... 170
리팩토링 실행 ... 171
리팩토링후 ... 174
생각 넓히기 ... 177
기본형을 사용한 타입코드의 문제점 ... 177
enum ... 177
연습문제 ... 179
08 타입코드마다 동작이 다르다면(1) 타입코드를 서브클래스로 치환하기
리팩토링 ... 182
타입코드를 서브클래스로 치환 ... 182
구조와 동작 ... 185
샘플 프로그램 ... 186
리팩토링전 ... 186
리팩토링 실행 ... 190
리팩토링 후 ... 192
생각 넓히기 ... 196
switch문과 instanceof 연산자는 코드의 악취가 난다 ... 196
오브젝트만 생성하는 switch문은 삭제 ... 196
Factory Method를 여러 개 준비한다 ... 198
어디까지 리팩토링해야 하는가 ... 199
연습문제 ... 201
09 타입코드마다 동작이 다르다면(2) 타입코드를 State/Strategy로 치환하기
리팩토링 ... 204
타입코드를 State/Strategy로 치환하기 ... 204
샘플 프로그램 ... 208
리팩토링전 ... 208
리팩토링 실행 ... 212
리팩토링후 ... 216
코드의 추가 수정 ... 218
enum 사용하기 ... 219
상태의존 코드를 상태 오브젝트로 이동하기 ... 220
정리하기 ... 222
생각 넓히기 ... 224
타입코드를 치환한 3개의 방법 비교 ... 224
'State 패턴'과 Strategy 패턴'의 차이점 ... 225
다형적인 해결과 default의 소실 ... 226
연습문제 ... 227
10 오류 처리가 어지럽게 흩어져 있다면 오류 코드를 예외로 치환하기
리팩토링 ... 230
오류 코드를 예외로 치환하기 ... 230
샘플 프로그램 ... 232
리팩토링전 ... 233
리팩토링 실행 ... 240
리팩토링후 ... 243
코드의 추가 수정 ... 246
타입코드를 State/Strategy로 치환하기 ... 246
생각 넓히기 ... 251
체크되는 예외와 체크되지 않는 예외 ... 251
예외의 계층 ... 252
Java.io.EOFException을 둘러싼 ... 253
체크되지 않는 예외와 사전 체크용 메소드 ... 254
오류 아토믹성 ... 255
연습문제 ... 256
11 클래스명이 new로 하드코딩 되어 있다면 생성자를 Factory Method로 치환하기
리팩토링 ... 258
생성자를 Factory Method로 치환하기 ... 258
샘플 프로그램 ... 261
리팩토링전 ... 262
리팩토링 실행 ... 267
리팩토링후 ... 268
타입코드를 서브클래스로 치환하는 리팩토링의 실핼 ... 271
리팩토링후 ... 272
생각 넓히기 ... 275
프로바이더(provider) ... 275
인수의 문제 ... 276
Factory Method와 Creation Method ... 277
연습문제 ... 278
12 모델과 뷰가 혼재되어 있다면 관찰되는 데이터의 복제
리팩토링 ... 282
관찰되는 데이터의 복제 ... 282
샘플 프로그램 ... 285
리팩토링전 ... 286
리팩토링 실행 ... 289
리팩토링후 ... 294
생각 넓히기 ... 297
이벤트에 포함된 정보 ... 297
무엇을 이벤트 리스너로 할까 ... 298
무한 루프에 주의 ... 298
별도의 이벤트 리스너 추가 ... 299
연습문제 ... 304
13 IS-A 관계가 아님에도 불구하고 상속하고 있다면 상속을 위임으로 치환하기
상속과 위임 ... 306
상속 ... 306
위임 ... 307
상속과 위임의 비교 ... 307
리팩토링 ... 308
상속을 위임으로 치환하기 ... 308
샘플 프로그램 ... 311
리팩토링전 ... 312
의문 ... 316
리팩토링 실행 ... 317
리팩토링후 ... 319
Chain Constructors ... 321
생각 넓히기 ... 322
상속은 최후의 무기 ... 322
리스코프의 치환원칙 ... 323
IS-A 관계와 HAS-A 관계 ... 324
연습문제 ... 325
14 위임 클래스까지 보인다면 위임의 은폐
리팩토링 ... 328
위임의 은폐 ... 328
샘플 프로그램 ... 331
리팩토링전 ... 333
첫 번째 리팩토링의 실행 ... 336
첫 번째 리팩토링후 ... 338
두 번째 리팩토링 실행 ... 340
두 번째 리팩토링후 ... 342
생각 넓히기 ... 343
숨기는 것의 중요성 ... 343
다양한 은패 ... 344
중개자의 삭제 ... 347
클래스의 인라인화 ... 348
연습문제 ... 349
15 상속이 얽혀 있다면 상속의 분할
리팩토링 ... 352
상속의 분할 ... 352
샘플 프로그램 ... 355
리팩토링전 ... 357
의문점 ... 363
리팩토링 실행 ... 364
리팩토링후 ... 370
생각 넓히기 ... 375
직교성 ... 375
상속과Override ... 377
연습문제 ... 380
부록 A 리팩토링 목록 ... 381
부록 B Junit ... 421
부록 C 참고문서와 웹사이트 ... 433
연습문제 해답 ... 437
찾아보기 ... 465
닫기