Чистая функция - это функция, которая:
// Чистая функция
public static int Add(int a, int b)
{
return a + b;
}
// Нечистая функция (зависит от внешнего состояния)
private static int _counter = 0;
public static int Increment()
{
return ++_counter; // Побочный эффект - изменение внешней переменной
}
Предсказуемость: Результат зависит только от входных параметров
Отсутствие побочных эффектов:
Ссылочная прозрачность: Вызов функции можно заменить ее результатом без изменения поведения программы
[TestMethod]
public void Add_TwoNumbers_ReturnsSum()
{
// Arrange
int a = 2, b = 3;
// Act
int result = PureMath.Add(a, b);
// Assert
Assert.AreEqual(5, result);
}
Parallel.For(0, 100, i => {
var result = PureMath.Add(i, i*2); // Безопасно для параллельного выполнения
});
public static Func<T, TResult> Memoize<T, TResult>(Func<T, TResult> function)
{
var cache = new ConcurrentDictionary<T, TResult>();
return arg => cache.GetOrAdd(arg, function);
}
var memoizedAdd = Memoize<int, int>(PureMath.Add);
// Преобразование нечистой функции в чистую
public class ImpureExample
{
private DateTime _currentTime = DateTime.Now;
// Нечистая версия
public string GetGreetingBad()
{
return _currentTime.Hour < 12 ? "Good morning" : "Good afternoon";
}
// Чистая версия
public string GetGreetingGood(DateTime time)
{
return time.Hour < 12 ? "Good morning" : "Good afternoon";
}
}
чистые функции - это мощный инструмент для написания надежного, поддерживаемого и тестируемого кода. Их использование особенно ценно в сложных системах, где важны предсказуемость и отсутствие скрытых зависимостей. Хотя невозможно сделать всю программу состоящей только из чистых функций, их максимальное использование значительно повышает качество кода.