Вы узнали в Уроке 5, что функция — это повторно используемый код, содержащий инструкции для выполнения действия или для получения выходных данных на основе входных данных.
Чтобы определить функцию, нужно указать три ключевые части: уникальный идентификатор, тип информации, ожидаемой в качестве результата, и что функция будет делать при её вызове.
Как определить функцию
Сигнатуры функций
В Уроке 3 мы рассмотрели, как объявить переменную или константу, присвоив ей имя и указав используемый тип значения.
Аналогичным образом работает сигнатура функции. В сигнатуре функции используются уникальный идентификатор функции, параметры, описывающие необходимые входные данные, и, наконец, тип возвращаемого значения для результата или выходных данных.
То, что на самом деле делает функция, определяется в блоке кода.
Блок кода
Блок кода — это группа выражений, которая следует за сигнатурой функции. Вот синтаксис функции и её блока кода:
name() : type =
codeblock
Существует несколько способов форматирования блока кода. Один из них — писать строки кода с отступом после идентификатора. Так оформлен синтаксис функции в примере выше. (Позже вы узнаете больше о том, как оформлять блоки кода, но пока можно использовать и этот подход.)
Выражения в блоке кода определяют, что на самом деле будет делать эта функция при вызове.
Эти выражения будут выполняться только при вызове данной функции. Когда программа достигнет конца данного блока кода, эти выражения будут выполнены — по крайней мере, до следующего вызова этой функции, — и программа выполнит очередную часть кода, следующую за этим вызовом функции.
Тело
Блок кода, определяющий, что делает функция, также называется телом.
Область видимости
На данный момент вы узнали следующее:
- Функция имеет уникальный идентификатор, который используется для её активации с целью выполнения каких-либо действий в программе.
- То, что делает функция, основано на выражениях в теле функции.
- После выполнения последней строки кода в теле вызов функции завершается, и программа переходит к строке кода программы, следующей за вызовом функции.
Инструкции в этой функции и любые значения, выдаваемые функцией, определяют область видимости функции.
Теперь давайте вернёмся к выражениям, которые можно использовать для определения функции. Вы можете создавать константы и переменные (вспомните Урок 3) и добавлять их в тело функции.
Когда вы помещаете переменную в тело, она становится локальной по отношению к области видимости функции. Локальный в этом смысле означает, что данный код существует и работает только в этом теле и только при вызове функции.
Так что же такое область видимости? Это ассоциация имени функции со значением, выдаваемым функцией. Это значение можно использовать только в блоке кода, в котором оно создано, или в пределах данной области видимости.
Создание экземпляра
Экземпляр — это уникальный случай применения определённой функции, когда она вызывается и выполняется. Именно получение такого экземпляра называется созданием экземпляра. В английском языке термин «экземпляр» называется instance. Он созвучен слову instant, то есть чему-то существующему в течение очень короткого промежутка времени.
И здесь самое время рассмотреть концепцию времени жизни.
Время жизни
Экземпляр имеет время жизни — начало, середину и конец.
Это означает, что время жизни того, что находится в теле функции, ограничено областью видимости тела и получить доступ к локальным переменным (ограниченным текущей областью видимости) можно только в пределах области видимости.
Условные выражения
В следующем примере показано, как рассчитать максимальное количество мышеловок, которые игрок может купить на имеющиеся у него монеты.
Константа MousetrapsYouCanBuy создается в блоке if, и её область видимости ограничена блоком if.
Когда константа MaxMousetrapsYouCanBuy используется вне блока кода if, возникает ошибка, поскольку имя MaxMousetrapsYouCanBuy не существует вне области видимости. Вы увидите сообщение об ошибке Unknown Identifier (неизвестный идентификатор) Это означает, что константа MaxMousetrapsYouCanBuy действует только в пределах этой области видимости.
Когда выражение завершается, локальные константы и локальные переменные, созданные в теле, больше не существуют. Их время жизни закончилось.
Области видимости можно представить как небольшой фрагмент кода, в котором всё работает до тех пор, пока не будет завершено.
Синтаксис функции
Давайте вернёмся к синтаксису функции, но на этот раз рассмотрим его немного глубже.
name() : type =
codeblock
name() : type = |
Это сигнатура функции. Она представляет собой Сигнатура функции включает тип используемых входных данных. Значение, которое возвращает функция (то, что следует после |
codeblock |
В блок кода функции или тело добавляются константы, переменные или другие выражения, описывающие, что функция делает при вызове. |
Например, функция оплаты за мышеловку может выглядеть так:
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
set Coins = Coins - CoinsPerMousetrap
Print("Мышеловка куплена! У вас осталось {Coins} монет.")
Соглашения и правила именования для имён функций такие же, как для переменных и констант. Поскольку функции выполняют последовательность действий, рекомендуется называть их так, чтобы они отражали выполняемые действия, например BuyMousetrap().
Void
В сигнатуре функции BuyMousetrap() указано ключевое слово void. Тип void для функции означает, что при вызове функция ничего не возвращает. Больше о 'void' и о том, как его использовать, вы узнаете в следующем уроке.
Не повторяйтесь
В программировании есть важный принцип Don't Repeat Yourself («Не повторяйтесь»).
Это означает, что если вы повторяете строку кода три раза или более, следует подумать о том, чтобы написать код по-другому. И да, для этого есть причина!
Чем больше в коде строк, тем сложнее его поддерживать и тем выше вероятность возникновения ошибок, когда вы поменяете код в одном месте, но не поменяете в другом.
Функции, как и константы, позволяют не повторять код, когда в этом нет необходимости, поэтому они не только избавляют вас от дублирования кода, но и сокращают время на поддержку и снижают вероятность ошибок в коде.
Обращайте внимание на использование заглавных букв при написании кода, как при именовании выражений и функций, так и при использовании ключевых слов и встроенных функций. Язык Verse чувствителен к регистру, и пренебрежение правильным и последовательным использованием заглавных букв может привести к ошибкам при выполнении программы или компиляции.
Выводы
- Функция — это повторно используемый код, содержащий инструкции для выполнения действия или получения выходных данных на основе входных данных.
- Функции состоят из трёх частей: идентификатора, типа и блока кода, который определяет результат функции при её вызове.
- Функции вызываются с помощью сигнатур.
- Блок кода, определяющий, что делает функция, также называется телом.
- Область видимости относится к значению, связанному с функцией, которая, в свою очередь, определяется содержимым блока кода.
- Код, содержащийся в блоке кода, является локальным для его области видимости.
- Время жизни — это период существования области видимости.
- Не повторяйтесь.