TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2555 2.51K
День 2112. #ЗаметкиНаПолях
Функциональное Программирование в C#. Начало

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

В последнее время в C# добавили множество функций из функционального программирования:
- Записи для неизменяемости,
- LINQ для функциональных преобразований,
- Лямбда-выражения для функций первого класса.
Эти функции — не просто синтаксический сахар — они помогают предотвращать ошибки и упрощают понимание кода.

В этой серии рассмотрим практические паттерны, которые можно использовать в проектах на C#.

1. Функции высшего порядка
Функции высшего порядка могут принимать другие функции в качестве параметров или возвращать их в качестве результатов. Они позволяют писать более гибкий и компонуемый код, поскольку вы можете передавать поведение как данные. Типичные примеры — Where и Select из LINQ, которые принимают функции для преобразования данных. Рассмотрим пример валидации:
public class OrderValidator
{
public bool ValidateOrder(Order order)
{
if (order.Items.Count == 0) return false;
if (order.TotalAmount <= 0) return false;
if (order.ShippingAddress == null) return false;
return true;
}
}


Что, если нам нужны:
- разные правила проверки для разных стран.
- повторное использование некоторых проверок,
- по-разному комбинировать проверки.
Вот как функции высшего порядка делают это более гибким:
public static class OrderValidation
{
public static Func<Order, bool>
Create(string country,
decimal minOrder)
{
var baseValidations = CombineValidations(
o => o.Items.Count > 0,
o => o.TotalAmount >= minOrder,
o => o.ShippingAddress != null
);

return country switch
{
"US" => CombineValidations(
baseValidations,
o => IsValidUSAddress(o.ShipAddress)),
"EU" => CombineValidations(
baseValidations,
o => IsValidVATNumber(o.VatNumber)),
_ => baseValidations
};
}

private static Func<Order, bool>
CombineValidations(
params Func<Order, bool>[] validations) =>
order => validations.All(v => v(order));
}

// Использование
var usValidator =
OrderValidation.Create("US", 25.0m);
var euValidator =
OrderValidation.Create("EU", 30.0m);


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

Продолжение следует…

Источник:
https://www.milanjovanovic.tech/blog/functional-programming-in-csharp-the-practical-parts
  • 👍 23
More from @netdeveloperdiary
  1. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  2. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  3. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  4. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 3, 2026Post #3360
  6. Oct 3, 2026День 2803. #Оффтоп Чем Заняться, Пока Работают Агенты? У VS Code Есть Ответ Сейчас большую…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →