Ho una funzione driver modifyFile
che interagisce con molte fonti nel mondo esterno (ad esempio HTTP, filesystem). Diciamo che il codice è così:
def downloadFile(from: String, to: String): Try[Unit]
def runUnixProcess(cmd: String): Boolean
def modifyFile = {
downloadFile(from = "http://.../some/file.dat", to = "/tmp/file.dat") //
val status = runUnixProcess("/usr/bin/somebinaries /tmp/file.dat")
if (status == Status.OK) deleteFile("/tmp/file.dat")
}
Per il gusto dell'argomento, consideriamo che queste funzioni rispettano la regola del Principio della singola responsabilità e che modifyFile
è solo un driver che "integra" e facilita la comunicazione tra entità separate come OS, File system e web servizio.
Sebbene questa funzione si collochi molto probabilmente al livello più alto della logica dell'applicazione, su di essa potrebbe essere costruita un'altra funzione applicativa. Quindi, voglio avere una sorta di astrazione appropriata (ad esempio avvolgendola con un costrutto monadico) in modo che possiamo ancora comporre un'astrazione ancora più alta su di essa.
Ora la mia domanda: Qual è la migliore costruzione del linguaggio per astrarre questo tipo di calcolo ? Vale a dire un calcolo che:
- chiama a molte entità nel mondo esterno
- potrebbe non riuscire, parzialmente o completamente in alcuni passaggi a causa di varie condizioni. Per citarne alcuni, potremmo avere a che fare con il problema del permesso del file system, il problema della connessione di rete, i file binari unix mancanti, ecc.
- potrebbe dover essere eseguito in modo asincrono, considerando che ci sono diverse chiamate di blocco in esso.
È lo% di% su% di Scalaz per esso?
O dovrei semplicemente racchiuderlo come Task
, che sostanzialmente cattura la maggior parte delle caratteristiche che esibisce?