Upload
smartstepgroup
View
428
Download
0
Embed Size (px)
DESCRIPTION
Материалы первого дня тренинга "Refactoring. Unit Testing. TDD", который проводился 11 Декабря 2013 г. в Нижнем Новгороде
Citation preview
REFACTORINGUNIT TESTING
TDD
Антон Бевзюк
Дмитрий Павлов
9 лет опыта
Тренинги
Консультирование
Оценка процессов
Оптимизация процессов
Разработка
SmartStepGroup
http://get.cardmone.net
Контакты
Перерывы
Жест
Никаких мобил
Ноуты только на упражнениях
Парковка
Правила
Что вас беспокоит?
ПАРНОЕ ПРОГРАММИРОВАНИЕ
INTEL CONFIDENTIAL, FOR INTERNAL USE ONLY8
Зачем Нужна Пара?
Передача Знаний
Кросс-Функциональная Команда
Отпуск!
Чаще меняйте партнеров!
Не жадничайте
Играйте в клавиатурный пинг-понг
Инструменты Парного Программирования
https://github.com/SmartStepGroup/RefactoringWorkshop
cd /c/projects
git clone https://github.com/SmartStepGroup/RefactoringWorkshop.git
cd RefactoringWorkshop
Git
1. Добавить новый тип кино Series
2. Один фильм бесплатно за 10 поинтов
3. Новый отчет в HTML
20 минут
Упражнение 0.
Зачем нужен курс специалисту мы предлагаем Вам этоттренинг какпростойпонятныйинструмент повышения стабильности процесса и повышения качества продукта более 50% времени мастер-класса мы отводим на упражнения, где вы будете писать кодчто входит в курсмодульные тесты ключевой способ не бояться изменений требований и постоянно держать качество и поддерживаемость продукта на высоте а это напрямую влияет на Ваши вовлеченность и мотивацию резко повышая их testdrivendevelopment изначально заточен на решение задачи длительной поддержки проекта и по нашим наблюдениям после внедрения tdd разработчки обычно вздыхают полной грудью. Типовые муторные проблемы с воспроизводством дефектов и внесением изменений становятся гораздо менее значимыми. Вы сразу и автоматически получаете понятный поддерживаемый дизайн и глубокое покрытие тестами. Время проведенное в дебаге стремится к нулюбаги перестаютбытьпроблемой поскольку каждую вновь найденнуюпроблемуможно будет закрепить тестом ибольше кнейне возвращаться автоматические тесты так же замещают ручную работу по проверке того или иного функционала перед тем, как отдать ее на финальное тестирование практика TDD позволяет вспомнить давно забытое чувство – когда после завершения очередного шага разработки все заводится без проблем и с первого раза. И поначалу это может с непривычки даже пугать, но потом Вы привыкнете к этому ощущению драйва и «потока» и уже не сможете писать код, не начав с тестаприменяя рефакторинг можно значительно повысить гибкость системы при изменении требований и значительно снизить силы на поддержку и больше внимания уделять новому функционалу. Согласитесь, разработчику всегда гораздо более комфортно работать с чистым понятным кодом, и это резко повышает продуктивность команды. Помимо всего прочего, новые практики помогу команде вырасти в техническом плане, перейти на "следующий уровень". Парная работа обязательно будет способствовать быстрому распространению знаний и удачных подходов.
Прочитайте это …
Зачем нужен курс специалисту
Мы предлагаем Вам этот тренинг как простой понятный инструмент повышения стабильности процесса и повышения качества продукта. Более 50% времени мастер-класса мы отводим на упражнения, где вы будете писать код.
Что входит в курс:
Модульные тесты это ключевой способ не бояться изменений требований и постоянно держать качество и поддерживаемость продукта на высоте. А это напрямую влияет на Ваши вовлеченность и мотивацию, резко повышая их.
Test-Driven Development изначально заточен на решение задачи длительной поддержки проекта. И по нашим наблюдениям, после внедрения TDD разработчки обычно вздыхают полной грудью. Типовые муторные проблемы с воспроизводством дефектов и внесением изменений становятся гораздо менее значимыми. Вы сразу и автоматически получаете понятный поддерживаемый дизайн и глубокое покрытие тестами. Время, проведенное в дебаге, стремится к нулю. Баги перестают быть проблемой, поскольку каждую вновь найденную проблему можно будет закрепить тестом и больше к ней не возвращаться. Автоматические тесты так же замещают ручную работу по проверке того или иного функционала перед тем, как отдать ее на финальное тестирование.
Практика TDD позволяет вспомнить давно забытое чувство – когда после завершения очередного шага разработки все заводится без проблем и с первого раза. И поначалу это может с непривычки даже пугать, но потом Вы привыкнете к этому ощущению драйва и «потока» и уже не сможете писать код, не начав с теста.
Применяя рефакторинг, можно значительно повысить гибкость системы при изменении требований и значительно снизить силы на поддержку и больше внимания уделять новому функционалу. Согласитесь, разработчику всегда гораздо более комфортно работать с чистым понятным кодом, и это резко повышает продуктивность команды.
Помимо всего прочего, новые практики помогу команде вырасти в техническом плане, перейти на "следующий уровень". Парная работа обязательно будет способствовать быстрому распространению знаний и удачных подходов.
После 5 минут рефакторинга
Непрерывный процесс,
который позволяет разработчику находить плохо структурированный код и улучшать его,
не изменяя при этом поведения,
применяя набор повторяемых шагов.
Что такое рефакторинг?
http://wwwrefactoringcom
ПОЧЕМУ НАДО РЕФАКТОРИТЬ?
Чтобы улучшать дизайн
Чтобы понимать код
Чтобы находить баги
Чтобы программировать быстрее
… как купить новый диван
… или стол
… или ТВ
Рефакторинг это ...
УПРАЖНЕНИЕ
+Statement()
Customer
+DaysRented : int
Rental
+PriceCode : int
Movie
Домен
Customer.Statement()
… но кого это волнует?
Компьютерам все равно
Программистам придется поддерживать это
Страшно …
«Любой дурак может написать код, который может понять компьютер. Хорошие программисты пишут код, понятный другим людям.“
- Martin Fowler
Выделить метод
Переименовать переменные
ПРИЧИНЫ РЕФАКТОРИТЬ
Есть только 2 причины
Улучшить читаемость
Есть только 2 причины
Устранение дубликации
Когда рефакторить?
Правило трех
Каждый божий день
http://c2com/cgi/wiki?CodeSmell
Чем пахнет?
Дубликация
Длинный метод
Огромный класс
Длинный список параметров
Комментарии
Маленькие шаги
A B
Маленькие шаги
A B
УПРАЖНЕНИЕ
Переместить метод
Проблемы с рефакторингом
Сложно найти все «запахи» сразу
Одну ягодку беру, на другую смотрю, третью примечаю, четвертая мерещится
Некоторые «запахи» локальные, некоторые более широкие
Все «вылизать» не получится
• Add Parameter
• Change Bidirectional Association to Unidirectional
• Change Reference to Value
• Change Unidirectional Association to Bidirectional
• Change Value to Reference
• Collapse Hierarchy
• Consolidate Conditional Expression
• Consolidate Duplicate Conditional Fragments
• Convert Dynamic to Static Construction by Gerard M. Davison
• Convert Static to Dynamic Construction by Gerard M. Davison
• Decompose Conditional
• Duplicate Observed Data
• Eliminate Inter-Entity Bean Communication (Link Only)
• Encapsulate Collection
• Encapsulate Downcast
• Encapsulate Field
• Extract Class
• Introduce Assertion
• Introduce Business Delegate (Link Only)
• Introduce Explaining Variable
• Introduce Foreign Method
• Introduce Local Extension
• Introduce Null Object
• Introduce Parameter Object
• Introduce Synchronizer Token (Link Only)
• Localize Disparate Logic (Link Only)
• Merge Session Beans (Link Only)
• Move Business Logic to Session (Link Only)
• Move Class by Gerard M. Davison
• Move Field
• Move Method
• Parameterize Method
• Preserve Whole Object
• Pull Up Constructor Body
• Pull Up Field
• Pull Up Method
• Push Down Field
• Replace Conditional with Visitor by Ivan Mitrovic
• Replace Constructor with Factory Method
• Replace Data Value with Object
• Replace Delegation with Inheritance
• Replace Error Code with Exception
• Replace Exception with Test
• Replace Inheritance with Delegation
• Replace Iteration with Recursion by Dave Whipp
• Replace Magic Number with Symbolic Constant
• Replace Method with Method Object
• Replace Nested Conditional with Guard Clauses
• Replace Parameter with Explicit Methods
• Replace Parameter with Method
• Replace Record with Data Class
• Replace Recursion with Iteration by Ivan Mitrovic
• Replace Static Variable with Parameter by Marian Vittek
Каталог рефакторингов
УПРАЖНЕНИЕ
Избавиться от временной переменной
FrequentRenterPoints
+Statement()
Customer Rental
+DaysRented : int
+Price : double
+FrequentRenterPoints : int
Movie
+PriceCode : int
Что получилось
Разбить цикл
А как же производительность???
Теперь цикл выполняется дважды!
Код для читаемости, а не для производительности.
• Если возникнут проблемы с производительностью, скорее всего это будет не там, где вы ожидаете
• Но ее будет легко починить, если код чистый
Холивар
Что надо сделать перед рефакторингом?
Заменить switch полиморфизмом
А ВОТ ТЕПЕРЬ ХАРДКОР
Наш новый проект
https://github.com/SmartStepGroup/AwfulVideoStore
ИЗОЛЯЦИЯ ЗАВИСИМОСТЕЙ
ПОДМЕНА ПОВЕДЕНИЯ
SPROUT METHOD
ИЗБАВЛЯЕМСЯ ОТ STATIC
ИНЪЕКЦИЯ ЗАВИСИМОСТЕЙ
Что такое рефакторинг
Рефакторинг – это непрерывный процесс
Рефакторинг – это просто
Основные рефакторинги
Маленькие шаги
Как рефакторить старый код
Технический долг
Чему мы научились
Прислать примеры сложного кода из вашего проекта
Домашнее задание
Книги
Вопросы?
Контакты
http://get.cardmone.net