Главная - Литература

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 [187] 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

Рефакторинг на уровне отдельных методов

□ Извлечение метода из другого метода.

□ Встраивание кода метода.

□ Преобразование объемного метода в класс.

□ Замена сложного алгоритма на простой.

□ Добавление параметра.

□ Удаление параметра.

□ Отделение операций запроса данных от операций изменения данных.

□ Объединение похожих методов при помощи их параметризации.

□ Разделение метода, поведение которого зависит от полученных параметров.

□ Передача в метод целого объекта вместо отдельных полей.

□ Передача в метод отдельных полей вместо целого объекта.

□ Инкапсуляция нисходящего приведения типов.

Рефакторинг реализации классов

□ Замена объектов-значений на объекты-ссылки.

□ Замена объектов-ссылок на объекты-значения.

□ Замена виртуальных методов на инициализацию данных.

□ Изменение положения методов-членов или данных-членов в иерархии наследования.

□ Перемещение специализированного кода в подкласс.

□ Объединение похожего кода и его перемещение в суперкласс.

Рефакторинг интерфейсов классов

□ Перемещение метода в другой класс.

□ Разделение одного класса на несколько.

□ Удаление класса.

□ Сокрытие делегата.

□ Удаление посредника.

□ Замена наследования на делегирование.

□ Замена делегирования на наследование.

□ Создание внешнего метода.

□ Создание класса-расширения.

□ Инкапсуляция открытой переменной-члена.

□ Удаление методов установки значений неизменяемых полей.

□ Сокрытие методов, которые не следует вызывать извне класса.

□ Инкапсуляция неиспользуемых методов.

□ Объединение суперкласса и подкласса, имеющих очень похожую реализацию. Рефакторинг на уровне системы

□ Создание эталонного источника данных, которые вы не можете контролировать.

□ Изменение однонаправленной связи между классами на двунаправленную.

□ Изменение двунаправленной связи между классами на однонаправленную.

□ Предоставление фабричного метода вместо простого конструктора.

□ Замена кодов ошибок на исключения или наоборот.



24.4. Безопасный рефакторинг

Рефакторинг - эффективный способ повышения качества бмшатаьстео 8 рабочую оис-

тшу Шшв похоже на вскры- эффективные инструменты, при невер-

тие гопоаного мозга и замену использовании он может причинить вред. Несколько

нераа, чем на замену проклад- простых советов помогут предотвратить неверное приме-ки е кране. Облегчилось пн бы нение рефакторинга. сопровождение программ, если

б оно называлось «нейрохирур- Сохраняйте первоначальный код Перед началом рефак-гией торинга убедитесь, что вы сможете вернуться к коду, с ко-

Джеральд ВйШврт торого начинаете. Сохраните код в системе управления вер-{ШШ ШеШШд) сиями или скопируйте корректные файлы в резервный каталог.

Стремитесь ограничить объем отдельных видов рефакторинга Некоторые виды рефакторинга масштабнее других, к тому же не всегда можно точно сказать, что именно составляет «один вид рефакторинга». Чтобы четко представлять все следствия вносимых изменений, не раздувайте виды рефакторинга. Примеры соблюдения этого принципа см. в книге «Refactoring» (Fowler, 1999).

Выполняйте отдельные виды рефакторинга по одному за раз Некоторые виды рефакторинга сложнее других. За исключением самых простых случаев выполняйте все виды рефакторинга по одному за раз, компилируя и тестируя программу перед следующим видом рефакторинга.

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

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

Часто создавайте контрольные точки Иногда рефакторинг внезапно уходит в сторону, поэтому вам следует не только сохранять первоначальный код, но и создавать контрольные точки на разных этапах рефакторинга, чтобы можно бьшо вернуться к работоспособной программе, если рефакторинг заведет вас в тупик.

Используйте предупреждения компилятора Компилятор часто не замечает небольших ошибок. Задав компилятору самый строгий уровень диагностики, вы сможете исправлять многие ошибки почти сразу после их внесения.

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



Создавайте дополнительные тесты Не ограничивайтесь регрессивным тестированием программы с использованием старых тестов - создавайте новые блочные тесты для проверки нового кода. Тесты, устаревшие в результате рефакторинга, удаляйте.

Выполняйте обзоры изменений Если обзоры важны при ipng ттм OS mзo-первоначальном написании кода, то при последующих изме- р 21

нениях их важность лишь повышается. Эд Йордон сообщает,

что первая попытка внесения изменения в код более чем в половине случаев оказывается ошибочной (Yourdon, 198бЬ). Интересно, что, если программисты имеют дело не с несколькими строками кода, а с более объемным фрагментом, вероятность внесения корректного изменения более высока (рис. 24-1). Точнее говоря, по мере увеличения числа изменяемых строк с одной до пяти вероятность внесения неправильного изменения повышается, а после этого снижается.

100% т

Вероятность ошибки


Число изменяемых строк

Рис, 24-1, Небольшие изменения чаще оказываются ошибочными, чем более крупные (Weinberg, 1983)

Программисты относятся к небольшим изменениям легкомысленно. Они не анализируют их, не просят коллег выполнить их обзор, а иногда даже не запускают программу, чтобы проверить, что исправление корректно.

Мораль проста: рассматривайте простые изменения так, как если бы они щ были сложными. В одной организации, в которой были введены обзоры

изменений одной строки кода, было обнаружено, что доля ошибочных изменений снизилась с 55% до 2% (Freedman and Weinberg, 1982). В другой организации, работающей в сфере телекоммуникаций, введение обзоров изменений позволило повысить их корректность с 86% до 99,6% (Perrott, 2004).

Изменяйте подход в зависимости от рискованности рефакторинга Некоторые виды рефакторинга сопряжены с более высоким риском, чем другие. Так, «замена магического числа на именованную константу» относительно безопасна. Виды рефакторинга, предполагающие изменение интерфейса класса или метода, схемы БД или булевых тестов, обычно более рискованны. Если рефакторинг несложен, вы можете оптимизировать процесс рефакторинга, выполняя более одного вида за раз и ограничиваясь регрессивным тестированием кода без его официального обзора.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 [187] 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294



0.0023