Every programmer has to face legacy code day after day. It might be ugly, it might look scary, it can make a grown man cry. Some will throw it away and try rewriting everything from scratch. Most of them will fail.
Refactoring legacy code is a much better idea. It is not so scary when you take it in very small bites, introduce small changes, add unit tests. When code is refactored and unit tests are added, changes to functinality can be introduced.
We will take an open source C# project and will refactor it showing step-by-step examples of the techniques. This session is full of tips and tricks you can start applying immediately. Although the code is in C#, the same principles can be applied in any language.
2. О докладчике
Когда-то был приличным
инженером, но 10 лет назад
связался с дотнетчиками,
выучил C#, занялся ООП,
скатился к TDD и
модульному тестированию.
Характер скверный.
Женат
2010 - Lohika
2012 - Microsoft
2013 - Unity Technologies
6. Что такое legacy code?
1. Это код без тестов
2. Код без спецификации
3. Код написанный очень давно и
неизвестно кем.
4. …
MakeFlagWavingBastardWaveHisFlagWhichIsTheProbablyTheLas
tThingHeWillEverDo()
Найдено в Carmageddon 1 debugging symbols dumped
9. Как появляется legacy code?
• Гонка за фичами (нужно больше золота)
• Меняющиеся требования.
• Костыли и хаки.
• Ротация разработчиков.
• Отсутствие мыслей о завтрашнем дне (
сопровождении кода )
16. С чего начать ?
• Определить что именно нужно менять
• Определить какие тесты нужны
• Запустить и проверить
• Написать тесты
• Внести изменения
17. С чего начать ?
• Определить что именно нужно менять
– Старый код бывает очень сложно понять
– Изменения могут быть сильно
распределены по коду
• Определить какие тесты нужны
• Запустить и проверить
• Написать тесты
• Внести изменения
18.
19. С чего начать ?
• Определить что именно нужно менять
• Определить какие тесты нужны
– Мы хотим убедиться, что код работает так же,
как работал до вмешательства.
– Есть ли механизм для мониторинга
результатов.
– Мы не боимся долгих и сложных тестов на
этом этапе!
• Запустить и проверить
• Написать тесты
• Внести изменения
20. Approval Tests
1. Сериализуем результат в текст
2. Сравниваем с эталоном
http://approvaltests.sourceforge.net
21. С чего начать ?
• Определить что именно нужно менять
• Определить какие тесты нужны
• Запустить и проверить
– Можем ли мы создать класс/вызвать метод
в тесте?
– Можем ли мы получить результат
вычислений?
• Написать тесты
• Внести изменения
22. Seams
• Швы – места, позволяющие менять
поведение программы не меняя код в
этом самом месте.
• Швы бывают объектные и линковочные
23. Sensing and Separation
• Sensing – мы меняем код для того,
чтобы получить доступ к результатам
вычислений.
• Separation – мы меняем код для того,
чтобы получить создать класс или
вызвать метод внутри теста.
24. Separation
В данном случае мы будем бороться за право создать экземпляр.
Самый простой рефакторинг – это добавить конструктор по умолчанию.
39. С чего начать ?
• Определить что именно нужно менять
• Определить какие тесты нужны
• Запустить и проверить
• Написать тесты
– Эти тесты больше похожи на приемочные тесты.
– Они могут быть медленными, могут обращаться к
внешним сервисам и базам данных
– Главная цель этих тестов определить работает ли
старый код так же, как работал до вмешательства.
• Внести изменения
40. С чего начать ?
• Определить что именно нужно менять
• Определить какие тесты нужны
• Запустить и проверить
• Написать тесты
• Внести изменения и выполнить
настоящий рефакторинг
– Когда код покрыт тестами он уже
формально не является легаси кодом.
– Его можно рефакторить и править.
Самое простое решение – сохранить результаты работы определенных сценариев в текст и сохранить эталон. Approval Tests позволяют пользоваться стандартными Diff утилитами для поиска различий.
Попытка создать класс в тесте может закончиться полным провалом