DroidScript
DroidScript
разработка мобильных приложений

Типы данных

Секреты Thunkable X  
27.10.2019

На палитре блоков все встроенные блоки распределены по категориям. Это позволяет увидеть то, какие операции можно выполнить над числами, текстом и др., но для составления устойчиво работающей программной логики, поиска и исправления ошибок необходимо разобраться с типами данных

Тип данных является важнейшим понятием в программировании, который определяет множество значений и операций над этими значениями. Над данными числового типа можно производить математические операции, а строки объединять друг с другом. Если разделить строку “Hello” на строку ”World”, то это приведёт к возникновению ошибки вычислений NaN (не число), но операция “Hello” + ”World” (для которой в Thunkable X нужно использоваь блок join) допустима и приводит к объединению строк в строку ”HelloWorld”.

С типом данных неразрывно связана операция преобразования типов данных, которая широко используется в различных операциях, а также и для упрощения работы с данными. В одних случаях с данными проще работать как со строками, в другом - как со списком, в третьем - как с объектами и т.д.

Преобразование типов данных требуется для вывода данных на экран. Дело в том, что далеко не во всех случаях в Thunkable X автоматически производит преобразование типа в строку, что необходимо для отображения на экране. Например, значение null не отображается в диалоге Alert и на основании этого можно сделать неверное предположение о том, что переменная содержит пустую строку ””. В одних случаях ничего страшного при этом не произойдёт, а в других придётся очень долго думать над тем, почему блоки не работают или работают с ошибкой.

Как определить тип данных? К сожалению, в Thunkable X нет функции для определения типа данных и в некоторых случаях приходится использовать несколько разных проверок для точного определения типа данных. Программист должен хорошо понимать типы данных и при возникновении неопределённых ситуаций уметь использовать разные проверки для точного определения типа данных.

В разных информационных источниках говорится о том, что при визуальном программировании нет необходимости учитывать тип данных, поскольку контроль типов данных производит система, не позволяя соединять друг с другом блоки несовместимых типов. Это не так. Система осуществляет лишь частичный контроль типов данных. Переменные в Thunkable X могут принимать данные любого типа, и это может легко привести к попытке выполнить операцию над несуществующим объектом или присоединить блок переменной с неподходящим типом значения и тем самым вызвать ошибку и даже сбой в работе приложения. Это особенно актуально в том случае, когда  данные поступают в приложение из внешних источников или вводятся пользователями. Программа ожидает получить от пользователя число, а пользователь по ошибке или специально вводит нецифровые символы. Если не производить фильтрацию данных, то это может привести к разным последствиям, начиная от возникновения небольшой ошибки и заканчивая крахом приложения или его взломом.

Для уменьшения количества ошибок возьмите за правило всегда инициализировать переменные и не менять их тип без большой необходимости. Так вы будете хотя бы знать, что эта или та переменная в момент запуска приложения имеет определённый тип и, если значение переменной не соответствует этому типу, принять меры предосторожности во избежание возникновения ошибок.

Важность понимания типов данных в Thunkable X обусловлена ещё и тем, что здесь нет локальных переменных, и может легко получиться так, что ошибка с типом глобальной переменной возникает на одном экране, а её последствия вы будете видеть на другом экране, не понимая, откуда она здесь взялась.

Инициализацией называется действие по созданию переменной и присваивания ей первоначального значения. Если пользователь не инициализировал переменную, то она содержит либо значение по умолчанию для глобальных переменных app, stored или cloud, либо значение undefined при использовании переменной функции.

В отличие от блоков initialize app, initialize stored и initialize cloud блоки глобальных переменных set app, set stored и set cloud инициализируют переменные в момент их вызова, а не на этапе инициализации приложения.

Значения по умолчанию для разных блоков:

  • initialize App = “” (пустая строка)
  • initialize Stored = null
  • initialize Cloud = null
  • Блоки App, Stored, Cloud с изменяемым именем = null
  • Переменная из параметра функции = undefined, если нигде не используется её блок
  • Переменная из параметра функции = 0, если её блок существует в редакторе блоков, но к нему не присоединён никакой другой блок (вход свободен)
  • Параметр функции = null, если в блоке вызова функции вход для данного параметра свободен ( к нему не присоединён никакой другой блок)
  • Если в блоке объекта к вход свойства свободен, то свойство не создаётся

Обратите внимание на то, как при помощи блоков в примере ”Init” выводятся значения переменных stored  и cloud – через блок join и generateJSONfromobject. Эти блоки необходимы для того, чтобы увидеть на экране значения переменных. Подробнее об этом вы узнаете дальше в разделе ”преобразование типов”.

В Thunkable X используются следующие типы данных:

Основные:

  • Число
  • Строка
  • Булевый (логический)
  • null (специальное значение)
  • undefined (специальное значение)
  • Объект
  • Массив

Дополнительные

  • Color
  • UUID (системный тип)

К основным типам данным в Thunkable X отнесены типы, которые входят в JavaScript. Это сделано для удобства изучения JavaScript после Thunkable X и наоборот.

Число

Блоки для работы с десятичными целыми и дробными числами имеют синий фон. Они находятся в категории Math палитры блоков.

В множество значений данного типа входят:

  • целые положительные и отрицательные числа, а также 0:

      - 300, 0, 100500

  • положительные и отрицательные дробные числа:

    0.0001, 89.698
  • значения положительной и отрицательной бесконечности Infinity и -Infinity

Числовые значения можно указывать в научной форме, например: 2.3e+10, -5e-2. При вводе их в числовой блок произойдёт преобразование в целые или дробные числа. Числа в научной форме можно ввести в текстовой блок для последующего преобразования в число.

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

0/0 = NaN
“Test” * 10 = NaN

Пример “Number”.

В Thunkable X можно работать с числами в двоичном, восьмеричном и шестнадцатеричном формате. Запись чисел в этом формате производится в текстовой блок. Для записи чисел в этих форматах используются префиксы:

  • 0b - для двоичных чисел
  • o - для восьмеричных
  • 0x - для шестнадцатеричных

Например:

0b0100 = 8
0o167 = 119
0xFF = 256

Для перевода чисел в десятичный формат можно использовать блок absolute:

myVar <- "0b1111"
from Label1 set Text <- absolute <- myVar

Для преобразования десятичного числа от 0 до 256 в шестнадцатеричное число используйте блок color width.

myVar < color width red   <- 0
                     green <- 0
                     blue <- 100
from Label1 set Text <- myVar

Строка

Блоки для работы со строками находятся в разделе Text.

К строкам относится любая последовательность символов, заключенная в двойные или одинарные кавычки. При этом в двойные кавычки можно заключать одиночные и наоборот. Символы Юникода также могут входить в строки, занимая одно или два знакоместа, но различные устройства отображают только некоторые символы Юникода из всего их множество, о чём нужно помнить.

Управляющие символы - \n, \t и другие - не работают в текстовых блоках, но некоторые из этих символов можно скопировать в текстовой блок. Например, символ табуляции можно получить путём копирования из Excel значений из соседних по горизонтали ячеек в текстовой блок, и последующего копирования пустой области, которая будет разделять эти значения в блоке. Или можно использовать объект для получения этого символа.

Строки в Thunkable X являются неизменяемыми:

x <- "Hello"
in list ( make list from text ( x ) with delimiter ( , ) remove # ( 2 ) )
y <- x // "Hello"

Если нужно изменить строку, то для этого придётся создать новую строку с нужными изменениями. Либо можно преобразовать строку в список символов, а после выполнения операции выполнить обратное преобразование.

Пример “String”.

Булевый (логический)

Блоки для работы с данными этого типа находятся в категории Logic. В отличие от математических операция эти операции не так хорошо известны пользователям, поэтому остановимся на них подробнее.

Логический тип в Thunkable X состоит из двух констант – true (истина, да), false (ложь, нет) и используется там, где может существовать всего два значения. Для лучшего понимания значений этого типа представьте себе настольную лампу. Если выключатель замкнут, то это соответствует “true” и лампочка горит, если выключатель разомкнут, то это соответствует “false” и лампочка не горит. Других состояний у переключателя нет – он либо замкнут, либо разомкнут. Также и лампочка, она или горит, или не горит.

Значения данного типа часто используются в логических операциях (поиск и фильтрация данных) при проверке разных утверждений, где в качестве ответа используется всего два значения – да или нет (true или false):

10 > 5 = true (да)
3 > 1.5 = false (нет)

Логические значения чаще всего возникают при односложных ответах на вопросы и используются для проверки справедливости утверждений:

Пользователь зарегистрировался в базе данных?
В списке товаров есть тот, название которого ввёл пользователь?
Значение счётчика достигло значения 100?
Этот объект существует?
Мобильный телефон подключен к сети?
Уже прошла неделя после заданной даты?
Значение узла Firebase соответствует заданному?

Логическая операция and работает так, как и последовательное соединение двух выключателей. Ток в электрической цепи появится (true), если оба выключателя замкнуты:

true and true = true
true and false = false
false and true = false
false and false = false

Операция or работает так, как параллельное соединение выключателей. Ток в электрической цепи появится (true), если хотя бы один выключатель замкнут:

true or true = true
true or false = true
false or true = true
false or false = false

логическая операция not изменяет логическое значение на противоположное:

not true = false
not false = true

Пример “Logic”.

null

Официально null в Thuinkable X следует воспринимать как значение, которое ничего не содержит. Значение null говорит о том, что в переменной ничего нет - ни пустой строки, ни 0, ни пустого объекта, ни пусто списка – нет ничего.

Это значение часто используют при инициализации переменных, значение которых будет присвоено на этапе выполнения приложения.

Если вы знакомы с указателями на объекты, то там значение null является нулевым указателем или ссылкой на несуществующий объект. Разработчики Thunkable X считают, что ссылочный механизм – это слишком сложно для понимания тем, кто незнаком с программированием, и лучше им об этом не знать. Но вы должны об этом знать, что позволит избежать большого количества ошибок и понимать, что это является одной из частых причин краха приложения. Если объект  не существует, но происходит попытка выполнить операцию над ним (например, изменить свойство), то это приведёт к сбою в работе приложения. Объясняется это очень просто. Если объект существует, то это значит, что для него была выделена оперативная память. Если объект не существует, то память не была выделена, и при попытке доступа  к ней произойдёт ошибка.

Запомните, перед выполнением любой операцией с объектом необходимо убедиться в том, что этот объект существует – ссылка на него не равна null. Для этого используется блок if < not < null

Как правило, значением null инициализируют блоки для работы с объектами или в том случае, когда тип данных неизвестен на этапе разработки. Если же вы точно знаете тип данных, который будет храниться в переменной, то вместо null имеет смысл использовать пустое значение (если это допускается программной логикой), соответствующего типа - 0 для числа, ””  - для строки. Это поможет быстро вспомнить, какой тип данных будет храниться в данной переменной – число, строка или объект.

undefined

В Thunkable X нет блока, соответствующего специальному значению undefined. Оно появляется в том случае, если значение переменной функции не определено (или она не имеет присвоенного значения) или выполнена недопустимая операция, или свойство объекта не существует. Если нужно проверить блок переменной на значение undefined, то его нужно сравнить либо с неинициализированной переменной функции, либо присвоить этот блок невидимому компоненту Label и сравнить Label.Text с текстовым блоком ”undefined”.

Значение undefined возникает тогда, когда переменная существует, но по какой-либо причине (ошибка программиста или баг системы) её содержимое не определено. Если это значение имеет локальный блок, то это можно расценивать как баг Thunkable X.
Значения undefined и null – это не одно и тоже. Undefined возвращается тогда, когда переменная существует, но её значение не определено, а null указывает на то, что значение у переменной есть, но оно пустое (ничего не содержит).

Объект

В отличие от всех предыдущих типов, которые являются примитивным и могут хранить простые значения,  объект является сложным типом данных, который может хранить коллекцию данных, включая другие объекты и списки.

Для хранения данных в объекте служат поля fields, доступ к которым происходит при помощи блоков set (установить) и get (получить), в которых нужно указать одноимённые имена свойств properties. Например, для доступа к полю с именем name в блоке для получения или установки свойства нужно указать свойство name.

Поля объекта могут содержать значения разных типов данных. Для удобства работы объекты можно преобразовать в текстовой формат JSON или наоборот - данные из формата JSON преобразовать в объект. Формат JSON является одним из распространённых и удобных для работы форматом данных, который используется для хранения данных в базе данных Firebase, выдачи результатов запросов от различных Web-сервисов и др. Встроенная поддержка работы с этим форматом является одним из преимуществ платформы Thunkable X.

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

Поначалу работа с объектами может вызвать сложности, в отличие от математических операций, но разобраться с объектами будет проще, если вы обратите внимание на то, что в нашей жизни мы постоянно сталкиваемся с объектами – дом, автомобиль, мобильный телефон, деревья, дорога, еда, животные, книги – это всё объекты, которые имеют разные свойства. Значит, мы можем в своём приложении создать объекты с похожими свойствами. Объекты в программировании – это модели реальных объектов из жизни или модели вымышленных объектов, например, всё, что мы видим на экране мобильного телефона или монитора являются виртуальными объектами – кнопки, списки, текстовые поля и др.

Объекты можно добавлять друг к другу для получения сложных составных объектов. Для создания объектов можно использовать блок createobject, но проще их создавать из JSON-данных.

Массив

Массив относится к сложным типам данных, который позволяет хранить коллекции значений всех типов (примитивных типов, объектов, массивов и ссылок на компоненты).

Блоки для работы с массивами доступны на палитре в категории Lists.

Массивы можно вкладывать друг в друга для получения многомерных массивов (массив массивов), что можно использовать для создания таблиц.

Массивы также не засоряют глобальное пространство имён, но в текущей версии Thunkable X нет встроенного механизма поддержки ассоциативных массивов и коллекций записей вида "ключ:значение”, что несколько усложняет работу с ними.

Мы закончили рассмотрение основных типов данных, но вопросы остались. Почему речь шла о стоках и массивах, когда категории блоков называются Text и Lists? Всё очень просто - названия категорий выбраны такими, чтобы они были понятны пользователям, не знакомым с программированием..Для пользователя текст и список являются более понятными, по сравнению со строкой и массивом. Но, если говорить точнее, то текст - это представление информации строкового типа, а понятие "список" относится к абстрактному типу данных. В нашем курсе речь идёт о программировании, и о программировании на конкретном языке, в котором типами данных является не текст и список, а строка и массив. Также в целях упрощения в качестве индекса для первого элемента списка выбрано число 1, а не 0, как это принято для массивов.

Как текст и строка, так массив и список не являются идентичными понятиями хотя бы по той причине, что существуют разные массивы и разные списки. В рамках Thunkable X для простоты общения с пользователями вы можете считать текст и строку идентичными понятиями, как и список с массивом, но, если речь идёт о типах данных, то употребляйте правильные понятия - строка и массив.

Color

Из названия следует, что данный тип предназначен для хранения информации о цвете. Значение цвета можно задавать в текстовом или числовом виде. Текстовый формат допускает задавать цвет путём указания без учёта регистра символов значений компонент в шестнадцатеричном или десятичном формате, а также при помощи предопределённых констант (названий).

UUID (системный тип)

Данный тип является подмножеством строковог типа. Его множество множество значений определяется системой и доступно только для чтения из блоков компонентов. Значения этого типа используются в качестве ссылок на компоненты в блоках Any (не используйте их в других операциях). Для указания компонента можно испоьзовать его имя, но при использовании блоков create и clone нет возможности задать имя созданным компонентам. В этом случае как раз и используется UUID, который можно сохранить в переменной для последующего его получения.

Секреты Thunkable X  
© 2016-2022  Александр Страшко