Работа с унаследованным кодом. Есть ли жизнь после...
TRANSCRIPT
![Page 1: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/1.jpg)
Работа с унаследованным кодом.Есть ли жизнь после коммита?
Вадим Крючков [Long]
Бюро Информационных Решений
![Page 2: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/2.jpg)
Почему тема поднята именно сейчас?
![Page 3: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/3.jpg)
Условия использования
• Внедрена любая CVS• Иметь (хотя бы поверхностные
представления) о тестировании
![Page 4: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/4.jpg)
Вспомните — вы открываете код нового проекта и ...
![Page 5: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/5.jpg)
![Page 6: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/6.jpg)
![Page 7: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/7.jpg)
![Page 8: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/8.jpg)
Что такое "унаследованный код"?
• Не понятный код• Трудноизменяемый код• Код без тестов — без тестов мы не можем контролировать
изменение кода.
![Page 9: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/9.jpg)
Чем он плох?
• До 70% рабочего времени мы читаем код• Требования меняются — код должен отвечать новым
требованиям• Мы не можем гарантировать:
– измененный код работает так, как предполагалось– изменения не поломали работающую систему
А изменения вносить надо!
![Page 10: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/10.jpg)
Вариант альфа
Это не наш метод!
![Page 11: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/11.jpg)
Откуда берется унаследованный код?
• Достается в «наследство»
• Мы сами его пишем
Почему код начинает загнивать?
![Page 12: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/12.jpg)
Теория разбитых окон
• В 1982 году Джейм Уилсон и Джордж Келлинг
• Проверка — 6 экспериментов (подробнее — см. wikipedia.org)
![Page 13: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/13.jpg)
![Page 14: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/14.jpg)
Как бороться?
Основной метод — воспользоватьсяпринципом бойскаутов- покидая место, оставь его более чистым, чем оно было до твоего прихода
![Page 15: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/15.jpg)
• Читаете код - если стало понятно что он делает — откомментируйте его
• Встретили метод без phpDoc - остановитесь, напишите его
• Если нужно внести изменение в метод - сначала напишите тест, который проверяет только этот метод, а потом вносите изменения
![Page 16: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/16.jpg)
Главная проблема при коллективном владении кодом -
сделает кто-то другой
Код - это дом, в котором вам придется жить!
![Page 17: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/17.jpg)
От теории к практике
• Общий подход • Несколько сложных случаев
![Page 18: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/18.jpg)
Общий подход - условия
• Имеется унаследованный код• Необходимо в него внести изменения• Тестов нет. Ужас-ужас-ужас.
![Page 19: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/19.jpg)
Общий подход - решение
Характеристические тесты — тесты, требующиеся для сохранения поведения системы
Особенности:• Пишутся по готовому работающему коду (anti-TDD)• Принцип белого ящика• Что делать с найденными ошибками? Сохранять поведение +
помечать на исправление.
![Page 20: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/20.jpg)
Алгоритм построения характеристического теста
(1) Выбираем участок кода в методе (тестируем не весь метод!)(2) Пишем утверждение, которое заведомо противоречит этому
участку(3) Запускаем тест — тест провален(4) Изменяем тест — тест проходит(5) Возвращаемся к шагу (1)
![Page 21: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/21.jpg)
Общий подход — правило применения
Прежде чем использовать любой метод — напишите на него характеристические тесты
![Page 22: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/22.jpg)
Два характерных случая
![Page 23: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/23.jpg)
Огромные методы
• Методы имеют тенденцию расти — в них вводят новую логику
• Метод начинает выполнять не одну, а много разных функций
Решение:• Реорганизация - извлечение метода• Извлекайте не большие, но логически
цельные фрагменты кода• Оставить только скелет — логику работы —
от изначального метода
![Page 24: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/24.jpg)
Класс слишком крупный
• Принцип единственной ответственности — единственное назначение в системе, единственная причина для изменений
Извлечение класса:• Сгруппируйте сходные по именам методы — возможно они
группируются в отдельный класс• Анализ скрытых методов — наличие большого кол-ва приватных
и защищенных методов скорей всего означает, что требуется новый класс
• Существуют ли поля, которые используются в одних методах и не используются в других? Возможно их стоит объединить в отдельный класс?
![Page 25: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/25.jpg)
Подробнее?
Мартин Фаулер. Рефакторинг. Улучшение существующего кода
![Page 26: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/26.jpg)
Несколько советовиз практики
![Page 27: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/27.jpg)
Распространение изменений
1. Возвращаемые значения — используются в вызывающей части2. Изменение объектов, передаваемых в параметрах3. Изменения данных, используемых в дальнейшем
![Page 28: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/28.jpg)
Разбиение команд и запросов
• Командный метод — изменяет состояние объекта (данных)• Запросный метод — только возвращает значение
Метод должен быть либо командным, либо запросным, но не тем и не другим одновременно.
Запросный метод без проблем может быть использован повторно. Командный — можно получит не желательный эффект
![Page 29: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/29.jpg)
Правка с единственной целью
• Часто изменяя один метод, возникает потребность исправить другой.
• Не поддавайтесь этому искушению. • Делайте все по порядку.• Запишите что хотели менять и вернитесь к первоначальной
задаче
![Page 30: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/30.jpg)
Код (метод) слишком большой для понимания
• Распечатайте этот участок кода• Запаситесь маркерами• Если код глубоко вложенный — читайте его не опускаясь на
следующий уровень, после закрытой скобки поставьте комментарий. Повторите на новом уровне вложенности.
• Выделяйте группы ответственности одним цветом• Части кода, которые можно вынести в отдельный метод
обведите• Вернитесь в редактор и выполните изменения в коде
![Page 31: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/31.jpg)
Код не понятен для его изменения
• Рисуйте эскизы — отмечайте связи между объектами• Совсем не обязательно использовать формальный UML — эскиз
нужен прежде всего вам!• Найдите на них объекты, на которые изменением будет оказано
воздействие
![Page 32: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/32.jpg)
TDD и унаследованный код
Как использовать практику TDD?
Решение — разделите задачи:• Для нового кода — используйте TDD• Для унаследованного — пишите характеристические тесты
В результате — пишем новый код независимо от старого
![Page 33: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/33.jpg)
Спасибо!
• l-o-n-g.livejournal.com• @v_kruchkov
Не пишите унаследованный код :)
![Page 34: Работа с унаследованным кодом. Есть ли жизнь после коммита](https://reader033.vdocuments.site/reader033/viewer/2022052822/554bc735b4c90594278b55f0/html5/thumbnails/34.jpg)
Вопросы?