Sto provando a progettare un componente asincrono. I requisiti su questo componente sono:
- Il componente potrebbe ricevere eventi in qualsiasi momento
- Il componente potrebbe avviare un'operazione di lunga durata e attendere il risultato. Questa operazione viene eseguita dal sistema esterno.
- L'operazione a lungo termine potrebbe essere annullata, sia dal componente che esternamente
- Gli eventi potrebbero venire mentre è in esecuzione l'operazione di lunga durata, che potrebbe riavviare l'operazione di lunga durata, eventualmente annullando l'invocazione precedente
- I componenti devono decidere cosa fare con l'evento che arriva durante l'operazione di lunga durata, se ignorarlo, metterlo in coda o qualcos'altro
- Il componente potrebbe iniziare diverse operazioni in risposta a diversi eventi
- Il componente può avere più "valori di supporto", in cui ciascuno ha un valore corrente e la sua richiesta di modifica è un componente evento che deve reagire a
- Deve essere possibile testare il componente in isolamento (questo è importante!)
- Ci saranno più componenti diversi, alcuni potrebbero condividere comportamenti. Ad esempio la possibilità di accendere / spegnere il componente.
Finora ho cercato / pensato di:
- Osservabili reattivi
- Questo è ciò che viene utilizzato in questo momento
- Mi piace molto il modo in cui eseguire i test in tempo virtuale
- Le operazioni di lunga durata sono rappresentate come funzioni che trasformano la "richiesta" osservabile in "risposta" osservabile
- Ma il resto del team considera questa soluzione troppo complessa
- Oggetti semplici con metodi per gestori di eventi
- Complessivamente semplice, ma alcune costruzioni potrebbero essere complesse
- Non richiede librerie aggiuntive
- Il test non è semplice, poiché è necessario scrivere esplicitamente ogni risposta all'evento invece di dire "per ogni richiesta, rispondere in 5 tick" come in reattivo
- Attività con async / await
- Non so come sarebbe possibile implementare la situazione che si verifica quando l'evento si verifica durante operazioni di lunga durata e come testare questa situazione, motivo per cui scelgo reattivo invece
- Quadro degli attori (Akka)
- Questo sembra essere il più adatto per i miei requisiti
- Ma non mi piace il modo in cui viene effettuato il test, poiché utilizza in tempo reale
- E credo che Akka sia un modo eccessivo per questo caso d'uso, poiché non abbiamo bisogno del threading per componente e di tutte le strumentazioni per creare attori e comunicare tra loro
- E temo che anche il mio team lo considererebbe troppo complesso
Quello che sto cercando sono suggerimenti di possibili altre soluzioni, a cui non avrei pensato. O ulteriori vantaggi / svantaggi delle soluzioni suggerite.