Умение отлаживать приложения является важным и необходимым навыком, но при работе в нестабильных и постоянно изменяющихся средах разработки, к которым относится Thunkable X, роль отладки становится ещё важнее.
В Thunkable X отсутствуют инструменты отладки и понятия "отлаженное приложение" не существует, но есть понятие работающего приложения на той или иной модели устройства. Поиск и устранение пользовательских ошибок осуществляется путём тестирования проекта в приложении Thunkable Live. Данное тестирование не может заменить отладку. В случае критического сбоя Thunkable Live не запустится или аварийно завершится.
Для оперативного отслеживания значений переменных можно использовать глобальные переменные типа "cloud" (для этого лучше использовать свою базу Firebase, а не общую, доступную для всех пользователей) и блок "слушателя"их изменений "when cloud initializes or changes". Вывод логов осуществляется в многострочную текстовую область Label или область просмотра списка List Viewer.
Большое количество ошибок в приложении возникают по причине того, что создание логики его работы и работа с данными на этапе разработки в большой степени основывается на предположениях. Даже в случае хорошего знания алгоритмов и функциональности блоков их использование основывается на предположении о том, что используемая связка блоков будет работать так, как задумывалось. Также разработчик предполагает, что блоки работают с корректными данными.
Работа любого приложения основывается на работе с данными. При обнаружении любой ошибки в приложении первым делом необходимо проверить корректность данных, поступающих в блоки или находящихся в них. Для этого значение проверяемого блока нужно вывести на экран при помощи многострочной текстовой области Label. Добавьте на экран Label и подключите к блоку Label.Text проверяемый блок. Для отображения сложного типа данных его предварительно преобразуйте в формат JSON при помощи блока "generate JSON from object".
Многострочное текстовое поле Label является основным инструментом отладки в Thunkable X
Лучше один раз вывести значение данных проверяемого блока на экран и увидеть его, чем 10 раз предположить, что в проверяемом блоке находится
Только после проверки корректности данных переходите к поиску ошибки в логике работы.
При обнаружении любой ошибки вначале проверяйте корректность данных
Нередко разработчики забывают о проверке данных и в случае возникновения ошибки начинают править логику - переподключают блоки, добавляют в логику новые блоки, пробуют другие варианты решения задачи и т.п. Это неправильный подход, в результате которого можно потратить очень много времени на правку рабочей логики, но так и не обнаружить ошибку, которая находится в данных.
Работа с данными происходит в пространстве и времени. Данные следует понимать в cамом широком смысле слова, а не только в качестве данных из базы или файла. Значения свойств объектов (надпись на кнопках, размеры компонентов и др.), - это тоже данные. Пространственная составляющая говорит о том, что данные (или их копии) с течением времени могут перемещаться физически, например, физическое перемещение происходит при запросе данных от сервера. Сюда можно отнести и случай, когда данные используются в разных частях кода или на экране. С течением времени данные могут изменяться или оставаться неизменными. В целях упрощения учёта этих и других факторов воспользуемся понятием состояния данных, при помощи которого можно получить информацию о том, существуют они или не существуют, перемещаются или не перемещаются, изменились или не изменились, являются ли они верными или содержат ошибку. Любое изменение данных приводит к изменению их состояния и наоборот.
Если исходные данные корректны, но при их использовании возникает ошибка, то, очевидно, это происходит где-то между инициализацией и точкой контроля значения. Для локализации ошибки необходимо знать путь выполнения приложения и последовательность работы с данными. В большинстве случаев направление движения данных очевидно - справа налево и сверху вниз, но в Thunkable X также есть блоки циклов и блоки с асинхронной работой, использование которых вызывает трудности. Для вывода на экран значений данных в этих случаях необходимо произвести их накопление. Создайте блок новой переменной и присвойте ей пустое значение. В цикле и асинхронных блоках к значению данной переменной добавьте новые значения и сохраняёте в этой же переменной. После этого накопленные данные в переменной выведите на экран в многострочном Label.
Ошибки могут возникать не только при изменении данных. Если данные остались неизменными, а должны были измениться, то это тоже ошибка:
Данные не отображаются на экране
Сначала нужно убедиться в том, что данные исходно существуют. Это как проверка напряжения в сети, если электроприбор перестал работать. А разве данные могут не существовать? Конечно! Пользователь может забыть их ввести или ввел, но другие данные и в другое место. Например, пользователь увидел в Интернете пример подключения к web-сервису. При помощи блоков он создаёт приложение, но оно не работает. Он использует другие блоки - результат аналогичный. Через пару часов безуспешных попыток пользователь задаёт на форуме вопрос, а почему его блоки не работают, хотя всё он сделал правильно по примеру? Делаем из браузера запрос к web-сервису и видим, что ответ не содержит данных.
Почему пользователь не смог самостоятельно обнаружить ошибку и исправить её? Потому что он делал отладку на основе своих предположений о том, что данные от web-сервиса поступают в приложение. А с чего они вообще должны поступать? Любое предположение нужно подтверждать доказательством.
Предположим, исходные данные существуют, но они не отображаются в приложении. В такой ситуации можно использовать диалог с самим собой в виде наводящих вопросов и ответов от общего к частному или от частного к общему.
Вопрос. Данные есть на web-сервере?
Ответ. Да.
Вопрос. Данные поступают в приложение?
Ответ. Да.
Вопрос. В приложение поступают корректные данные?
Ответ. Нет.
Проверяйте не только факт существования данных, но и их корректность
Другой пример.
Вопрос. Данные не отображаются в списке. Почему?
Ответ. Потому что их в списке нет.
Вопрос. Почему их нет в списке?
Ответ. Потому что их в список не добавили.
Вопрос. Почему они не добавились в список, если в этой функции происходит добавление в список?
Ответ. Потому что, возможно, данные не поступают в эту функцию или не работают блоки добавления данных в список, или они добавляют данные в другой список и т.д.
При поиске ошибки также можно (и нужно) использовать подход, который применяется при обрыве линии связи. Для этого нужно просто пойти вдоль линии связи, а в нашем случае - пойти по маршруту движения данных (выполнения приложения) от точки их первоначального расположения до места их конечного расположения (в коде или на экране). Нажали на кнопку? Проверьте прохождение данных, начиная от обработчика события нажатия на кнопку.
Данные содержат ошибку (ошибочно изменяется или не изменяется их состояние)
Это говорит о том, что в процессе работы с данными была выполнена или не была выполнена одна или несколько операций, которые привели к ошибке. Здесь возможны следующие варианты:
В этом случае нужно сначала найти проблемную операцию (функцию), а затем произвести пошаговое выполнение блоков внутри неё с выводом значений данных на экран.