Какие ещё практики, кроме ООП, использовали (AOP, FP и т. д.)?csharp-111

Современный C# — это мультипарадигменный язык, который поддерживает различные подходы к разработке помимо классического объектно-ориентированного программирования.

1. Функциональное программирование

C# постепенно заимствует многие концепции из функциональных языков.

1.1. Основные возможности:

  • Лямбда-выражения и делегаты
Func<int, int, int> add = (x, y) => x + y;
  • LINQ (Language Integrated Query)
var evens = numbers.Where(n => n % 2 == 0)
                  .Select(n => n * 2);
  • Иммутабельность (records, readonly structs)
public record Person(string Name, int Age);
  • Pattern matching (C# 7.0+)
var result = obj switch {
    int i when i > 0 => "Positive",
    string s => $"String: {s}",
    _ => "Unknown"
};

1.2. Преимущества:

  • Упрощение работы с данными
  • Более предсказуемый код
  • Удобство параллельных вычислений

2. Аспектно-ориентированное программирование

Позволяет вынести сквозную функциональность (cross-cutting concerns) в отдельные модули.

2.1. Реализации в C#:

  • PostSharp (коммерческий)
[Log]
public class MyService
{
    [Cache]
    public string GetData() { ... }
}
  • DynamicProxy (Castle Core)
  • Метод-интерцепторы в DI (ASP.NET Core)
services.AddTransient<IService, Service>()
        .AddInterceptors<LoggingInterceptor>();

2.2. Типичные применения:

  • Логирование
  • Кэширование
  • Проверка прав доступа
  • Транзакции

3. Реактивное программирование

Работа с асинхронными потоками данных.

3.1. Библиотеки:

  • System.Reactive (Rx.NET)
IObservable<int> source = Observable.Range(1, 10);
source.Where(x => x % 2 == 0)
      .Subscribe(x => Console.WriteLine(x));
  • Channels (для producer/consumer сценариев)
var channel = Channel.CreateUnbounded<int>();
await channel.Writer.WriteAsync(42);
var item = await channel.Reader.ReadAsync();

4. Компонентно-ориентированное программирование

  • COM интероп (устаревший, но поддерживается)
  • Система компонентов в WinForms/WPF
// WPF компонент
public class MyComponent : Control { ... }

5. Процедурное программирование

Хотя C# ООП-язык, процедурный стиль возможен:

public static void ProcessData()
{
    var data = ReadData();
    var processed = Transform(data);
    Save(processed);
}

6. Метапрограммирование

  • Генерация кода (Source Generators, T4)
  • Reflection.Emit (динамическая генерация кода)
var method = new DynamicMethod("MyMethod", ...);
var il = method.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", ...));

7. Data-Oriented Design

Оптимизация под современные процессоры:

  • Structs вместо классов
  • Массивы структур (SoA)
  • Memory и Span
struct Particle { Vector3 Position; float Size; }
Particle[] particles = new Particle[1000];

8. Event-Driven Architecture

  • События в C# (event/delegate)
public event EventHandler<MyArgs> OnProcessed;
  • Message brokers (RabbitMQ, Kafka)
  • MediatR библиотека
await mediator.Send(new MyCommand());

9. Декларативное программирование

  • Атрибуты
[Obsolete("Use NewMethod instead")]
public void OldMethod() { ... }
  • XAML в WPF/UWP
<Button Content="Click" Command="{Binding MyCommand}" />

10. Обобщённое программирование

  • Шаблоны классов и методов
public class Repository<T> where T : IEntity
{
    public T GetById(int id) { ... }
}

Резюмируем:

современный C# поддерживает множество парадигм — от функционального и реактивного программирования до аспектно-ориентированного подхода и data-oriented design. Грамотное комбинирование этих подходов позволяет писать более выразительный, поддерживаемый и производительный код, адаптируя стиль программирования под конкретную задачу.