Работа с унаследованным кодом. Есть ли жизнь после...

34
Работа с унаследованным кодом. Есть ли жизнь после коммита? Вадим Крючков [Long] Бюро Информационных Решений

Upload: vadim-kruchkov

Post on 08-May-2015

1.663 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Работа с унаследованным кодом. Есть ли жизнь после коммита

Работа с унаследованным кодом.Есть ли жизнь после коммита?

Вадим Крючков [Long]

Бюро Информационных Решений

Page 2: Работа с унаследованным кодом. Есть ли жизнь после коммита

Почему тема поднята именно сейчас?

Page 3: Работа с унаследованным кодом. Есть ли жизнь после коммита

Условия использования

• Внедрена любая CVS• Иметь (хотя бы поверхностные

представления) о тестировании

Page 4: Работа с унаследованным кодом. Есть ли жизнь после коммита

Вспомните — вы открываете код нового проекта и ...

Page 5: Работа с унаследованным кодом. Есть ли жизнь после коммита
Page 6: Работа с унаследованным кодом. Есть ли жизнь после коммита
Page 7: Работа с унаследованным кодом. Есть ли жизнь после коммита
Page 8: Работа с унаследованным кодом. Есть ли жизнь после коммита

Что такое "унаследованный код"?

• Не понятный код• Трудноизменяемый код• Код без тестов — без тестов мы не можем контролировать

изменение кода.

Page 9: Работа с унаследованным кодом. Есть ли жизнь после коммита

Чем он плох?

• До 70% рабочего времени мы читаем код• Требования меняются — код должен отвечать новым

требованиям• Мы не можем гарантировать:

– измененный код работает так, как предполагалось– изменения не поломали работающую систему

А изменения вносить надо!

Page 10: Работа с унаследованным кодом. Есть ли жизнь после коммита

Вариант альфа

Это не наш метод!

Page 11: Работа с унаследованным кодом. Есть ли жизнь после коммита

Откуда берется унаследованный код?

• Достается в «наследство»

• Мы сами его пишем

Почему код начинает загнивать?

Page 12: Работа с унаследованным кодом. Есть ли жизнь после коммита

Теория разбитых окон

• В 1982 году Джейм Уилсон и Джордж Келлинг

• Проверка — 6 экспериментов (подробнее — см. wikipedia.org)

Page 13: Работа с унаследованным кодом. Есть ли жизнь после коммита
Page 14: Работа с унаследованным кодом. Есть ли жизнь после коммита

Как бороться?

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

Page 15: Работа с унаследованным кодом. Есть ли жизнь после коммита

• Читаете код - если стало понятно что он делает — откомментируйте его

• Встретили метод без phpDoc - остановитесь, напишите его

• Если нужно внести изменение в метод - сначала напишите тест, который проверяет только этот метод, а потом вносите изменения

Page 16: Работа с унаследованным кодом. Есть ли жизнь после коммита

Главная проблема при коллективном владении кодом -

сделает кто-то другой

Код - это дом, в котором вам придется жить!

Page 17: Работа с унаследованным кодом. Есть ли жизнь после коммита

От теории к практике

• Общий подход • Несколько сложных случаев

Page 18: Работа с унаследованным кодом. Есть ли жизнь после коммита

Общий подход - условия

• Имеется унаследованный код• Необходимо в него внести изменения• Тестов нет. Ужас-ужас-ужас.

Page 19: Работа с унаследованным кодом. Есть ли жизнь после коммита

Общий подход - решение

Характеристические тесты — тесты, требующиеся для сохранения поведения системы

Особенности:• Пишутся по готовому работающему коду (anti-TDD)• Принцип белого ящика• Что делать с найденными ошибками? Сохранять поведение +

помечать на исправление.

Page 20: Работа с унаследованным кодом. Есть ли жизнь после коммита

Алгоритм построения характеристического теста

(1) Выбираем участок кода в методе (тестируем не весь метод!)(2) Пишем утверждение, которое заведомо противоречит этому

участку(3) Запускаем тест — тест провален(4) Изменяем тест — тест проходит(5) Возвращаемся к шагу (1)

Page 21: Работа с унаследованным кодом. Есть ли жизнь после коммита

Общий подход — правило применения

Прежде чем использовать любой метод — напишите на него характеристические тесты

Page 22: Работа с унаследованным кодом. Есть ли жизнь после коммита

Два характерных случая

Page 23: Работа с унаследованным кодом. Есть ли жизнь после коммита

Огромные методы

• Методы имеют тенденцию расти — в них вводят новую логику

• Метод начинает выполнять не одну, а много разных функций

Решение:• Реорганизация - извлечение метода• Извлекайте не большие, но логически

цельные фрагменты кода• Оставить только скелет — логику работы —

от изначального метода

Page 24: Работа с унаследованным кодом. Есть ли жизнь после коммита

Класс слишком крупный

• Принцип единственной ответственности — единственное назначение в системе, единственная причина для изменений

Извлечение класса:• Сгруппируйте сходные по именам методы — возможно они

группируются в отдельный класс• Анализ скрытых методов — наличие большого кол-ва приватных

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

• Существуют ли поля, которые используются в одних методах и не используются в других? Возможно их стоит объединить в отдельный класс?

Page 25: Работа с унаследованным кодом. Есть ли жизнь после коммита

Подробнее?

Мартин Фаулер. Рефакторинг. Улучшение существующего кода

Page 26: Работа с унаследованным кодом. Есть ли жизнь после коммита

Несколько советовиз практики

Page 27: Работа с унаследованным кодом. Есть ли жизнь после коммита

Распространение изменений

1. Возвращаемые значения — используются в вызывающей части2. Изменение объектов, передаваемых в параметрах3. Изменения данных, используемых в дальнейшем

Page 28: Работа с унаследованным кодом. Есть ли жизнь после коммита

Разбиение команд и запросов

• Командный метод — изменяет состояние объекта (данных)• Запросный метод — только возвращает значение

Метод должен быть либо командным, либо запросным, но не тем и не другим одновременно.

Запросный метод без проблем может быть использован повторно. Командный — можно получит не желательный эффект

Page 29: Работа с унаследованным кодом. Есть ли жизнь после коммита

Правка с единственной целью

• Часто изменяя один метод, возникает потребность исправить другой.

• Не поддавайтесь этому искушению. • Делайте все по порядку.• Запишите что хотели менять и вернитесь к первоначальной

задаче

Page 30: Работа с унаследованным кодом. Есть ли жизнь после коммита

Код (метод) слишком большой для понимания

• Распечатайте этот участок кода• Запаситесь маркерами• Если код глубоко вложенный — читайте его не опускаясь на

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

• Выделяйте группы ответственности одним цветом• Части кода, которые можно вынести в отдельный метод

обведите• Вернитесь в редактор и выполните изменения в коде

Page 31: Работа с унаследованным кодом. Есть ли жизнь после коммита

Код не понятен для его изменения

• Рисуйте эскизы — отмечайте связи между объектами• Совсем не обязательно использовать формальный UML — эскиз

нужен прежде всего вам!• Найдите на них объекты, на которые изменением будет оказано

воздействие

Page 32: Работа с унаследованным кодом. Есть ли жизнь после коммита

TDD и унаследованный код

Как использовать практику TDD?

Решение — разделите задачи:• Для нового кода — используйте TDD• Для унаследованного — пишите характеристические тесты

В результате — пишем новый код независимо от старого

Page 33: Работа с унаследованным кодом. Есть ли жизнь после коммита

Спасибо!

• l-o-n-g.livejournal.com• @v_kruchkov

Не пишите унаследованный код :)

Page 34: Работа с унаследованным кодом. Есть ли жизнь после коммита

Вопросы?