Kotlin. Функции. Ключевое слово fun. Рефакторинг функции

Функции. Ключевое слово fun. Рефакторинг функции. Оператор return


Содержание


Поиск на других ресурсах:

1. Понятие функции. Синтаксис объявления функции в Kotlin. Ключевое слово fun. Оператор return

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

Часто в программе возникает повторяемость некоторого кода более одного раза. Такой код целесообразно оформлять в виде функций.

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

Для функции характерны следующие свойства:

  • функция может получать данные в виде параметров;
  • функция может возвращать результат некоторого вычисления.

Объявление функции, которая возвращает значение, начинается с ключевого слова fun и имеет следующую общую форму:

access_modifier fun FuncName(parameters) : Type {
  ...
}

здесь

  • FuncName – имя функции. По этому имени можно вызывать функцию;
  • access_modifier – один из модификаторов доступа private, public, internal, public;
  • parameters – перечень параметров, которые получает функция. Параметры – это типы входных данных и названия переменных, которые им соответствуют. Функция может получать от нуля до нескольких параметров. Если функция не получает параметров, то эти параметры опускаются. Параметры функции всегда доступны только для чтения как в случае с модификатором val. Это значит, что попытка изменить значение параметра в теле функции вызовет ошибку компиляции;
  • Type – тип значения, возвращаемого функцией.

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

Если предполагается, что функция не возвращает значения, то общая форма объявления такой функции следующая:

access_modifier fun FuncName(parameters) {
  ...
}

Если функция не получает параметров и не возвращает значения, то общая форма объявления такой функции выглядит еще более упрощенной:

access_modifier fun FuncName() {
  ...
}

Также допускается объявлять функцию с использованием следующей общей формы

access_modifier fun FuncName(parameters) = expression

здесь

  • expression — выражение, возвращающее одно значение. Таким выражением может быть, например, оператор if-else или оператор when. Важно понимать, что expression обязательно должен возвращать одно значение, следовательно, наличие составляющей else в этом выражении обязательно.

Если функция возвращает значение и реализована с использованием тела функции (фигурные скобки {}), то код тела должен завершаться оператором return, который имеет следующую общую форму

return value

здесь

  • value – значение, возвращаемое из функции. Это значение есть результатом возврата из функции.

 

2. Вызов функции

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

FuncName(arguments)

здесь

  • FuncName – имя объявляемой функции;
  • arguments – аргументы, передаваемые в функцию. Аргументы должны соответствовать по количеству и совместимости типов параметров, которые указываются при объявлении функции (смотрите примеры ниже).

 

3. Объявление функции с помощью рефакторинга. Последовательность шагов

Если есть фрагмент кода, который нужно оформить как функцию, система Intellij IDEA имеет специальный инструмент рефакторинга.

Для создания функции средствами IntelliJ IDEA, в редакторе кода нужно выполнить следующие шаги.

  1. С помощью мышки или клавиатуры выделить фрагмент, который нужно оформить как функцию.
  2. В области выделенного фрагмента кликнуть правой кнопкой мышки. В результате откроется контекстное меню с перечнем доступных команд (рисунок 1).

Kotlin. IntelliJ IDEA. Перечень команд в контекстном меню редактора

Рисунок 1. Перечень команд в контекстном меню редактора

  1. В контестном меню выбрать последовательность команд Refactor -> Extract -> Function… (рисунок 2) или нажать комбинацию клавиш Ctrl+Alt+M. Как следствие, откроется диалоговое окно «Extract Function» уточнения имени и параметров функции.

 

Kotlin. IntelliJ IDEA. Команда Function...

Рисунок 2. Команда Function…

  1. В окне «Extract Function» нужно указать имя функции, перечень параметров функции и видимость функции из других частей программы (Visibility). В нашем случае, сформированное окно выглядит, как показано на рисунке 3. Пока что поле Visibility не имеет существенного значения и оно оставлено без изменений (private). Поле Name: установлено в значение Max2 и является именем создаваемой функции. Параметры функции выбраны a, b.

 

Kotlin. IntelliJ IDEA. Диалоговое окно "Extract Function"

Рисунок 3. Диалоговое окно «Extract Function»

После задания необходимых параметров в окне и выбора кнопки OK система сгенерирует программный код функции и вызов этой функции как показано на рисунке 4.

Kotlin. IntelliJ IDEA. Код функции Max2() и вызов этой функции

Рисунок 4. Код функции Max2() и вызов этой функции, сформированные в IntelliJ IDEA

 

4. Примеры функций
4.1. Функция, которая не возвращает значение и не получает параметров

Задача. Разработать функцию Hello(), которая выводит знаменитое сообщение «Hello world!».

Решение. Поскольку задачей такой функции является вывод заранее известной информации («Hello world!»), то функция не требует входящих параметров. Также, функция не проводит вычисления, результат которых нужно вернуть. Следовательно, функция не возвращает значения. А потому, исходный текст функции Hello() с вызовом ее из функции main() следующий

// Функція Hello()
fun Hello() {
  println("Hello world!")
}

fun main(args:Array<String>)
{
  // Виклик функції Hello()
  Hello()
}

После запуска, программа выдает следующий результат

Hello world!

 

4.2. Функция, которая получает параметры и возвращает значение
4.2.1. Вычисление характеристик фигуры по номеру

Задача. Разработать функцию Calc(), которая получает два параметра:

  • номер фигуры (1 — окружность, 2 — круг, 3 — шар);
  • радиус.

В зависимости от номера фигуры (1, 2, 3) функция должна вычислять одну из характеристик фигуры:

  • длину окружности;
  • площадь круга;
  • объем шара.

Если задать некорректные данные, то функция должна вернуть 1.

Решение. Программа на языке Kotlin имеет следующий вид:

// Функция Calc()
fun Calc(numFig : Int, radius : Double) =
  when (numFig) {
    1 -> 2 * Math.PI * radius
    2 -> Math.PI * radius * radius
    3 -> Math.PI * Math.pow(radius, 3.0)
    else -> -1
  }

fun main(args:Array<String>)
{
  // Демонстрация использования функции Calc()
  val radius : Double
  val number : Int

  print("Figure number (1..3) = ")
  number = readLine().toString().toInt()

  print("radius = ")
  radius = readLine().toString().toDouble()

  // Вызов функции и вывод результата
  val res = Calc(number, radius)
  print("res = " + res)
}

В вышеприведенном коде функция Calc() не имеет типа возвращаемого результата. Потому что тип результата определяется в операторе when. Если указать корректные значения номера фигуры (от 1 до 3), то тип результата будет Double. Если задать некорректное значение, то тип результата будет Int.

Сама же функция Calc() реализована без фигурных скобок с использованием оператора присваивания (=).

Тестовый пример

Figure number (1..3) = 2
radius = 5.0
res = 78.53981633974483

 

4.2.2. Реверсирование строки

Задача. Разработать функцию ReverseString(), которая реверсирует строку. Функция возвращает строку, обратную исходной. Продемонстрировать работу функции ReverseString() в функции main().

Решение.

// Функция ReverseString()
fun ReverseString(s : String) : String {
  var s2 : String = ""
  for (c : Char in s)
    s2 = c + s2
  return s2
}

fun main(args:Array<String>)
{
  // Демонстрация использования функции ReverseString()

  // Некоторая строка
  val s = "abcde"

  // Вызов функции
  println(ReverseString(s)) // edcba
}

Результат выполнения программы

edcba

 

4.2.3. Определение количества вхождений заданного символа в строке

Задача. Разработать функцию, которая получает два параметра:

  • исходную строку;
  • символ.

Функция должна возвращать количество вхождений указанного символа в строке.

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

// Функция CountCharToString()
fun CountCharToString(c : Char, s : String) : Int {
  var count = 0

  // Вычислить количество вхождений указанного символа в строке
  for (cc : Char in s)
    if (cc == c)
      count = count + 1

  // Вернуть результат из функции
  return count
}

fun main(args:Array<String>)
{
  // Демонстрация использования функции CountCharToString()
  // Некоторая строка
  val str = "abcdef asdkjaldlk skdsjkl"

  // Вызов функции CountCharToString(),
  // Вычислить количество вхождений символа 's'
  val n = CountCharToString('s', str)
  println("n = " + n)
}

Результат выполнения программы

n = 3

 

5. Можно ли изменить значение параметра в теле функции?

Нельзя. Спроба изменения значения параметра в теле функции вызовет ошибку компиляции, поскольку все параметры передаются в функцию с неявно заданным модификатором val.

Пример.

При попытке изменить значение параметра t в теле функции ChangeParameter()

// Осуществляется попытка изменить параметр t
fun ChangeParameter(t:Int)
{
   t = 33; // здесь ошибка "Val cannot be reassigned"
}

компилятор выдает ошибку

Val cannot be reassigned

 


Связанные темы