Elementor Header #8

39. Детерминированность

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

Примеры детерминированных и недетерминированных функций

Детерминированная функция

Функция, результат которой зависит только от её аргументов и не зависит от внешних факторов.

				
					function add(a, b) {
  return a + b;
}

console.log(add(2, 3)); // Всегда возвращает 5

				
			

Недетерминированная функция

Функция, результат которой может зависеть от внешних факторов или состояния.

				
					function getRandomNumber() {
  return Math.random();
}

console.log(getRandomNumber()); // Результат может быть разным при каждом вызове

				
			

Важность детерминированных функций

Детерминированные функции обладают следующими преимуществами:

  • Предсказуемость: Поведение функции всегда можно предсказать, зная входные данные.
  • Тестируемость: Легко писать тесты, поскольку ожидаемый результат известен.
  • Отладка: Проще искать и исправлять ошибки, так как результат функции не зависит от внешних факторов.

Примеры детерминированных функций

Сложение чисел

				
					function multiply(a, b) {
  return a * b;
}

console.log(multiply(4, 5)); // Всегда возвращает 20

				
			

Конкатенация строк

				
					function concatenate(str1, str2) {
  return str1 + str2;
}

console.log(concatenate("Hello, ", "World!")); // Всегда возвращает "Hello, World!"

				
			

Примеры недетерминированных функций

Функции, зависящие от времени

				
					function getCurrentTime() {
  return new Date().toLocaleTimeString();
}

console.log(getCurrentTime()); // Возвращает текущее время, которое постоянно меняется

				
			

Функции с побочными эффектами

				
					let counter = 0;

function incrementCounter() {
  return ++counter;
}

console.log(incrementCounter()); // Результат зависит от внешнего состояния (counter)
console.log(incrementCounter()); // Результат изменится при каждом вызове

				
			

Как сделать функции детерминированными

Избегайте побочных эффектов: Функции не должны изменять внешнее состояние или зависимости.

				
					function pureAdd(a, b) {
  return a + b;
}

				
			

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

				
					function pureMultiply(a, b) {
  return a * b;
}

				
			

Передавайте все необходимые данные через параметры: Это обеспечивает независимость функции от внешнего состояния.

				
					function pureConcat(str1, str2) {
  return str1 + str2;
}

				
			

Распространенные ошибки

Использование глобальных переменных

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

				
					let globalValue = 10;

function addGlobalValue(a) {
  return a + globalValue;
}

				
			

Функции с побочными эффектами

Изменение состояния вне функции делает её поведение непредсказуемым.

				
					let counter = 0;

function increment() {
  counter += 1;
  return counter;
}

				
			

Зависимость от внешних ресурсов

Внешние ресурсы, такие как системное время, делают функцию недетерминированной.

				
					function getCurrentDate() {
  return new Date();
}

				
			

Заключение

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

Тестовое задание

  1. Напишите детерминированную функцию square, которая принимает одно число и возвращает его квадрат.

  2. Напишите недетерминированную функцию getRandomItem, которая принимает массив и возвращает случайный элемент из этого массива.

Пример решения:

				
					// Задание 1
function square(num) {
  return num * num;
}

console.log(square(4)); // 16
console.log(square(5)); // 25

// Задание 2
function getRandomItem(arr) {
  const randomIndex = Math.floor(Math.random() * arr.length);
  return arr[randomIndex];
}

console.log(getRandomItem([1, 2, 3, 4, 5])); // Случайный элемент массива

				
			

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

logo