Побочные эффекты (Side Effects).

Это перевод статьи-эпизода “Side Effects”, размещенной на сайте pointfree.co.
Код для этого фрагмента можно найти здесь.

“Побочные эффекты” – это то, без чего не можем жить; не можем писать программы. Давайте исследуем некоторого рода “побочные эффекты”, с которыми мы сталкиваемся каждый день. Давайте выясним, почему они делают код трудным для тестирования, и как мы можем управлять ими, не теряя при этом возможности “композиции” (composition).

Введение

У нас был целый эпизод, посвященный исключительно функциям, в котором мы сделали акцент на важности ТИПОВ входов и выходов функций для того, чтобы понять, как можно применить к ним “композицию” (compose). Но есть множество других вещей, которые могут делать функции и которые нельзя “поймать” исключительно их сигнатурой. Эти вещи называются “побочные эффекты” (“side effects“).

“Побочные эффекты” – это один из главных источников сложности кода и хуже того, источник усложнения тестирования. Они также не способствуют “композиции” функций. Из прошлого эпизода мы видели, что можно извлечь множество преимуществ из “композиции” функций, но “побочные эффекты” “вставляют нам палку в колеса” в этом.
В данном эпизоде мы рассмотрим некоторые типы “побочных эффектов”, покажем, почему так трудно их тестировать, почему они мешают “композиции” и попытаемся эффективно разрешить эти проблемы.

Continue reading

Функции.

Это перевод статьи- эпизода “Functions”, размещенной на сайте pointfree.co.
Код для этого фрагмента можно найти здесь.

Давайте определим инкрементную функцию incr, которая берет целое число Int, добавляет к нему единицу и возвращает результат как целое число Int:

func incr (_ x:Int) -> Int {
return x + 1
}

При вызове мы передаем этой функции значение.

incr(3) // 4

Давайте определим функцию square, которая возводит в квадрат целое число Int:

func square(_ x:Int) -> Int {
return x * x
}

Мы можем вызвать эту функцию тем же самым способом:

square(3) // 9

Мы можем даже сделать вложенный вызов этих функций для того, чтобы сначала рассчитать приращение, а затем квадрат целого значения Int:

square(incr(3)) // 16

Это очень просто, но это не характерно для Swift. Самый высокий уровень, свободные функции (free functions), не используются для такого рода функций, в этом случае отдается предпочтение методам.

Continue reading