Найти в Дзене
Android Head First

Kotlin. Функции области видимости.

В языке Kotlin мне очень нравится использовать функции области видимости. Сейчас расскажу почему. Функции области видимости в Kotlin имеют различные цели и помогают улучшить читаемость, выразительность и безопасность кода. Вот основные причины, из за чего мне нравится их использовать:
1. Упрощение работы с nullable-объектами: Функции `let`, `run` и `also` позволяют выполнять блок кода только в том случае, если объект не является null. Это помогает избежать NullPointerException и позволяет безопасно манипулировать nullable-объектами.
2. Улучшение читаемости кода: Функции `let`, `run`, `with`, `apply` и `also` позволяют создавать логические блоки кода, которые легко читать и понимать. Они позволяют сосредоточиться на манипуляции с определенным объектом или настройке его свойств.
3. Избежание повторного обращения к объекту: Функции `let`, `run`, `with` и `apply` позволяют обращаться к свойствам и методам объекта без необходимости повторного указания имени объекта. Это делает код более

В языке Kotlin мне очень нравится использовать функции области видимости. Сейчас расскажу почему.

Функции области видимости в Kotlin имеют различные цели и помогают улучшить читаемость, выразительность и безопасность кода. Вот основные причины, из за чего мне нравится их использовать:

1. Упрощение работы с nullable-объектами: Функции `let`, `run` и `also` позволяют выполнять блок кода только в том случае, если объект не является null. Это помогает избежать NullPointerException и позволяет безопасно манипулировать nullable-объектами.

2. Улучшение читаемости кода: Функции `let`, `run`, `with`, `apply` и `also` позволяют создавать логические блоки кода, которые легко читать и понимать. Они позволяют сосредоточиться на манипуляции с определенным объектом или настройке его свойств.

3. Избежание повторного обращения к объекту: Функции `let`, `run`, `with` и `apply` позволяют обращаться к свойствам и методам объекта без необходимости повторного указания имени объекта. Это делает код более компактным и уменьшает количество дублирования.

4. Создание ограниченной области видимости: Функции `let`, `run`, `with`, `apply` и `also` позволяют создавать ограниченную область видимости, в которой можно работать с локальными переменными или свойствами объекта. Это помогает изолировать логику и предотвратить утечку данных.

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

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

Теперь рассмотрим конкретно каждую функцию.

Функции области видимости:

1. let
```kotlin
val nullableString: String? = "Hello"

nullableString?.let { str ->
println(str)
// делать что-то с str
}
```
Функция `let` выполняет блок кода, только если объект не является null. В этом примере, если `nullableString` не равно null, блок кода внутри `let` будет выполнен, и `str` будет содержать значение `nullableString`.

Так же 'let' мы используем, когда нам нужно произвести какое то действие с объектом, который вызывает эту функцию и при этом нужно что бы вернулся результат лямбды.


2. run
```kotlin
val result = "Hello, Kotlin!".run {
println(this)
this.length
}
```
Функция `run` вызывается над объектом и выполняет блок кода. Внутри блока можно обращаться к объекту через `this`. Результат блока кода становится результатом вызова `run`. В этом примере `result` будет содержать длину строки `"Hello, Kotlin!"`.

'run' очень удобно использовать в связке с 'let' когда проверяется переменная на null.

```kotlin
val nullableString: String? = null

val result = nullableString?.let {
// код, выполняющийся при null
"Processed: $it"
} ?: run {
// код, выполняющийся при ненулевом значении
"Default Value"
}

println(result)
```
В этом примере мы используем оператор Элвиса `?:` для выбора между блоками кода в `let` и `run`. Если `nullableString` равно null, будет выполнен блок кода внутри `run` и результат будет использован в `result`. Если `nullableString` не равно null, будет выполнен блок кода внутри `let` и его результат будет использован в `result`.
3. with
```kotlin
val person = Person("Alice", 25)

with(person) {
println(name)
println(age)
// делать что-то с объектом person
}
```
Функция `with` позволяет обращаться к свойствам и методам объекта без явного указания имени объекта. В этом примере блок кода внутри `with` может непосредственно использовать свойства объекта `person`.

4. apply
```kotlin
val settings = Settings().apply {
timeout = 5000
isEnabled = true
}
```
Функция `apply` позволяет устанавливать значения свойств объекта и возвращает сам объект. Удобно когда нужно что то сделать с объектом перед тем как его куда то передать. В примере `apply` используется для настройки свойств объекта `settings`.

5. also
```kotlin
val numbers = mutableListOf(1, 2, 3)

val doubledSum = numbers.also {
println("Original numbers: $it")
}.map { it * 2 }
.sum()

println("Doubled sum: $doubledSum")
```

В примере мы используем 'also' для вывода оригинального списка чисел. Затем мы выполняем операцию умножения на 2 для каждого элемента списка, используя 'map', и вычисляем сумму чисел с помощью 'sum'. Результат суммы выводится на консоль.


Функция `also` полезна, когда нужно произвести побочное действие с объектом и вернуть его без изменений. Удобно выводить логи о состояни объекта перед тем как в него внесут изменения.

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

-2

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

Выполнение лямбды для non-null объектов: let

Представление переменной в виде выражения со своей локальной областью видимости: let

Настройка объекта: apply

Настройка объекта и вычисление результата: run

Выполнение операций, для которых требуется выражение: run без расширения

Применение дополнительных значений: also

Группировка всех функций, вызываемых для объекта: with

Некоторые функции области видимости являются взаимозаменяемыми, поэтому вы можете выбирать функции исходя из соглашений, принятых в вашем проекте или команде.

Несмотря на то, что функции области видимости предназначены для того, чтобы сделать код более кратким, избегайте их чрезмерного использования: это может снизить читабельность кода и привести к ошибкам. Избегайте вложенности функций и будьте осторожны при их объединении: можно легко запутаться в текущем значении контекстного объекта и в значениях this или it.