В Thunkable X есть блоки, которые могут принимать данные разных типов, и те, которые ожидают получить данные определённого типа. Значит ли это то, что в последнем случае необходимо изначально создавать данные нужного типа? Нет, поскольку тип данных можно преобразовать к нужному перед использованием в таких блоках. Сложность в том, что при определении типа данных на глаз, как это делают начинающие пользователи, часто возникают ошибки, так как вполне возможны ситуации, когда внешне данные выглядят идентично, а их тип различается, в результате чего блоки не работают. Для решения таких задач необходимо уметь определять реальный тип данных.
Когда и в каких случаях использовать тот или иной тип данных? Каждый тип данных имеет преимущества, о которых подробно можно узнать из языков программирования. Это объем выделяемой памяти, скорость и удобство работы с ним и др. Чем сложнее тип данных, тем больше ресурсов он потребляет, но тем большей функциональностью он обладает. Если сказать коротко, то наиболее универсальным и распространённым в Thunkаble X (и не только) является строковый тип. В строковый тип можно преобразовать любой другой тип данных и для вывода информации на экран система автоматически производит преобразование данных в него. Далее следует принять во внимание то, какие операции будет производиться со значениями. Если математические, то, очевидно, практичнее выбрать число. Если имеется множество данных, относящихся к одной сущности, то лучшим выбором будет объект. При этом объект следует понимать в широком смысле слова, а не только какой-то частный вариант. Например, приложение тоже является объектом и вместо создания множества переменных для хранения его настроек, можно создать один объект, в полях которого будут сохранены все настройки.
Функциональность Thunkable X весьма ограничена и с целью упрощения алгоритмов здесь можно использовать различные фокусы, включая совместное использование несовместимых типов. Если, например, кнопка постоянно видна на экране, то для расширения функциональности кнопки, её свойству visible можно присвоить объект, пользуясь тем, что Thunkable X допускает это, а любой объект возвращает true, что и нужно для того, чтобы кнопка всегда была видна. Этот приём называется перегрузкой свойств. Например, в свойство visible кнопки вы можете сохранить ссылку на html-страницу и при нажатии на кнопку получить это значение из блока visible.
Вообще говоря, при разработке приложений на Thunkable X можно использовать хорошо известный подход “что не запрещено, то разрешено”. Если вы уверены в своих силах и понимаете последствия данного подхода, то он позволит выйти далеко за рамки документированных возможностей платформы за счёт увеличения риска того, что на каком-то устройстве что-то работать не будет. Если вы планируете разрабатывать приложение для себя и только под своё устройство, то в этом случае можно вполне безопасно использовать разные фокусы.
Определение типа данных
Как уже говорилось, в Thunkable X нет блока для определения типа данных, и приходится его определять вручную. При этом нужно помнить один важный момент – во многих случаях тип данных невозможно определить на глаз.
В качестве примера определим тип значения undefined. Это значение состоит из символов, на основании чего делается предположение о том, что это значение имеет строковый тип. Раз это строка, значит, она имеет длину, которую можно получить при помощи блока length of. Проверим это при помощи примера “Get type”. Длина undefined = 0. Как такое возможно? Это баг Thunkable X? Нет, в данном случае это не баг системы. Undefined – это не строка, а специальное значение. Увидеть на экране значение undefined можно по той причине, что оно автоматически преобразуется в строковый тип при использовании блока установки надписи на кнопке.
Другой пример. Значение 3.15 это число? Не всегда. Если число находится в текстовом блоке, то это строка. Если число находится в числовом блоке – это число. Если к числу применить блок length of, то получим значение undefined.
Если к блоку length of присоединить блок null, то получим значение 4. Значит ли это то, что null имеет строковый тип? Нет. Если бы значение null было строкового типа, то тогда null было бы равно строке ”null”, а это не так. Если это не строка, то блок length of должен давать ошибку, но он даёт правильное значение 4. Это происходит из-за того, что при подключении блока null к блоку length of происходит автоматическое преобразование null в строку, а затем производится вычисление длины этой строки.
При работе с базой данных Firebase может получиться так, что одинаковая на вид структура данных может быть либо массивом, либо объектом, значения которого содержат элементы массива. Определить это можно при помощи блока generateJSONfromobject.
При использовании одних блоков Thunkable X происходит автоматическое преобразование типов, а при использовании других – это не происходит. Для чего нужна такая путаница и как с этим разобраться? Для этого требуются знания и опыт. Воспринимайте это как особенности Thunkable X. Как говорилось во вступлении к курсу, разработчики пытаются сделать Thunkable X простым для использования, но, как вы понимаете, невозможно создать язык программирования, который будет понятен каждому человеку на земле. Если вы хотите узнать моё мнение, то я считаю, что работа блоков в Thunkable X должна совпадать с тем, как это происходит в текстовом программировании. Иначе после изучения Thunkable X будет сложнее изучать языки программирования и наоборот.
Как правило, обмен данными происходит в текстовом виде, потому что строки – это наиболее универсальный тип данных. Но бывают и исключения. Если данные получены от web-сервиса, то это, скорее всего будут данные строкового типа, а если из локального блока Thunkable X, то это может быть или строка, или объект (массив объектов). Для проверки блок с этими данными можно присоединить к блоку Label set text. Если это блок ничего не покажет или отобразит строку “[object Object]”, то это объект.
Если к компоненту Local DB присоединить блок объекта в качестве значения, то получить этот объект не получится из-за того, что внутри этого компонента объект преобразуется в массив объектов. Для получения этого объекта вначале нужно использовать блок для получения первого элемента списка.
Для уменьшения объёма передаваемых данных, они могут передаваться не в текстовом, а в двоичном виде (в виде чисел). В Thunkable X нет блоков для работы с двоичным форматом, но о нём нужно хотя бы знать, так как, например, изображения передаются в двоичном формате. Предположим, каждый символ занимает 1 байт памяти. Тогда для передачи команды Arduino ”start” для этого потребуется 5 байт, а для передачи числа 100 – 1 байт (числа от 0 до 255 включительно занимают 1 байт памяти).
Если непонятно то, какой тип имеют данные, то необходимо явно преобразовать их в нужный тип. Предположим, локальный блок возвращает значение null. Какое это значение типа? Это значение может быть null, а может быть и ”null”. Null не равно “null”, потому что это значения разного типа. Если вам необходимо сравнить между собой значения разных типов, то они должны быть преобразованы автоматически или вручную к значениям одинаковых типов. Иначе получится так, скорость легкового автомобиля будет сравниваться с грузоподъемностью грузового.
Операция приведения типа требует дополнительных блоков и дополнительное (очень небольшое) время на их исполнение, но ваше приложение будет защищено от краха, которое может возникнуть при выполнении операции над данными неподходящего типа.
Как вы знаете, Thunkable X позволяет создавать приложения и для iOS, и для Android. Если ваше приложение хорошо работает на iOS, то это не значит, что оно также хорошо будет работать и на Android. Поэтому внимательно следите за типами данных. Если этого не делать, то может получиться так: одни и те же блоки хорошо работают на iOS, но могут вызвать сбой приложения на Android.