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. Код функції та виклик функції

Рисунок 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

 


Споріднені теми