Именование аргументы
Когда мы вызываем функцию, которая имеет некоторые параметры, мы можем передавать аргументы по именам этих параметров. Такой подход может улучшить читаемость вашего кода, особенно если функция имеет множество параметров. Кроме того, это удобный способ изменить порядок аргументов, передаваемых при вызове функции.
Улучшение удобочитаемости кода
Представьте себе кассира, который продает билеты в кино, и цена билета остается неизменной в течение дня. Вам нужно рассчитать, сколько денег будет у нашего кассира в конце рабочего дня. Мы можем сделать это с помощью функции, которая имеет три параметра:
fun calcEndDayAmount(startAmount: Int, ticketPrice: Int, soldTickets: Int) =
startAmount + ticketPrice * soldTickets
startAmount
- это начальная сумма в кассе.ticketPrice
- это цена билета.soldTickets
- это количество билетов, проданных в этот день.
Это обычная функция, поэтому мы можем вызвать ее следующим образом:
val amount = calcEndDayAmount(1000, 10, 500) // 6000
Это сработало бы нормально, хотя есть одна проблема: неясные аргументы. Конечно, мы можем объявлять стандартные переменные и передавать их дальше, но иногда приходится работать с литералами, а не с переменными. Именованные аргументы могут сделать наш код более читабельным. Чтобы устранить эту проблему, вы можете присвоить имя каждому аргументу этой функции:
val amount = calcEndDayAmount(
startAmount = 1000,
ticketPrice = 10,
soldTickets = 500
) // 6000
Теперь код легко понять!
Изменение порядка аргументов
Вы можете изменить порядок аргументов в вызове функции с помощью именованных аргументов. Всё, что вам нужно сделать, это указать имена в любом нужном вам порядке:
val amount = calcEndDayAmount(
ticketPrice = 10,
soldTickets = 500,
startAmount = 1000
) // 6000
Именованные и позиционные аргументы
Вы также можете вызвать функцию с именованными и обычными (позиционными) аргументами, если именованные аргументы помещаются после позиционных:
calcEndDayAmount(1000, ticketPrice = 10, soldTickets = 500) // 6000
Ещё вы можете использовать позиционные аргументы после именованных аргументов, но вам необходимо поддерживать их порядок. Например:
calcEndDayAmount(ticketPrice = 10, 500, 1000) // Неправильный вызов!
calcEndDayAmount(startAmount = 1000, 10, 500) // OK
calcEndDayAmount(soldTickets = 500, ticketPrice = 10, startAmount = 500) // OK
calcEndDayAmount(soldTickets = 500, ticketPrice = 10, 500) // Неправильный вызов!
Аргументы по умолчанию и именованные аргументы
Вы также можете использовать именованные аргументы и аргументы по умолчанию вместе. Как вы, вероятно, знаете, аргументы по умолчанию иногда сбивают с толку, поскольку Kotlin может не понимать, какие параметры назначать.
Давайте изменим предыдущую функцию и сделаем первый параметр необязательным:
fun calcEndDayAmount(startAmount: Int = 0, ticketPrice: Int, soldTickets: Int) =
startAmount + ticketPrice * soldTickets
Предположим, мы хотели бы вызвать эту функцию только с двумя последними параметрами. Но это не сработает:
val amount = calcEndDayAmount(10, 500) // Не будет работать —
// нет значения для soldTickets
Здесь 10
присваивается первому необязательному аргументу startAmount
, а не второму параметру ticketPrice
.
Чтобы вызвать эту функцию, используйте именованные аргументы:
val amount = calcEndDayAmount(ticketPrice = 10, soldTickets = 500) // 5000
Теперь это работает!
Именованные аргументы и значения по умолчанию
Значения по умолчанию для параметров функции могут быть постоянными, а могут и не быть. Они также могут быть другим именованным аргументом или функцией.
Например:
fun sum2(a: Int, b: Int = a) = a + b
sum2(1) // 1 + 1
sum2(2, 3) // 2 + 3
Это не сработает, так как параметр b
не инициализирован:
fun sum2(a: Int = b, b: Int) = a + b
Заключение
Подводя итог всему вышесказанному, разумно используйте именованные аргументы, чтобы улучшить читаемость кода и изменить порядок аргументов, когда некоторые параметры имеют значения по умолчанию.
Last updated