Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

136
Vistas
Fijar el valor de un BehaviorSubject

¿Es posible transformar / validar el valor de un ISubject<T> ?

Por ejemplo, tengo un BehaviorSubject<double> zoomFactor = new(1); que me gustaría estar sujeto entre 0.1 y 10 .

  • Debería ser posible llamar a zoomFactor.OnNext(Math.Clamp(newZoomFactor, 0.1, 10)) , pero hacerlo pone la responsabilidad en la persona que llama, lo cual deseo evitar.
  • Podría transformarme con la observación usando zoomFactor.Select(newZoomFactor => Math.Clamp(newZoomFactor, 0.1, 10)) , pero:
    • Esto es externalizar la responsabilidad a otra persona que llama nuevamente;
    • El valor original zoomFactor no se cambiaría aquí: imagine que el usuario se aleja más allá del límite y vuelve a acercar, pero el zoom renderizado se mantiene en 10 durante el tiempo que el valor real vuelve silenciosamente a los límites fijados internamente...
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿Qué tal crear una ISubject<T> personalizada con el comportamiento deseable?

 class BehaviorTransformSubject<T> : ISubject<T> { private readonly BehaviorSubject<T> _subject; private readonly Func<T, T> _transform; public BehaviorTransformSubject(T value, Func<T, T> transform) { _subject = new BehaviorSubject<T>(value); _transform = transform; } public void OnNext(T value) => _subject.OnNext(_transform(value)); public void OnCompleted() => _subject.OnCompleted(); public void OnError(Exception error) => _subject.OnError(error); public IDisposable Subscribe(IObserver<T> o) => _subject.Subscribe(o); }

Ejemplo de uso:

 ISubject<double> zoomFactor = new BehaviorTransformSubject<double>(1.0, x => Math.Clamp(x, 0.1, 10.0));

Implementación alternativa: el método OnNext podría implementarse alternativamente así:

 public void OnNext(T value) { T newValue; try { newValue = _transform(value); } catch (Exception ex) { _subject.OnError(ex); return; } _subject.OnNext(newValue); }

Este maneja de manera diferente una posible falla de la función de transform . En lugar de devolver el error directamente al productor que invocó el método OnNext , lo propaga a los consumidores del sujeto, provocando su terminación irreversible (no se propagarán más valores a través de este sujeto). Supongo que la implementación original OnNext tiene la semántica que está buscando, pero podría estar equivocado.

Para ser justos, el método Math.Clamp nunca falla (según los documentos), por lo que esta distinción es principalmente académica en su caso.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda