Подход к улучшению структурной целостности и производительности
существующих проrрамм, называемый рефакторинrом, получил развитие блаrодаря
усилиям экспертов в области ооп, написавших эту книrу.
Каждый шаr peфакторинrа прост. Это может быть перемещение поля из одноrо класса
в дpyrой, вынесение фраrмента кода из метода и превращение ero в
самостоятельный метод или даже перемещение кода по иерархии классов.
Каждый отдельный шar может показаться элементарным, но совокупный эффект таких
мaлых изменений в состоянии радикально улучшить проект или даже предотвратить
распад плохо спроектированной проrраммы.
Мартин Фаулер с соавторами пролили свет на процесс рефакторинrа, описав
принципы и лучшие приемы ero осуществления, а также указав, rде и коrда
следует начинать уrлубленное изучение кода с целью ero улучшения.
Основу книrи составляет подробный перечень более 70 методов рефакторинrа,
для каждоrо из которых описываются мотивация и техника испытанноrо на практике
преобразования кода с примерами на Java. Рассмотренные в книrе мeтоды позволяют
поэтапно модифицировать код, внося каждый раз небольшие изменения,
блаrодаря чему снижается риск, связанный с развитием проекта.
Author(s): Фаулер Мартин (Fowler Martiп)
Publisher: Символ-Плюс
Year: 2003
Language: Russian
Pages: 428
City: Санкт-Петербург
Предисловие 13
1. Рефакторинr, первый пример 21
Исходная проrрамма 22
Первый шаr рефакторинrа 26
Декомпозиция и перераспределение метода statement 27
Замена условной лоrики на полиморфизм 49
Заключительные размышления 60
2. Принципы рефакторинrа 61
Определение рефакторинrа 61
Зачем нужно проводить рефакторинr? 63
Коrда следует проводить рефакторинr? 66
Как объяснить это своему руководителю? 69
Проблемы, возникающие при проведении рефакторинrа 71
Рефакторинr и проектирование 76
Рефакторинr и производительность 79
Каковы истоки рефакторинrа? 81
3. Код с душком 85
Дублирование кода 86
Длинный метод 87
Большой класс 88
Длинный список параметров 89
Расходящиеся модификации 90
"Стрельба дробью" 90
Завистливые функции91
Гpуппы данных 92
Одержимость элементарными типами 92
Операторы типа switch 93
Параллельные иерархии наследования 94
Ленивый класс 94
Теоретическая общность 94
Временное поле 95
Цепочки сообщений 96
Посредник 95
Неуместная близость 96
Альтернативные классы с разными интерфейсами 97
Неполнота библиотечноrо класса 97
Классы данных 98
Отказ от наследства 98
Комментарии 99
4. Разработка тестов 101
Ценность самотестирующеrося кода101
Среда тестирования JUnit 104
Добавление новых тестов 110
5. На пути к каталоry методов рефакторинrа 117
Формат методов рефакторинrа 117
Поиск ссылок 119
Насколько зрелыми являются предлаrаемые методы рефакторинrа? 120
6. Составление методов 123
Выделение метода (Extract Method) 124
Встраивание метода (Inline Method) 131
Встраивание временной переменной (Inline Теmр) 132
Замена временной переменной вызовом метода (Replace Тетр with Query) 133
Введение поясняющей переменной (Introduce Explaining Variable) 137
Расщепление временной переменной (Split Temporary Variable) 141
Удаление присваиваний параметрам (Remove Assignments to Parameters) 144
Замена метода объектом методов (Replace Method with Method Object) 148
Замещение алrоритма (Substitute AIgorithm) 151
7. Перемещение функций между объектами 153
Перемещениеметода(Моvе Меthоd) 154
Перемещение поля (Моуе Field) 158
Выделение класса (Extract Class) 161
Встраивание класса (Inline Class) 165
Сокрытие делеrирования (Hide Delegate) 168
Удаление посредника (Remove Middle Мап) 170
Введение внешнеrо метода (Introduce Foreign Method) 172
Введение локальноrо расширения (Introduce Local Extension) 174
8. Орrанизация данных 179
Самоинкапсуляция поля (Self Encapsulate Field) 181
Замена значения данных объектом (Replace Data Value with Object) 184
Замена значения ссылкой (Change Value to Reference) 187
Замена ссылки значением (Change Reference to Value) 191
Замена массива объектом (Replace Array with Object) 194
Дублирование видимых данных (Duplicate Observed Data) 197
Замена однонаправленной связи двунаправленной (Change Unidirectional Association to Bidirectional) 204
Замена двунаправленной связи однонаправленной (Change Bidirectional Association to Unidirectional) 207
Замена маrическоrо числа символической константой (Replace Magic Number with ВутЬоНс Constant) 211
Инкапсуляция поля (Encapsulate Field) 212
Инкапсуляция коллекции (Encapsulate Collection) 214
Замена записи классом данных (Replace Record with Data Class) 222
Замена кода типа классом (Replace Туре Code with Class) 223
Замена кода типа подклассами (Replace Туре Code with Subclasses) 228
Замена кода типа состоянием/стратеrией (Replace Туре Code with State/Strategy) 231
Замена подкласса полями (Replace Subclass with Fields) 236
9. Упрощение условных выражений 241
Декомпозиция условноrо оператора (Decompose Conditional) 242
Консолидация условноrо выражения (Consolidate Conditional Expression) 244
Консолидация дублирующихся условных фраrментов (Consolidate Duplicate Conditional Fragments) 246
Удаление управляющеrо флarа (Remove Control Flag) 248
Замена вложенных условных операторов rраничным оператором (Replace Nested Conditional with Guard Clauses) 253
Замена условноrо оператора полиморфизмом (Replace Conditional with Polymorphism) 258
Введение объекта Null (Introduce Null Object) 262
Введение утверждения (Introduce Assertion) 270
10. Упрощение вызовов методов 275
Переименование метода (Rename Method) 277
Добавление параметра (Add Parameter) 279
Удаление параметра (Remove Parameter) 280
Разделение запроса и модификатора (Separate Query from Modifier) 282
Параметризация метода (Parameterize Method) 286
Замена параметра явными методами (Replace Parameter with Explicit Methods) 288
Сохранение Bcero объекта (Preserve Whole Object) 291
Замена параметра вызовом метода (Replace Parameter with Method) 294
Введение rраничноrо объекта (Introduce Parameter Object) 297
Удаление метода установки значения (Remove Setting Method) 302
Сокрытие метода (Hide Method) 305
Замена конструктора фабричным методом (Replace Constructor with Factory Method) 306
Инкапсуляция нисходящеrо преобразования типа (Encapsulate Downcast) 310
Замена кода ошибки исключительной ситуацией (Replace Error Code with Exception) 312
Замена исключительной ситуации проверкой (Replace Exception with Test) 317
11. Решение задач обобщения 321
Подъем поля (Рull Up Field) 322
Подъем метода (Рull Up Method) 323
Подъем тела конструктора (Рull Up Constructor Body) 326
Спуск метода (Push Down Method) 328
Спуск поля (Push Down Field) 329
Выделение подкласса (Extract Subclass) 330
Выделение родительскоrо класса (Extract Superclass) 336
Выделение интерфейса (Extract Interface) 341
Свертывание иерархии (Соllарве Hierarchy) 343
Формирование шаблона метода (Form Template Method) 344
Замена наследования делеrированием (Replace Inheritance with Delegation) 352
Замена делеrирования наследованием (Replace Delegation with Inheritance) 354
12. Крупные рефакторинrи 357
Разделение наследования (Теаве Apart Inheritance) 360
Преобразование процедурноrо проекта в объекты Convert Procedural Design to Objects) 366
Отделение предметной области от представления Separate Domain from Presentation) 367
Выделение иерархии (Extract Hierarchy) 372
13. Рефакторинr, повторное использование и реальность 377
Проверка в реальных условиях 378
Почему разработчики не хотят применять рефакторинr к своим проrраммам? 380
Возращаясь к проверке в реальных условиях 394
Ресурсы и ссылки, относящиеся к рефакторинrу 395
Последствия повторноrо использования проrраммноrо обеспечения и передачи технолоrий 395
Завершающее замечание 397
Библиоrрафия 397
14. Инструментальные средства проведения рефакторинrа 401
Рефакторинr с использованием инструментальных средств 401
Технические критерии для инструментов проведения рефакторинrа 403
Практические критерии для инструментов рефакторинrа 406
Краткое заключение 407
15. Складывая все вместе 409
Библиоrрафия 413
Список примечаний 416
Алфавитный указатель 418
Источники неприятных запахов 429