Урок 8. Функции
E-code
Не пей чай над клавиатурой. E-code
Программирование на Kotlin, и в целом, держится на многих китах: переменные, арифметические операции, циклы и так далее. Одним из таких китов, без которого трудно, а то и невозможно, представить программирование, являются - функции. По сути, стандартная программа и состоит из поочерёдно выполняющихся функций. О них вы и узнаете в этой статье.
Что такое функция?
Функция - фрагмент кода, выполняющий определённую задачу и имеющий возможность использоваться повторно.
Чем-то похоже на определение цикла, тем не менее разница колоссальна. Для понимания println тоже функция. Она выводит информацию на экран (выполняет задачу), мы можем применить её повторно (как вариант, вставить в цикл или просто скопировать) Она находится в стандартной библиотеке Kotlin, её написали сами разработчики данного языка программирования. Гораздо проще всё осознать на примерах. Этим мы и продолжим.
Синтаксис функции
А прежде стоит рассмотреть из чего состоит функция. Для этого просто сделаем свою. Она состоит из заголовка и тела. В теле функции (внутри фигурных скобок) происходит основное действие. Стоит учитывать, что всё созданное внутри функции, используется только функцией. Например, обычная переменная, созданная внутри функции, не сможет использоваться вне её.

Первое написание (появление) функции называется объявление функции
В return (ключевое слово, отвечающее за возврат значений) мы поместили проверку, которая в итоге даст нам строку, то есть в итоге мы получим данные с типом String.

Кратко о заголовке. О модификаторах видимости мы расскажем в следующих статьях, пока достаточно знать, что в Kotlin по умолчанию даже без письменного указания ставится public (доступный для любой части программы), fun - ключевое слово, после которого мы обязаны написать имя нашей функции. В скобках указываются параметры и их типы (это входные данные), которые будут в дальнейшем использоваться в функции для решения задач. Перед фигурными скобками тип возвращаемого значения (тип данных на выходе), он указывает, что должна возвращать функция. Если нам не нужно возвращать значение, то мы не указываем тип, но об этом позже.
Отдельный абзац стоит посвятить имени функции. Оно должно отражать смысл и работу функции, при этом выглядеть лаконично. Правилом хорошего тона называть функцию по её назначению, как в следующем скриншоте.

Написать функцию мало. Чтобы она заработала её нужно вызвать. Мы помещаем её в println (чтобы вывести в консоль, иначе мы бы просто получили строку, но нигде её не увидели), далее пишем имя функции и входной параметр с соответствующим типом. Мы не можем вызвать эту функцию без параметра или с параметром другого типа, это вызовет ошибку в компиляторе.
Аргументы по умолчанию
Для того чтобы передать значение в функцию нам необязательно создавать переменную, можно было просто написать 100 в вызове функции, но автор (я) решил иначе.
Существует другая возможность для параметров функций. Мы можем указать значение в самом параметре.

Посмотрим на вызов, ему больше не нужно указывать параметр.

Функции с единственным выражением
Как следует из названия такие функции выполняют какое-то одно определённое выражение, при этом таким функциям необязательно указывать тип возвращаемого значения, фигурные скобки и оператор return.

Такой способ позволяет сократить объявление функций и занимаемое место, кроме того так код выглядит более красивым.
Функции с возвращаемым типом Unit
Никто не говорил, что функция обязательно возвращает значение. Она может, например, просто выводить информацию.

Unit - возвращаемый тип, который говорит нам: "Функция значения не возвращает". Println выводит строку, она не может ничего возвращать, поэтому мы и имеем тип Unit. Если ключевое слово return не используется, то считается, что функция возвращает значение с типом Unit.
Но постойте... Ведь в примере с функциями с единственным выражением нет слова return, а первая функция возвращает значение. Как так?

Здесь стоит помнить о контексте функции и что она делает. У нас функция с единственным выражением. Мы присваиваем значение условия if, а оно в любом случае является строкой. Здесь сработало неявное приведение типов. Но это не сработает с блочной функцией, там указание возвращаемого типа обязательно, если не предполагается Unit.

Именованные аргументы функций
Функция многогранная штука, и она может иметь много аргументов. Для удобства в Kotlin можно именовать аргументы функций.

Вывод:

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

Функцию называют перегруженной, если она имеет несколько реализаций.

У нас две реализации функции buyFood (с параметрами и без). Перегрузку функций предоставляет не только Kotlin. В зависимости от целей, задач разработки (и так далее) она может применяться. Нужно просто помнить и знать, что такая возможность есть.
Имена функций в обратных кавычках
Ещё одна возможность Kotlin. Она позволяет использовать в названии функций пробелы и другие нестандартные символы. Гляньте!

Лучше в своей программе не использовать обратные кавычки в названии. Но тогда зачем их вообще использовать? Первая причина (это ты), эта функция нужна, чтобы поддерживать совместимость с Java. Дело в том, что Java и Kotlin имеют разные зарезервированные ключевые слова - слова, которые нельзя применять для имён функций (например, fun). Обратные кавычки позволяют избежать этой несовместимости, если это необходимо. Вторая причина, более понятный и удобочитаемый текст, который применяется, например, в тестах для программ, нежели "верблюжий регистр".

Что дальше?
Далее мы рассмотрим анонимные функции и функциональные типы и их применение. Это очень важная часть Kotlin. Не пропустите!
Дорогой читатель, надеюсь моя статья оказалась полезной для тебя!
Ты всегда можешь следить за нашим творчеством на этом канале.
Спасибо за проявленный интерес!