(no subject)

May 10, 2007 23:30

Дочитал Фейерштейна

Сейчас читаю
Мартин Фаулер
Рефакторинг: улучшение существующего кода
СПб.: Символ-Плюс, 2007 г., 432 стр.

Перевод с англ. С. Маккавеева
Refactoring: Improving the Design of Existing Code by Martin Fowler with contributions by Kent Beck, John Brant, William Opdyke, and Don Roberts

Thanks to rymata.

На этой странице:
Краткое содержание

11 .... Вступительное слово. Erich Gamma, Object Technology International, Inc.
13 .... Предисловие
20 .... 1. Рефакторинг, первый пример
61 .... 2. Принципы рефакторинга
85 .... 3. Код с душком
101 ... 4. Разработка тестов
117 ... 5. На пути к каталогу методов рефакторинга
123 ... 6. Составление методов
153 ... 7. Перемещение функций между объектами
179 ... 8. Организация данных
241 ... 9. Упрощение условных выражений
275 ... 10. Упрощение вызовов методов
321 ... 11. Решение задач обобщения
357 ... 12. Крупные рефакторинги. Кент Бек и Мартин Фаулер
377 ... 13. Рефакторинг, повторное использование и реальность. Уильям Апдайк
401 ... 14. Инструментальные средства проведения рефакторинга. Дон Робертс и Джон Брант
409 ... 15. Складывая все вместе. Кент Бек
413 ... Библиография
416 ... Список примечаний
418 ... Алфавитный указатель
429 ... Источники неприятных запаховПолное содержание


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

стр. 37
стр. 64
стр. 66
стр. 79
стр. 115
стр. 119
стр. 141
стр. 158
стр. 168
стр. 314
стр. 317
стр. 390

стр. 37
Я стараюсь по возможности избавляться от таких временных переменных. Временные
переменные вызывают массу проблем, потому что из-за них приходится пересылать
массу параметров там, где этого можно не делать. Можно легко забыть, для чего эти
переменные введены. Особенно коварными они могут оказаться в длинных методах.
Конечно, приходится расплачиваться снижением производительности: теперь сумма
оплаты стала у нас вычисляться дважды. Но это можно оптимизировать в классе
аренды, и оптимизация оказывается значительно эффективнее, когда код правильно
разбит на классы.

стр. 64
Но программа адресована не только компьютеру. Пройдет некоторое время, и кому-
нибудь понадобится прочесть ваш код, чтобы внести какие-то изменения. Об этом
пользователе кода часто забывают, но он-то и есть главный. Станет ли кто-нибудь
волноваться из-за того, что компьютеру для компиляции потребуется несколько
дополнительных циклов? Зато важно, что программист может потратить неделю на
модификацию кода, которая заняла бы у него лишь час, будь он в состоянии
разобраться в коде.

стр. 66
Я совершенно уверен, что хороший дизайн системы важен для быстрой разработки
программного обеспечения. Действительно, весь смысл хорошего дизайна в том,
чтобы сделать возможной быструю разработку. Без него можно некоторое время
быстро продвигаться, но вскоре плохой дизайн становится тормозом. Время будет
тратиться не на добавление новых функций, а на поиск и исправление ошибок.
Модификация занимает больше времени, когда приходится разбираться в системе и
искать дублирующий код. Добавление новых функций требует большего объема
кодирования, когда на исходный код наложено несколько слоев заплаток.

Хороший дизайн важен для сохранения скорости разработки программного обеспечения.
Благодаря рефакторингу программы разрабатываются быстрее, т. к. он удерживает
композицию системы от распада. С его помощью можно даже улучшить дизайн.

стр. 79
Даже если вы точно знаете, как работает система, не занимайтесь гаданием, а
проведите замеры. Полученная информация в девяти случаях из десяти покажет,
что ваши догадки были ошибочны!

стр. 115
(про тестирование) Всегда есть риск что-то пропустить, но лучше потратить
разумное время, чтобы выявить большинство ошибок, чем потратить вечность,
пытаясь найти их все.

стр. 119
Я настоятельно рекомендую избегать применения double для денежных величин
в коммерческих программах. Для представления денежных величин я пользуюсь
паттерном "Количество" (Quantity) [Fowler, AP]

стр. 141
(о временных переменных) Все переменные, выполняющие несколько функций, должны
быть заменены отдельной переменной для каждой из этих функций. Использование
одной и той же переменной для решения разных задач очень затрудняет чтение кода.

стр. 158
Разумное и правильное проектное решение через неделю может оказаться неправильным.
Но проблема не в этом, а в том, чтобы не оставить это без внимания.

стр. 168
Одним из ключевых свойств объектов является инкапсуляция. Инкапсуляция означает, что
объектам приходится меньше знать о других частях системы. В результате при модификации
других частей об этом требуется сообщить меньшему числу объектов, что упрощает
внесение изменений.

стр. 314
Желая изменить этот код так, чтобы использовать исключительную ситуацию, я сначала должен
решить, будет ли она проверяемой или непроверяемой. Решение зависит от того, будет ли
проверка остатка на счете перед снятием с него суммы входить в обязанности вызывающего
или процедуры, выполняющей снятие. Если проверка остатка на счете вменяется в обязанность
вызывающего, то вызов процедуры для снятия превышающей остаток суммы будет ошибкой
программирования. Поскольку это программная ошибка, т. е. "дефект", я должен использовать
непроверяемую исключительную ситуацию. Если проверка остатка на счету возлагается на
процедуру снятия, я должен объявить исключительную ситуацию в интерфейсе. Таким образом
я сообщаю вызывающему, что он должен ждать возможной исключительной ситуации и принять
надлежащие меры.

стр. 317
Исключительные ситуации представляют собой важное достижение языков программирования.
Они позволяют избежать написания сложного кода в результате "Замены кода ошибки
исключительной ситуацией". Как и многими другими удовольствиями, исключительными ситуациями
иногда злоупотребляют, и они перестают быть приятными. Исключительные ситуации должны
использоваться для локализации исключительного поведения, связанного с неожиданной ошибкой.
Они не должны служить заменой проверкам выполнения условий. Если разумно предполагать от
вызывающего проверки условия перед операцией, то следует обеспечить возможность проверки,
а вызывающий не должен этой возможностью пренебрегать.

стр. 390
Однако многие программисты зачастую не слишком озабочены проблемами надежности. Есть некоторая
ирония в том, что многие из нас проповедуют безопасность как главное в отношении своих детей и
родственников и требуют свободы для программиста как некоего гибрида вооруженного бандита с
Дикого Запада и подростка за рулем. Что же, лишить нашу организацию плодов наших творческих
возможностей ради какой-то однотипности и следования нормам?
Previous post Next post
Up