Skip to content

Reactive Programming

Giriş

Reactive Programming, veri akışları ve değişiklik yayılımına dayalı bir programlama paradigmasıdır. .NET dünyasında Reactive Extensions (Rx.NET) ile uygulanır ve asenkron veri akışlarını yönetmek için güçlü bir araç seti sunar.

Reactive Programming'in Önemi

  1. Asenkron Veri Yönetimi
  2. Veri akışı kontrolü
  3. Olay tabanlı programlama
  4. Zaman uyumsuz işlemler
  5. Gerçek zamanlı veri işleme

  6. Kod Kalitesi

  7. Daha temiz kod yapısı
  8. Daha az boilerplate kod
  9. Daha iyi hata yönetimi
  10. Daha kolay bakım

  11. Ölçeklenebilirlik

  12. Yüksek performans
  13. Kaynak optimizasyonu
  14. Paralel işleme
  15. Dağıtık sistemler

Reactive Programming Özellikleri

  1. Observable Pattern
  2. Veri kaynağı
  3. Olay yayınlama
  4. Abonelik yönetimi
  5. Veri dönüşümü

  6. Operatörler

  7. Filtreleme
  8. Dönüştürme
  9. Birleştirme
  10. Zamanlama

  11. Schedulers

  12. Thread yönetimi
  13. Zamanlama
  14. Eşzamanlılık kontrolü
  15. Kaynak yönetimi

Reactive Programming Kullanımı

  1. Temel Observable

    public class DataProducer
    {
        public IObservable<int> CreateObservable()
        {
            return Observable.Create<int>(observer =>
            {
                // Veri üretme
                observer.OnNext(1);
                observer.OnNext(2);
                observer.OnNext(3);
                observer.OnCompleted();
    
                return Disposable.Empty;
            });
        }
    
        public void SubscribeToObservable()
        {
            var observable = CreateObservable();
    
            var subscription = observable.Subscribe(
                value => Console.WriteLine($"Value: {value}"),
                error => Console.WriteLine($"Error: {error}"),
                () => Console.WriteLine("Completed")
            );
        }
    }
    

  2. Event Stream

    public class EventProcessor
    {
        public IObservable<MouseEvent> CreateMouseEventStream()
        {
            return Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
                h => MouseMove += h,
                h => MouseMove -= h
            ).Select(e => new MouseEvent(e.EventArgs.X, e.EventArgs.Y));
        }
    
        public void ProcessMouseEvents()
        {
            var mouseStream = CreateMouseEventStream();
    
            var subscription = mouseStream
                .Throttle(TimeSpan.FromMilliseconds(250))
                .Subscribe(e => ProcessEvent(e));
        }
    
        private void ProcessEvent(MouseEvent e)
        {
            // Olay işleme
        }
    }
    

  3. Veri Dönüşümü

    public class DataTransformer
    {
        public IObservable<string> TransformData(IObservable<int> source)
        {
            return source
                .Where(x => x > 0)
                .Select(x => x * 2)
                .Select(x => $"Transformed: {x}");
        }
    
        public void ProcessTransformedData()
        {
            var source = Observable.Range(1, 5);
            var transformed = TransformData(source);
    
            transformed.Subscribe(Console.WriteLine);
        }
    }
    

  4. Zamanlama İşlemleri

    public class TimeBasedProcessor
    {
        public IObservable<int> CreateTimedSequence()
        {
            return Observable.Interval(TimeSpan.FromSeconds(1))
                .Select(x => (int)x)
                .Take(5);
        }
    
        public void ProcessTimedSequence()
        {
            var sequence = CreateTimedSequence();
    
            sequence.Subscribe(
                x => Console.WriteLine($"Tick: {x}"),
                () => Console.WriteLine("Sequence completed")
            );
        }
    }
    

  5. Hata Yönetimi

    public class ErrorHandler
    {
        public IObservable<int> CreateErrorProneStream()
        {
            return Observable.Create<int>(observer =>
            {
                try
                {
                    observer.OnNext(1);
                    throw new Exception("Simulated error");
                    observer.OnNext(2);
                }
                catch (Exception ex)
                {
                    observer.OnError(ex);
                }
                return Disposable.Empty;
            });
        }
    
        public void HandleErrors()
        {
            var stream = CreateErrorProneStream();
    
            stream
                .Catch<int, Exception>(ex =>
                {
                    Console.WriteLine($"Error caught: {ex.Message}");
                    return Observable.Return(-1);
                })
                .Subscribe(
                    x => Console.WriteLine($"Value: {x}"),
                    ex => Console.WriteLine($"Error: {ex}"),
                    () => Console.WriteLine("Completed")
                );
        }
    }
    

Reactive Programming Best Practices

  1. Stream Tasarımı
  2. Tek sorumluluk prensibi
  3. İsimlendirme kuralları
  4. Hata yönetimi
  5. Kaynak temizleme

  6. Performans

  7. Backpressure yönetimi
  8. Buffer optimizasyonu
  9. Memory kullanımı
  10. CPU kullanımı

  11. Güvenlik

  12. Thread safety
  13. Race condition önleme
  14. Deadlock önleme
  15. Kaynak yönetimi

  16. Monitoring

  17. Stream durumu
  18. Performans metrikleri
  19. Hata izleme
  20. Kaynak kullanımı

Mülakat Soruları

Temel Sorular

  1. Reactive Programming nedir ve neden kullanılır?
  2. Cevap: Reactive Programming, veri akışları ve değişiklik yayılımına dayalı bir programlama paradigmasıdır. Asenkron veri akışlarını yönetmek, olay tabanlı programlama yapmak ve gerçek zamanlı veri işlemek için kullanılır.

  3. Reactive Programming'in temel özellikleri nelerdir?

  4. Cevap:

    • Observable pattern
    • Operatörler
    • Schedulers
    • Asenkron veri akışı
    • Olay yönetimi
  5. Reactive Programming'in avantajları nelerdir?

  6. Cevap:

    • Asenkron veri yönetimi
    • Kod kalitesi
    • Ölçeklenebilirlik
    • Performans
    • Esneklik
  7. Observable ve Observer nedir?

  8. Cevap: Observable, veri kaynağını temsil eden ve veri yayınlayan bir yapıdır. Observer ise bu verileri alan ve işleyen yapıdır. Observer pattern'in bir uygulamasıdır.

  9. Reactive Programming'de operatörler nelerdir?

  10. Cevap:
    • Filtreleme operatörleri (Where, Filter)
    • Dönüştürme operatörleri (Select, Map)
    • Birleştirme operatörleri (Merge, Concat)
    • Zamanlama operatörleri (Delay, Throttle)

Teknik Sorular

  1. Observable nasıl oluşturulur?
  2. Cevap:

    public class ObservableCreator
    {
        public IObservable<int> CreateObservable()
        {
            return Observable.Create<int>(observer =>
            {
                observer.OnNext(1);
                observer.OnNext(2);
                observer.OnCompleted();
                return Disposable.Empty;
            });
        }
    }
    

  3. Event stream nasıl oluşturulur?

  4. Cevap:

    public class EventStreamCreator
    {
        public IObservable<MouseEvent> CreateMouseEventStream()
        {
            return Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
                h => MouseMove += h,
                h => MouseMove -= h
            ).Select(e => new MouseEvent(e.EventArgs.X, e.EventArgs.Y));
        }
    }
    

  5. Veri dönüşümü nasıl yapılır?

  6. Cevap:

    public class DataTransformer
    {
        public IObservable<string> TransformData(IObservable<int> source)
        {
            return source
                .Where(x => x > 0)
                .Select(x => x * 2)
                .Select(x => $"Transformed: {x}");
        }
    }
    

  7. Hata yönetimi nasıl yapılır?

  8. Cevap:

    public class ErrorHandler
    {
        public void HandleErrors()
        {
            var stream = CreateErrorProneStream();
    
            stream
                .Catch<int, Exception>(ex =>
                {
                    Console.WriteLine($"Error caught: {ex.Message}");
                    return Observable.Return(-1);
                })
                .Subscribe(
                    x => Console.WriteLine($"Value: {x}"),
                    ex => Console.WriteLine($"Error: {ex}"),
                    () => Console.WriteLine("Completed")
                );
        }
    }
    

  9. Zamanlama işlemleri nasıl yapılır?

  10. Cevap:
    public class TimeBasedProcessor
    {
        public IObservable<int> CreateTimedSequence()
        {
            return Observable.Interval(TimeSpan.FromSeconds(1))
                .Select(x => (int)x)
                .Take(5);
        }
    }
    

İleri Seviye Sorular

  1. Reactive Programming'de performans optimizasyonu nasıl yapılır?
  2. Cevap:

    • Backpressure yönetimi
    • Buffer optimizasyonu
    • Memory kullanımı
    • CPU kullanımı
    • Thread pool yönetimi
  3. Reactive Programming'de memory leak nasıl önlenir?

  4. Cevap:

    • Subscription yönetimi
    • Dispose pattern
    • Weak references
    • Memory profiling
    • Resource cleanup
  5. Reactive Programming ile distributed sistemler nasıl yönetilir?

  6. Cevap:

    • Stream dağıtımı
    • Load balancing
    • Failover stratejileri
    • Consistency yönetimi
    • Monitoring
  7. Reactive Programming'de monitoring nasıl yapılır?

  8. Cevap:

    • Stream durumu takibi
    • Performans metrikleri
    • Hata izleme
    • Kaynak kullanımı
    • Profiling
  9. Reactive Programming'de scaling nasıl yapılır?

  10. Cevap:
    • Stream parçalama
    • Paralellik derecesi ayarı
    • Kaynak yönetimi
    • Load balancing
    • Performance tuning