Are You Still Debugging?

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Отладка - это “процесс запуска программы/метода в интерактивном режиме, приостановка выполнения после каждого оператора и отображение…” Вкратце, это очень полезная техника… для плохого программиста. Или для старого программиста, который все еще пишет процедурный код на C. Объектно-ориентированные программисты никогда не отлаживают свой код - они пишут модульные тесты. Моя точка здесь заключается в том, что модульное тестирование является техникой, полностью заменяющей отладку. Если требуется отладка, значит проектирование плохое.

Допустим, я плохой императивный процедурный программист, и это мой код на Java:

Этот статический утилитарный метод читает содержимое файла и затем находит все уникальные слова в нем. Довольно просто. Однако, если он не работает, что мы делаем? Допустим, это файл:

Отсюда мы получаем следующий список слов:

Теперь это выглядит неправильно для меня… так какой следующий шаг? Либо чтение файла работает неправильно, либо разделение сломано. Давайте отладим, верно? Дадим ему файл через ввод и будем идти шаг за шагом, отслеживая и наблюдая за переменными. Мы найдем ошибку и исправим ее. Но когда возникает аналогичная проблема, нам придется снова отлаживать! И вот что должно предотвращать модульное тестирование.

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

Однако все это будет работать только в том случае, если создание модульного теста будет легким. Если это сложно, я буду слишком ленивым, чтобы это делать. Я просто отлажу и исправлю проблему. В данном конкретном примере создание теста является довольно затратной процедурой. Я имею в виду сложность модульного теста будет довольно высокой. Нам нужно создать временный файл, заполнить его данными, запустить метод и проверить результаты. Чтобы выяснить, что происходит и где находится ошибка, мне придется создать несколько тестов. Чтобы избежать дублирования кода, мне также придется создать некоторые дополнительные утилиты, чтобы помочь мне создать этот временный файл и заполнить его данными. Это много работы. Что ж, может быть, не “много”, но намного больше, чем несколько минут отладки.

Таким образом, если вы считаете, что отладка проще и быстрее, задумайтесь о качестве вашего кода. Я уверен, что в нем есть много возможностей для рефакторинга, как и в коде из приведенного примера. Вот как я бы его изменил. Прежде всего, я бы превратил его в класс, потому что статические методы утилит - это плохая практика:

Это уже выглядит лучше, но сложность все еще присутствует. Далее, я бы разбил это на более маленькие классы:

Что ты думаешь сейчас? Написание теста для класса Words - довольно тривиальная задача:

Сколько времени это заняло? Меньше минуты. Нам не нужно создавать временный файл и загружать его данными, потому что класс Words ничего не делает с файлами. Он просто разбирает входную строку и находит в ней уникальные слова. Теперь это легко исправить, так как тест небольшой и мы легко можем создать еще тесты; например:

Моя точка зрения заключается в том, что отладка необходима, когда время, затраченное на написание модульного теста, значительно превышает время, затраченное на нажатие кнопок “Trace-In/Trace-Out”. И это логично. Мы все ленивы и хотим быстрых и простых решений. Однако отладка требует времени и энергии. Она помогает нам находить проблемы, но не помогает предотвращать их повторное возникновение.

Отладка необходима, когда наш код является процедурным и алгоритмическим - когда код полностью определяет как будет достигнута цель, а не что эта цель представляет собой. Посмотрите на приведенные выше примеры. Первый статический метод полностью определяет, как мы читаем файл, разбираем его и находим слова. Он даже называется readWords() (глагол). Второй пример, напротив, описывает, что будет достигнуто. Это либо Text файла, либо Words текста (оба являются существительными).

Я считаю, что в чистой объектно-ориентированной программировании для отладки нет места. Только модульное тестирование!

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 10:02

sixnines availability badge   GitHub stars