Come si mantengono il codice con le continue/callback leggibili?
https://softwareengineering.stackexchange.com/questions/151591
-
04-11-2019 - |
Domanda
Riepilogo: Ci sono alcuni modelli di miglior pratica consolidati che posso seguire per mantenere il mio codice leggibile nonostante l'utilizzo di codice asincrono e callback?
Sto usando una libreria JavaScript che fa molte cose in modo asincrono e pesantemente si basa sui callback. Sembra che scrivere un semplice metodo "Carica A, Carico B, ..." diventi piuttosto complicato e difficile da seguire usando questo modello.
Lasciami dare un esempio (inventato). Diciamo che voglio caricare un sacco di immagini (in modo asincrono) da un server Web remoto. In C#/Async, scriverei qualcosa del genere:
disableStartButton();
foreach (myData in myRepository) {
var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id);
if (result.Success) {
myData.Image = result.Data;
} else {
write("error loading Image " + myData.Id);
return;
}
}
write("success");
enableStartButton();
Il layout del codice segue il "Flusso degli eventi": in primo luogo, il pulsante di avvio è disabilitato, quindi le immagini vengono caricate (await
assicura che l'interfaccia utente rimanga reattiva) e quindi il pulsante di avvio sia abilitato di nuovo.
In JavaScript, usando i callback, mi è venuta in mente questo:
disableStartButton();
var count = myRepository.length;
function loadImage(i) {
if (i >= count) {
write("success");
enableStartButton();
return;
}
myData = myRepository[i];
LoadImageAsync("http://my/server/GetImage?" + myData.Id,
function(success, data) {
if (success) {
myData.Image = data;
} else {
write("error loading image " + myData.Id);
return;
}
loadImage(i+1);
}
);
}
loadImage(0);
Penso che gli svantaggi siano ovvi: ho dovuto rielaborare il ciclo in una chiamata ricorsiva, il codice che dovrebbe essere eseguito alla fine è da qualche parte nel mezzo della funzione, il codice che inizia il download (loadImage(0)
) è in fondo ed è generalmente molto più difficile da leggere e seguire. È brutto e non mi piace.
Sono sicuro di non essere il primo a riscontrare questo problema, quindi la mia domanda è: Ci sono alcuni modelli di miglior pratica consolidati che posso seguire per mantenere il mio codice leggibile nonostante l'utilizzo di codice asincrono e callback?
Nessuna soluzione corretta