Questa domanda riguarda il linguaggio C #, ma mi aspetto che copra altri linguaggi come Java o TypeScript.
Microsoft consiglia le best practice sull'utilizzo di chiamate asincrone in .NET. Tra questi suggerimenti, scegliamo due:
- cambia la firma dei metodi asincroni in modo che restituiscano Attività o Attività < > (in TypeScript, sarebbe una Promessa < >)
- cambia i nomi dei metodi asincroni per terminare con xxxAsync ()
Ora, quando si sostituisce un componente sincrono di basso livello con uno asincrono, questo influenza lo stack completo dell'applicazione. Poiché async / await ha un impatto positivo solo se usato "fino in fondo", significa che i nomi delle firme e dei metodi di ogni livello nell'applicazione devono essere modificati.
Una buona architettura spesso implica l'inserimento di astrazioni tra ogni livello, in modo tale che la sostituzione di componenti di basso livello da parte di altri non venga vista dai componenti di livello superiore. In C #, le astrazioni prendono 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 sincronizzazione) in una classe di implementazione non è più nascosto (astratto) ai chiamanti. I chiamanti devono sapere se è sincronizzato o asincrono.
Non sei asincrono / attendi le migliori pratiche in contraddizione con i principi della "buona architettura"?
Significa che ogni interfaccia (ad esempio IEnumerable, IDataAccessLayer) ha bisogno della loro controparte asincrona (IAsyncEnumerable, IAsyncDataAccessLayer) in modo tale che possano essere sostituiti nello stack quando si passa alle dipendenze asincrone?
Se spingiamo il problema un po 'più avanti, non sarebbe più semplice ipotizzare che ogni metodo sia asincrono (per restituire un Task < > o Promise < >), e per i metodi per sincronizzare le chiamate asincrone quando non sono effettivamente asincroni? È qualcosa che ci si aspetta dai futuri linguaggi di programmazione?