Elementor Header #8

36. Побочные эффекты

1. Введение

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

Примеры побочных эффектов:

  • Изменение глобальных переменных
  • Запись или чтение файлов
  • Изменение переданных в метод объектов
  • Вывод данных в консоль
  • Взаимодействие с базой данных
 
				
					// Функция с побочным эффектом
int counter = 0;

void IncrementCounter()
{
    counter++; // Изменение глобальной переменной
}

				
			

2. Побочные эффекты в функциях

Функции можно разделить на:

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

Пример чистой функции:

				
					int Sum(int a, int b)
{
    return a + b; // Не изменяет внешнее состояние
}

				
			
Пример функции с побочным эффектом:
				
					void PrintMessage(string message)
{
    Console.WriteLine(message); // Вывод в консоль – побочный эффект
}

				
			

3. Опасности побочных эффектов

Побочные эффекты могут вызывать:

  • Неожиданное изменение данных – изменение глобальных переменных делает код сложнее для отладки.
  • Затруднение тестирования – функции с побочными эффектами сложнее проверять из-за изменяющегося состояния.
  • Неопределённое поведение – многопоточные программы могут работать нестабильно.

Пример проблемы с глобальной переменной:

				
					int count = 0;

void Increment()
{
    count++;
}

Increment();
Console.WriteLine(count); // Значение меняется извне

				
			

4. Как избежать побочных эффектов?

  • Используйте чистые функции, которые не изменяют внешнее состояние.
  • Избегайте глобальных переменных – передавайте данные через аргументы.
  • Используйте неизменяемые структуры данных.
  • Если побочный эффект необходим, явно указывайте его в названии функции (например, WriteToFile()).

Пример безопасного кода без побочных эффектов:

				
					int Increment(int number)
{
    return number + 1; // Чистая функция, не изменяет внешние переменные
}

				
			

Заключение

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

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

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

Пример возможного решения:

				
					// Чистая функция
int DoubleNumber(int x)
{
    return x * 2;
}

// Функция с побочным эффектом
void AddToList(List<int> numbers, int value)
{
    numbers.Add(value);
    Console.WriteLine("Размер списка: " + numbers.Count);
}

				
			

Попробуйте написать и запустить этот код, чтобы убедиться в правильности выполнения операций и особенностях работы с числами с плавающей точкой.

logo