Come posso isolare le modifiche allo stato mutabile se devo eseguire due query per ottenere il risultato finale?

4

Sto lavorando su un codice che accetta i criteri di ricerca da un'API Rest e lo utilizza per interrogare un'API remota per restituire i risultati. Come esercizio, volevo provare a separare tutti i cambiamenti di stato in un posto, come un linguaggio come Haskell ti costringerebbe a (anche se sto programmando in Java in questo esempio).

All'inizio questo era semplice: separare il codice che genera la query dal codice che esegue la query. Il codice che esegue la query può ignorare la query che ottiene.

Ma ora ho un nuovo requisito che funziona in questo modo: se qualcuno cerca tutte le cose sotto una cartella genitore, allora ho bisogno di eseguire due query. Uno per trovare il percorso di quella cartella padre e poi un altro per trovare tutte le cose che iniziano con quel percorso. Non posso usare sottoquery per fare ciò in una query, l'API remota non lo consente.

Non riesco a capire come potrei progettarlo in modo pulito. Per questo caso speciale, la prima query deve uscire dal codice "puro", essere eseguita, quindi il risultato deve essere passato a un codice "puro" diverso in modo che il risultato possa essere eseguito come seconda query.

Come sarebbe stato progettato in modo pulito in un linguaggio di programmazione funzionale? Tieni presente che domani potrei ottenere un nuovo requisito che richiede di eseguire 3 query per ottenere il risultato finale.

    
posta Daniel Kaplan 11.02.2015 - 00:38
fonte

1 risposta

2

Il modello più comune che vedo in questi tipi di situazioni è usare un CompletableFuture , che la maggior parte dei linguaggi FP chiama semplicemente Future . Ti permette di eseguire qualcosa di long-running come una query, quindi di specificare le azioni da intraprendere in seguito. Se la query ha esito positivo, il risultato viene passato all'azione successiva nella catena. Se fallisce, tutte le azioni successive vengono saltate e viene chiamata invece un'azione di errore.

Non l'ho fatto personalmente in Java, quindi non posso parlare della facilità d'uso di questa particolare implementazione, ma è un vero toccasana in JavaScript.

    
risposta data 11.02.2015 - 01:26
fonte

Leggi altre domande sui tag