SlideShare a Scribd company logo
1 of 43
Refactoring Legacy Code 
Дмитрий Миндра 
SDET, Unity Technologies (Ciklum) 
@dmytromindra
О докладчике 
Когда-то был приличным 
инженером, но 10 лет назад 
связался с дотнетчиками, 
выучил C#, занялся ООП, 
скатился к TDD и 
модульному тестированию. 
Характер скверный. 
Женат 
2010 - Lohika 
2012 - Microsoft 
2013 - Unity Technologies
Extreme Programming (XP)
SCRUM ЭРА
Что такое legacy code? 
1. Это код без тестов 
2. Код без спецификации 
3. Код написанный очень давно и 
неизвестно кем. 
4. … 
MakeFlagWavingBastardWaveHisFlagWhichIsTheProbablyTheLas 
tThingHeWillEverDo() 
Найдено в Carmageddon 1 debugging symbols dumped
Как появляется Legacy Code?
Как появляется legacy code? 
• Гонка за фичами (нужно больше золота) 
• Меняющиеся требования. 
• Костыли и хаки. 
• Ротация разработчиков. 
• Отсутствие мыслей о завтрашнем дне ( 
сопровождении кода )
Золотое правило 
• Работает – не трогай!
Зачем мы меняем код ? 
• Нужно добавить фичу. 
• Нужно пофиксить баг. 
• Нужно улучшить производительность.
ВАЖНО! 
• Legacy код – это всегда работающий 
код, задействованный в 
функционировании программной 
системы.
Что делать? 
• Переписать заново (как правило плохая 
мысль) 
• Найти новую работу … 
• Сделать код «не legacy» кодом.
Учись, иначе т 
Учись, студент! Иначе, всю 
жизнь вот так будешь 
только ключи подавать!
Самая популярная техника 
работы с Legacy Code 
Edit and pray
С чего начать ? 
• Определить что именно нужно менять 
• Определить какие тесты нужны 
• Запустить и проверить 
• Написать тесты 
• Внести изменения
С чего начать ? 
• Определить что именно нужно менять 
– Старый код бывает очень сложно понять 
– Изменения могут быть сильно 
распределены по коду 
• Определить какие тесты нужны 
• Запустить и проверить 
• Написать тесты 
• Внести изменения
С чего начать ? 
• Определить что именно нужно менять 
• Определить какие тесты нужны 
– Мы хотим убедиться, что код работает так же, 
как работал до вмешательства. 
– Есть ли механизм для мониторинга 
результатов. 
– Мы не боимся долгих и сложных тестов на 
этом этапе! 
• Запустить и проверить 
• Написать тесты 
• Внести изменения
Approval Tests 
1. Сериализуем результат в текст 
2. Сравниваем с эталоном 
http://approvaltests.sourceforge.net
С чего начать ? 
• Определить что именно нужно менять 
• Определить какие тесты нужны 
• Запустить и проверить 
– Можем ли мы создать класс/вызвать метод 
в тесте? 
– Можем ли мы получить результат 
вычислений? 
• Написать тесты 
• Внести изменения
Seams 
• Швы – места, позволяющие менять 
поведение программы не меняя код в 
этом самом месте. 
• Швы бывают объектные и линковочные
Sensing and Separation 
• Sensing – мы меняем код для того, 
чтобы получить доступ к результатам 
вычислений. 
• Separation – мы меняем код для того, 
чтобы получить создать класс или 
вызвать метод внутри теста.
Separation 
В данном случае мы будем бороться за право создать экземпляр. 
Самый простой рефакторинг – это добавить конструктор по умолчанию.
Separation 
Старый код часто нарушает принцип DI
Избавляемся от зависимости 
• Пожалуй самая распространенная 
техника – Extract Interface & 
Parameterize Constructor.
Extract Interface 
Сначала избавимся от очень общего названия Sensor 
Затем извлечем интерфейс Sensor
Parameterize Constructor 
Конструктор по умолчанию все еще создает зависимость, 
но теперь есть возможность подменить ее в тесте.
Extract and Override (шаг 1) 
Factory Method 
Было: 
Стало:
Extract and Override (шаг 2) 
Factory Method
Почему Extract and Override? 
• Legacy code – это зона риска. Мы 
стараемся менять его минимальными 
безопасными шагами (baby steps).
Шаг 1: Добавить метод
Шаг 1: Добавить метод 
Попробуем обернуть вызов source.Read() методом Modify() 
Это безопасная операция с минимальной модификацией 
кода.
Шаг 2: Перегрузить его 
Безопасно ли поменять private на protected? Вполне! 
Безопасно ли сделать метод virtual? Вполне!
Шаг 2: Перегрузить его 
Теперь мы можем переопределить это поведение в 
наследнике операцией, не меняющей исходный код 
тестируемого класса.
Extract and Override 
3rd party 
Ох уж эти 3rd party, которые так сложно тестировать. 
Extract 
Override
Sensing with Extract and Override
С чего начать ? 
• Определить что именно нужно менять 
• Определить какие тесты нужны 
• Запустить и проверить 
• Написать тесты 
– Эти тесты больше похожи на приемочные тесты. 
– Они могут быть медленными, могут обращаться к 
внешним сервисам и базам данных 
– Главная цель этих тестов определить работает ли 
старый код так же, как работал до вмешательства. 
• Внести изменения
С чего начать ? 
• Определить что именно нужно менять 
• Определить какие тесты нужны 
• Запустить и проверить 
• Написать тесты 
• Внести изменения и выполнить 
настоящий рефакторинг 
– Когда код покрыт тестами он уже 
формально не является легаси кодом. 
– Его можно рефакторить и править.
Вопросы 
?
Что почитать? 
Michael C. Feathers “Working Effectively 
With Legacy Code”
Упражнение 
https://github.com/DmytroMindra/GildedRos 
e

More Related Content

What's hot

Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочинеAlexei Lupan
 
Do you know what you are testing?
Do you know what you are testing?Do you know what you are testing?
Do you know what you are testing?Mikalai Alimenkou
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестированияRina Uzhevko
 
сергей андреев
сергей андреевсергей андреев
сергей андреевAlexei Lupan
 
Темная сторона метрик
Темная сторона метрикТемная сторона метрик
Темная сторона метрикRoman Ivliev
 
Архитектура автоматизированных тестов
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестовSQALab
 
Как пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыКак пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыSergey Nemchinsky
 
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайниковQA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайниковQAFest
 
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...QAFest
 
Автоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаАвтоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаIgor Lyubin
 
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0AlexeyParhomenko
 
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!SPB SQA Group
 
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестированияCodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестированияCodeFest
 
Great functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesGreat functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesMikalai Alimenkou
 
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...COMAQA.BY
 
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...QAFest
 
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQAFest
 
Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?SQALab
 

What's hot (20)

Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
BDD
BDDBDD
BDD
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
 
Do you know what you are testing?
Do you know what you are testing?Do you know what you are testing?
Do you know what you are testing?
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестирования
 
сергей андреев
сергей андреевсергей андреев
сергей андреев
 
Темная сторона метрик
Темная сторона метрикТемная сторона метрик
Темная сторона метрик
 
Архитектура автоматизированных тестов
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестов
 
Как пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыКак пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системы
 
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайниковQA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
 
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
 
Автоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаАвтоматическое тестирование. Моя система
Автоматическое тестирование. Моя система
 
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
 
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
 
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестированияCodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
 
Great functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesGreat functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and Thucydides
 
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
 
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
 
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
 
Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?
 

Similar to XP Days Ukraine 2014 - Refactoring legacy code

Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Vadim Kruchkov
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...HappyDev
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Dmytro Mindra
 
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва  Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва it-people
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииCEE-SEC(R)
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыYuri Zhloba
 
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.IT Share
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Vladimir Obrizan "Ecosystem for reliable Python programming"
Vladimir Obrizan "Ecosystem for reliable Python programming"Vladimir Obrizan "Ecosystem for reliable Python programming"
Vladimir Obrizan "Ecosystem for reliable Python programming"Fwdays
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java DeveloperOlexandra Dmytrenko
 
О тестировании в EDI
О тестировании в EDIО тестировании в EDI
О тестировании в EDIMaxim Zakharov
 
JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1sgdread
 
Проходим тест Джоэла
Проходим тест ДжоэлаПроходим тест Джоэла
Проходим тест Джоэла0leGG
 
2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы
2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы
2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ыHappyDev
 
А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?SQALab
 
Тестируем legacy c++
Тестируем legacy c++Тестируем legacy c++
Тестируем legacy c++Maxim Shulga
 

Similar to XP Days Ukraine 2014 - Refactoring legacy code (20)

Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
 
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва  Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документации
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Vladimir Obrizan "Ecosystem for reliable Python programming"
Vladimir Obrizan "Ecosystem for reliable Python programming"Vladimir Obrizan "Ecosystem for reliable Python programming"
Vladimir Obrizan "Ecosystem for reliable Python programming"
 
Solid code via tdd
Solid code via tddSolid code via tdd
Solid code via tdd
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
 
О тестировании в EDI
О тестировании в EDIО тестировании в EDI
О тестировании в EDI
 
JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1
 
Проходим тест Джоэла
Проходим тест ДжоэлаПроходим тест Джоэла
Проходим тест Джоэла
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Team workflow
Team workflowTeam workflow
Team workflow
 
2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы
2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы
2014.12.06 02 Екатерина Боброва — Тестируем сложные backend-ы
 
А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?
 
Тестируем legacy c++
Тестируем legacy c++Тестируем legacy c++
Тестируем legacy c++
 

More from Dmytro Mindra

Introduction to Value Planning for iHUB
Introduction to Value Planning for iHUBIntroduction to Value Planning for iHUB
Introduction to Value Planning for iHUBDmytro Mindra
 
Mastering public speaking skills
Mastering public speaking skillsMastering public speaking skills
Mastering public speaking skillsDmytro Mindra
 
Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Dmytro Mindra
 
Building Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dBuilding Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dDmytro Mindra
 
IT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleIT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleDmytro Mindra
 
Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Dmytro Mindra
 
Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Dmytro Mindra
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Dmytro Mindra
 
Lohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureLohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureDmytro Mindra
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Dmytro Mindra
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software DevelopmentDmytro Mindra
 
Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Dmytro Mindra
 
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Dmytro Mindra
 
IT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignIT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignDmytro Mindra
 
NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET Dmytro Mindra
 

More from Dmytro Mindra (20)

Introduction to Value Planning for iHUB
Introduction to Value Planning for iHUBIntroduction to Value Planning for iHUB
Introduction to Value Planning for iHUB
 
Mastering public speaking skills
Mastering public speaking skillsMastering public speaking skills
Mastering public speaking skills
 
Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2
 
Building Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dBuilding Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3d
 
IT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleIT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by Example
 
Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012
 
Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012
 
Lohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureLohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows Azure
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software Development
 
Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011
 
Agile architecture
Agile architectureAgile architecture
Agile architecture
 
DCI
DCIDCI
DCI
 
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
 
IT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignIT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about Design
 
NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET
 

Recently uploaded (9)

ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 

XP Days Ukraine 2014 - Refactoring legacy code

  • 1. Refactoring Legacy Code Дмитрий Миндра SDET, Unity Technologies (Ciklum) @dmytromindra
  • 2. О докладчике Когда-то был приличным инженером, но 10 лет назад связался с дотнетчиками, выучил C#, занялся ООП, скатился к TDD и модульному тестированию. Характер скверный. Женат 2010 - Lohika 2012 - Microsoft 2013 - Unity Technologies
  • 4.
  • 6. Что такое legacy code? 1. Это код без тестов 2. Код без спецификации 3. Код написанный очень давно и неизвестно кем. 4. … MakeFlagWavingBastardWaveHisFlagWhichIsTheProbablyTheLas tThingHeWillEverDo() Найдено в Carmageddon 1 debugging symbols dumped
  • 7.
  • 9. Как появляется legacy code? • Гонка за фичами (нужно больше золота) • Меняющиеся требования. • Костыли и хаки. • Ротация разработчиков. • Отсутствие мыслей о завтрашнем дне ( сопровождении кода )
  • 10. Золотое правило • Работает – не трогай!
  • 11. Зачем мы меняем код ? • Нужно добавить фичу. • Нужно пофиксить баг. • Нужно улучшить производительность.
  • 12. ВАЖНО! • Legacy код – это всегда работающий код, задействованный в функционировании программной системы.
  • 13. Что делать? • Переписать заново (как правило плохая мысль) • Найти новую работу … • Сделать код «не legacy» кодом.
  • 14. Учись, иначе т Учись, студент! Иначе, всю жизнь вот так будешь только ключи подавать!
  • 15. Самая популярная техника работы с Legacy Code Edit and pray
  • 16. С чего начать ? • Определить что именно нужно менять • Определить какие тесты нужны • Запустить и проверить • Написать тесты • Внести изменения
  • 17. С чего начать ? • Определить что именно нужно менять – Старый код бывает очень сложно понять – Изменения могут быть сильно распределены по коду • Определить какие тесты нужны • Запустить и проверить • Написать тесты • Внести изменения
  • 18.
  • 19. С чего начать ? • Определить что именно нужно менять • Определить какие тесты нужны – Мы хотим убедиться, что код работает так же, как работал до вмешательства. – Есть ли механизм для мониторинга результатов. – Мы не боимся долгих и сложных тестов на этом этапе! • Запустить и проверить • Написать тесты • Внести изменения
  • 20. Approval Tests 1. Сериализуем результат в текст 2. Сравниваем с эталоном http://approvaltests.sourceforge.net
  • 21. С чего начать ? • Определить что именно нужно менять • Определить какие тесты нужны • Запустить и проверить – Можем ли мы создать класс/вызвать метод в тесте? – Можем ли мы получить результат вычислений? • Написать тесты • Внести изменения
  • 22. Seams • Швы – места, позволяющие менять поведение программы не меняя код в этом самом месте. • Швы бывают объектные и линковочные
  • 23. Sensing and Separation • Sensing – мы меняем код для того, чтобы получить доступ к результатам вычислений. • Separation – мы меняем код для того, чтобы получить создать класс или вызвать метод внутри теста.
  • 24. Separation В данном случае мы будем бороться за право создать экземпляр. Самый простой рефакторинг – это добавить конструктор по умолчанию.
  • 25. Separation Старый код часто нарушает принцип DI
  • 26.
  • 27. Избавляемся от зависимости • Пожалуй самая распространенная техника – Extract Interface & Parameterize Constructor.
  • 28. Extract Interface Сначала избавимся от очень общего названия Sensor Затем извлечем интерфейс Sensor
  • 29. Parameterize Constructor Конструктор по умолчанию все еще создает зависимость, но теперь есть возможность подменить ее в тесте.
  • 30. Extract and Override (шаг 1) Factory Method Было: Стало:
  • 31. Extract and Override (шаг 2) Factory Method
  • 32. Почему Extract and Override? • Legacy code – это зона риска. Мы стараемся менять его минимальными безопасными шагами (baby steps).
  • 34. Шаг 1: Добавить метод Попробуем обернуть вызов source.Read() методом Modify() Это безопасная операция с минимальной модификацией кода.
  • 35. Шаг 2: Перегрузить его Безопасно ли поменять private на protected? Вполне! Безопасно ли сделать метод virtual? Вполне!
  • 36. Шаг 2: Перегрузить его Теперь мы можем переопределить это поведение в наследнике операцией, не меняющей исходный код тестируемого класса.
  • 37. Extract and Override 3rd party Ох уж эти 3rd party, которые так сложно тестировать. Extract Override
  • 38. Sensing with Extract and Override
  • 39. С чего начать ? • Определить что именно нужно менять • Определить какие тесты нужны • Запустить и проверить • Написать тесты – Эти тесты больше похожи на приемочные тесты. – Они могут быть медленными, могут обращаться к внешним сервисам и базам данных – Главная цель этих тестов определить работает ли старый код так же, как работал до вмешательства. • Внести изменения
  • 40. С чего начать ? • Определить что именно нужно менять • Определить какие тесты нужны • Запустить и проверить • Написать тесты • Внести изменения и выполнить настоящий рефакторинг – Когда код покрыт тестами он уже формально не является легаси кодом. – Его можно рефакторить и править.
  • 42. Что почитать? Michael C. Feathers “Working Effectively With Legacy Code”

Editor's Notes

  1. http://www.scrumprimer.org/anime
  2. https://github.com/OdeToCode/Katas/tree/master/Refactoring/CS
  3. Самое простое решение – сохранить результаты работы определенных сценариев в текст и сохранить эталон. Approval Tests позволяют пользоваться стандартными Diff утилитами для поиска различий.
  4. Попытка создать класс в тесте может закончиться полным провалом
  5. Это пример из Blogengine.NET
  6. Это пример из Blogengine.NET