День сто пятьдесят седьмой. #Оффтоп
Рефакторинг унаследованного (легаси) кода.
Как обычно, гуляя по ютубу, наткнулся на вот такое интересное видео https://www.youtube.com/watch?v=XejfFBvODxc
Лекция разработчика из Додо Пиццы (ВНЕЗАПНО!) по рефакторингу. Как исправлять, поддерживать и покрывать тестами код, при этом сохраняя старый код и не рискуя ничего поломать. Далеко не со всеми методами лично я согласен, однако, есть и некоторые интересные приёмчики.
Коротко об основных приёмах:
1. Сохраняем сигнатуры
Даже самые ужасные на вид сигнатуры из легаси методов безопаснее просто скопировать для использования в новых методах, чем производить какие-либо манипуляции с аргументами.
2. Метод/класс росток
Если нужно внести дополнение в старый метод, вставляем туда новый метод, который покрываем тестами. Хотя бы новый код будет протестирован.
3. Метод/класс обёртка
Для добавления функциональности к старому методу создаём новый метод, в котором вызываем старый и добавляем новый код. В отношении классов используем шаблон Декоратор: наследуем от старого класса, добавляя функциональность.
4. Извлечение и переопределение
Если метод использует функциональность, которую нельзя или трудно протестировать явно (запись в консоль/файл/БД, отправка писем клиентам, отправка платежей и т.п.), извлекаем вызов каждого такого метода в новый метод, который делаем
Рефакторинг унаследованного (легаси) кода.
Как обычно, гуляя по ютубу, наткнулся на вот такое интересное видео https://www.youtube.com/watch?v=XejfFBvODxc
Лекция разработчика из Додо Пиццы (ВНЕЗАПНО!) по рефакторингу. Как исправлять, поддерживать и покрывать тестами код, при этом сохраняя старый код и не рискуя ничего поломать. Далеко не со всеми методами лично я согласен, однако, есть и некоторые интересные приёмчики.
Коротко об основных приёмах:
1. Сохраняем сигнатуры
Даже самые ужасные на вид сигнатуры из легаси методов безопаснее просто скопировать для использования в новых методах, чем производить какие-либо манипуляции с аргументами.
2. Метод/класс росток
Если нужно внести дополнение в старый метод, вставляем туда новый метод, который покрываем тестами. Хотя бы новый код будет протестирован.
3. Метод/класс обёртка
Для добавления функциональности к старому методу создаём новый метод, в котором вызываем старый и добавляем новый код. В отношении классов используем шаблон Декоратор: наследуем от старого класса, добавляя функциональность.
4. Извлечение и переопределение
Если метод использует функциональность, которую нельзя или трудно протестировать явно (запись в консоль/файл/БД, отправка писем клиентам, отправка платежей и т.п.), извлекаем вызов каждого такого метода в новый метод, который делаем
protected virtual
. Далее создаём тестовый класс, унаследованный от старого класса, в котором переопределяем нужные методы, чтобы их можно было протестировать (например, вместо записи в файл сохраняем в память). Таким образом можно протестировать логику старого класса через тестовый, не вызывая ненужных нам методов.