61
REFACTORING UNIT TESTING TDD Антон Бевзюк Дмитрий Павлов

Рефакторинг

Embed Size (px)

DESCRIPTION

Материалы первого дня тренинга "Refactoring. Unit Testing. TDD", который проводился 11 Декабря 2013 г. в Нижнем Новгороде

Citation preview

Page 1: Рефакторинг

REFACTORINGUNIT TESTING

TDD

Антон Бевзюк

Дмитрий Павлов

Page 2: Рефакторинг

9 лет опыта

Тренинги

Консультирование

Оценка процессов

Оптимизация процессов

Разработка

SmartStepGroup

Page 3: Рефакторинг

http://get.cardmone.net

Контакты

Page 4: Рефакторинг

Перерывы

Жест

Никаких мобил

Ноуты только на упражнениях

Парковка

Правила

Page 5: Рефакторинг
Page 6: Рефакторинг

Что вас беспокоит?

Page 7: Рефакторинг

ПАРНОЕ ПРОГРАММИРОВАНИЕ

Page 8: Рефакторинг

INTEL CONFIDENTIAL, FOR INTERNAL USE ONLY8

Page 9: Рефакторинг

Зачем Нужна Пара?

Передача Знаний

Кросс-Функциональная Команда

Отпуск!

Page 10: Рефакторинг

Чаще меняйте партнеров!

Page 11: Рефакторинг

Не жадничайте

Играйте в клавиатурный пинг-понг

Page 12: Рефакторинг

Инструменты Парного Программирования

Page 13: Рефакторинг

https://github.com/SmartStepGroup/RefactoringWorkshop

cd /c/projects

git clone https://github.com/SmartStepGroup/RefactoringWorkshop.git

cd RefactoringWorkshop

Git

Page 14: Рефакторинг

1. Добавить новый тип кино Series

2. Один фильм бесплатно за 10 поинтов

3. Новый отчет в HTML

20 минут

Упражнение 0.

Page 15: Рефакторинг

Зачем нужен курс специалисту мы предлагаем Вам этоттренинг какпростойпонятныйинструмент повышения стабильности процесса и повышения качества продукта более 50% времени мастер-класса мы отводим на упражнения, где вы будете писать кодчто входит в курсмодульные тесты ключевой способ не бояться изменений требований и постоянно держать качество и поддерживаемость продукта на высоте а это напрямую влияет на Ваши вовлеченность и мотивацию резко повышая их testdrivendevelopment изначально заточен на решение задачи длительной поддержки проекта и по нашим наблюдениям после внедрения tdd разработчки обычно вздыхают полной грудью. Типовые муторные проблемы с воспроизводством дефектов и внесением изменений становятся гораздо менее значимыми. Вы сразу и автоматически получаете понятный поддерживаемый дизайн и глубокое покрытие тестами. Время проведенное в дебаге стремится к нулюбаги перестаютбытьпроблемой поскольку каждую вновь найденнуюпроблемуможно будет закрепить тестом ибольше кнейне возвращаться автоматические тесты так же замещают ручную работу по проверке того или иного функционала перед тем, как отдать ее на финальное тестирование практика TDD позволяет вспомнить давно забытое чувство – когда после завершения очередного шага разработки все заводится без проблем и с первого раза. И поначалу это может с непривычки даже пугать, но потом Вы привыкнете к этому ощущению драйва и «потока» и уже не сможете писать код, не начав с тестаприменяя рефакторинг можно значительно повысить гибкость системы при изменении требований и значительно снизить силы на поддержку и больше внимания уделять новому функционалу. Согласитесь, разработчику всегда гораздо более комфортно работать с чистым понятным кодом, и это резко повышает продуктивность команды. Помимо всего прочего, новые практики помогу команде вырасти в техническом плане, перейти на "следующий уровень". Парная работа обязательно будет способствовать быстрому распространению знаний и удачных подходов.

Прочитайте это …

Page 16: Рефакторинг

Зачем нужен курс специалисту

Мы предлагаем Вам этот тренинг как простой понятный инструмент повышения стабильности процесса и повышения качества продукта. Более 50% времени мастер-класса мы отводим на упражнения, где вы будете писать код.

Что входит в курс:

Модульные тесты это ключевой способ не бояться изменений требований и постоянно держать качество и поддерживаемость продукта на высоте. А это напрямую влияет на Ваши вовлеченность и мотивацию, резко повышая их.

Test-Driven Development изначально заточен на решение задачи длительной поддержки проекта. И по нашим наблюдениям, после внедрения TDD разработчки обычно вздыхают полной грудью. Типовые муторные проблемы с воспроизводством дефектов и внесением изменений становятся гораздо менее значимыми. Вы сразу и автоматически получаете понятный поддерживаемый дизайн и глубокое покрытие тестами. Время, проведенное в дебаге, стремится к нулю. Баги перестают быть проблемой, поскольку каждую вновь найденную проблему можно будет закрепить тестом и больше к ней не возвращаться. Автоматические тесты так же замещают ручную работу по проверке того или иного функционала перед тем, как отдать ее на финальное тестирование.

Практика TDD позволяет вспомнить давно забытое чувство – когда после завершения очередного шага разработки все заводится без проблем и с первого раза. И поначалу это может с непривычки даже пугать, но потом Вы привыкнете к этому ощущению драйва и «потока» и уже не сможете писать код, не начав с теста.

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

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

После 5 минут рефакторинга

Page 17: Рефакторинг

Непрерывный процесс,

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

не изменяя при этом поведения,

применяя набор повторяемых шагов.

Что такое рефакторинг?

http://wwwrefactoringcom

Page 18: Рефакторинг

ПОЧЕМУ НАДО РЕФАКТОРИТЬ?

Page 19: Рефакторинг

Чтобы улучшать дизайн

Page 20: Рефакторинг

Чтобы понимать код

Page 21: Рефакторинг

Чтобы находить баги

Page 22: Рефакторинг

Чтобы программировать быстрее

Page 23: Рефакторинг

… как купить новый диван

… или стол

… или ТВ

Рефакторинг это ...

Page 24: Рефакторинг

УПРАЖНЕНИЕ

Page 25: Рефакторинг

+Statement()

Customer

+DaysRented : int

Rental

+PriceCode : int

Movie

Домен

Page 26: Рефакторинг

Customer.Statement()

Page 27: Рефакторинг

… но кого это волнует?

Компьютерам все равно

Программистам придется поддерживать это

Страшно …

«Любой дурак может написать код, который может понять компьютер. Хорошие программисты пишут код, понятный другим людям.“

- Martin Fowler

Page 28: Рефакторинг

Выделить метод

Page 29: Рефакторинг

Переименовать переменные

Page 30: Рефакторинг

ПРИЧИНЫ РЕФАКТОРИТЬ

Page 31: Рефакторинг

Есть только 2 причины

Улучшить читаемость

Page 32: Рефакторинг

Есть только 2 причины

Устранение дубликации

Page 33: Рефакторинг

Когда рефакторить?

Правило трех

Каждый божий день

Page 34: Рефакторинг

http://c2com/cgi/wiki?CodeSmell

Чем пахнет?

Дубликация

Длинный метод

Огромный класс

Длинный список параметров

Комментарии

Page 35: Рефакторинг

Маленькие шаги

A B

Page 36: Рефакторинг

Маленькие шаги

A B

Page 37: Рефакторинг

УПРАЖНЕНИЕ

Page 38: Рефакторинг

Переместить метод

Page 39: Рефакторинг

Проблемы с рефакторингом

Сложно найти все «запахи» сразу

Одну ягодку беру, на другую смотрю, третью примечаю, четвертая мерещится

Некоторые «запахи» локальные, некоторые более широкие

Все «вылизать» не получится

Page 40: Рефакторинг

• 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

Каталог рефакторингов

Page 41: Рефакторинг

УПРАЖНЕНИЕ

Page 42: Рефакторинг

Избавиться от временной переменной

Page 43: Рефакторинг

FrequentRenterPoints

Page 44: Рефакторинг

+Statement()

Customer Rental

+DaysRented : int

+Price : double

+FrequentRenterPoints : int

Movie

+PriceCode : int

Что получилось

Page 45: Рефакторинг

Разбить цикл

Page 46: Рефакторинг

А как же производительность???

Теперь цикл выполняется дважды!

Код для читаемости, а не для производительности.

• Если возникнут проблемы с производительностью, скорее всего это будет не там, где вы ожидаете

• Но ее будет легко починить, если код чистый

Холивар

Page 47: Рефакторинг

Что надо сделать перед рефакторингом?

Page 48: Рефакторинг

Заменить switch полиморфизмом

Page 49: Рефакторинг

А ВОТ ТЕПЕРЬ ХАРДКОР

Page 50: Рефакторинг

Наш новый проект

https://github.com/SmartStepGroup/AwfulVideoStore

Page 51: Рефакторинг
Page 52: Рефакторинг

ИЗОЛЯЦИЯ ЗАВИСИМОСТЕЙ

Page 53: Рефакторинг

ПОДМЕНА ПОВЕДЕНИЯ

Page 54: Рефакторинг

SPROUT METHOD

Page 55: Рефакторинг

ИЗБАВЛЯЕМСЯ ОТ STATIC

Page 56: Рефакторинг

ИНЪЕКЦИЯ ЗАВИСИМОСТЕЙ

Page 57: Рефакторинг

Что такое рефакторинг

Рефакторинг – это непрерывный процесс

Рефакторинг – это просто

Основные рефакторинги

Маленькие шаги

Как рефакторить старый код

Технический долг

Чему мы научились

Page 58: Рефакторинг

Прислать примеры сложного кода из вашего проекта

Домашнее задание

Page 59: Рефакторинг

Книги

Page 60: Рефакторинг

Вопросы?

Page 61: Рефакторинг

Контакты

http://get.cardmone.net