Questa domanda riguarda il linguaggio C #, ma mi aspetto che copra altri linguaggi come Java o TypeScript.
Microsoft consiglia le migliori pratiche sull'uso delle chiamate asincrone in .NET. Tra questi consigli, scegline due:
- cambia la firma dei metodi asincroni in modo che restituiscano Task o Task <> (in TypeScript, sarebbe una Promessa <>)
- cambiare i nomi dei metodi asincroni per terminare con xxxAsync ()
Ora, quando si sostituisce un componente sincrono di basso livello con un componente asincrono, questo ha un impatto sull'intero stack dell'applicazione. Poiché async / await ha un impatto positivo solo se utilizzato "completamente", significa che è necessario modificare i nomi di firma e metodo di ogni livello nell'applicazione.
Una buona architettura comporta spesso il posizionamento di astrazioni tra ogni livello, in modo tale che la sostituzione di componenti di basso livello con altri non sia vista dai componenti di livello superiore. In C #, le astrazioni assumono la forma di interfacce. Se introduciamo un nuovo componente asincrono di basso livello, ogni interfaccia nello stack di chiamate deve essere modificata o sostituita da una nuova interfaccia. Il modo in cui un problema viene risolto (asincrono o sincronizzato) in una classe di implementazione non viene più nascosto (sottratto) ai chiamanti. I chiamanti devono sapere se è sincronizzato o asincrono.
Gli asincroni / attendono le migliori pratiche in contraddizione con i principi della "buona architettura"?
Significa che ogni interfaccia (diciamo IEnumerable, IDataAccessLayer) ha bisogno della sua controparte asincrona (IAsyncEnumerable, IAsyncDataAccessLayer) in modo tale da poter essere sostituita nello stack quando si passa alle dipendenze asincrone?
Se spingiamo il problema un po 'oltre, non sarebbe più semplice assumere ogni metodo asincrono (per restituire un'attività <> o Promessa <>) e per i metodi per sincronizzare le chiamate asincrone quando in realtà non sono async? Ci si aspetta qualcosa dai futuri linguaggi di programmazione?
CancellationToken
, e quelli che lo fanno potrebbero voler fornire un valore predefinito). Rimuovere i metodi di sincronizzazione esistenti (e rompere in modo proattivo tutto il codice) è un ovvio non avviatore.