Чисті функції
Детермінована функція — функція яка для одного й того ж набору вхідних значень завжди повертає однаковий результат.
Приклад детермінованої функції:
def sum(a, b):
return a + b
Скільки б раз ми не викликали функцію sum
з аргументами 3 і 6 — завжди отримаємо 9.
І приклад недетермінованої функції:
from random import randint
def roll_dice():
return randint(1, 6)
Чиста Функція (pure function) — детермінована функція яка не має ніяких побічних ефектів.
Функція не має побічних ефекті, якщо:
- не використовує ввід-вивід (файлову систему, стандартні потоки, мережа)
- не використовує глобальні змінні
- не міняє передані їй аргументи
- не міняє хід виконання програми
- не використовує нечисті функції
Переваги чистих функцій:
- надійніші, оскільки не залежать «від погоди» і стану оточення, тільки від аргументів
- легше читати і розуміти
- легше тестувати
- легше пітримувати
- не залежать від порядку виклику
- можна виконувати паралельно
- можна кешувати результат
Приклад функції з побічним ефектом:
def sort_by_sort(some_list):
some_list.sort()
print(some_list)
У вищенаведеної функції два побічних ефекти:
- міняє значення аргумента
- присутній вивід
А ось функція без побічних ефектів:
def sort_by_sorted(some_list):
return sorted(some_list)
Намагайтесь робити функції чистими!
Коли розробник читає чужий код, він у більшості випадків сприймає усі функції як чисті. Якщо ж ви створюєте нечисту функцію, обов'язково вкажіть на це! Наприклад у документації до функції. Навіть ім'я функції має вказувати що вона нечиста. Приклади імен нечистих функцій:
- print_list
- write_data
- save_config
- store_to_database
- fetch_response