Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

142
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda