DroidScript
DroidScript
инструменты для мобильной разработки

Функции

Базовый курс программирования на Thunkable X  
16.10.2019

На этом занятии рассматриваются блоки для создания и работы с функциями.

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

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

К сожалению, в Thunkable X нет возможности создавать общедоступные функции, которые можно копировать из одного проекта в другой, что сильно тормозит развитие этой платформы, но мы можем копировать функции между экранами одного проекта.

Другая проблема – отсутствие в Thunkable X локальных переменных, область видимости и действия которых была бы ограничена в пределах функции. Блоки параметров функции, о чём мы говорили на первом уроке, являются глобальными блоками. Точнее говоря, их область действия выходит за пределы функции в которой они определены.

Функции могут быть без параметров или с параметрами. Параметры используются для передачи данных в функцию. Выполнение функции, как и цикла, можно прервать. Для этого служит блок return.

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

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

Выбор имени функций

Функции выполняют какие-то действия, и в качестве имени рекомендуется использовать глаголы. Вначале имени функции часто задают префикс, уточняющий её действие:

  • set – что-то записывает,
  • get – что-то возвращает,
  • Create – что-то создаёт (имена функции-конструктора принято писать с большой буквы)
  • is – что-то проверяет и т.д.

Если вы посмотрите на блоки компонентов, то в них как раз и используется это: setText – записывает текст, get Color – возвращает цвет, call TakePhoto – вызывает метод для получения фотографии.
Имена функций принято начинать с маленькой буквы, так как с большой буквы принято начинать имена классов и/или конструкторов (функций, которые создают объекты).

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

Имена функций в пределах экрана должны быть уникальными. Создать две функции с одинаковым именем не получится.

Полифункции

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

В примере ниже функция предназначена для выполнения трёх методов - set, get и createList.

Полифункция функция

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

В Thunkable X нет локальных переменных и создать при помощи полифункции что-то похожее на класс не получится.

Рекурсивные функции

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

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

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

Рекурсия является относительно сложной темой, но мы рассмотрим простой пример вычисления суммы чисел от 1 до 5.

Рекурсивная функция

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

Также поступим и мы: вместо порядка сложения 1+2+3+4+5 будем использовать 5+4+3+2+1.

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

В нашем случае в качестве условия выхода из рекурсии используется блок “if _value = 1 return 1”. Для  сложения чисел и рекурсивного вызова функции используется блок ”_value + req(_value-1)”.

Общий механизм работы рекурсии выглядит таким образом: сначала все вызовы функций помещаются в стек (как бы закручивается пружина). После срабатывания блока “if _value = 1 return 1” происходит вызов функций из стека с возврато из значений (пружина раскручивается).

Доленжны ли функции возвращать результат? Нет. Если рекурсия используеся для создания компонентов в нужном порядке, то функция может и не возвращать значение. Но условие возврата из рекурсии должно существовать, например, выйти из неё при создании более 10 компонентов.

Базовый курс программирования на Thunkable X  
© 2016-2018 Александр Страшко