Esta pregunta se refiere al lenguaje C #, pero espero que cubra otros lenguajes como Java o TypeScript.
Microsoft recomienda las mejores prácticas sobre el uso de llamadas asincrónicas en .NET. Entre estas recomendaciones, escojamos dos:
- cambiar la firma de los métodos asíncronos para que devuelvan Tarea o Tarea <> (en TypeScript, eso sería una Promesa <>)
- cambiar los nombres de los métodos asíncronos para terminar con xxxAsync ()
Ahora, cuando se reemplaza un componente síncrono de bajo nivel por uno asíncrono, esto afecta la pila completa de la aplicación. Dado que async / await tiene un impacto positivo solo si se usa "completamente", significa que se deben cambiar los nombres de firma y método de cada capa de la aplicación.
Una buena arquitectura a menudo implica colocar abstracciones entre cada capa, de modo que el reemplazo de componentes de bajo nivel por otros no sea visto por los componentes de nivel superior. En C #, las abstracciones toman la forma de interfaces. Si presentamos un nuevo componente asíncrono de bajo nivel, cada interfaz en la pila de llamadas debe ser modificada o reemplazada por una nueva interfaz. La forma en que se resuelve un problema (asíncrono o sincronización) en una clase de implementación ya no se oculta (abstrae) a las personas que llaman. Las personas que llaman tienen que saber si es sincronizado o asíncrono.
¿Acaso las mejores prácticas asíncronas / en espera no contradicen los principios de "buena arquitectura"?
¿Significa que cada interfaz (por ejemplo, IEnumerable, IDataAccessLayer) necesita su contraparte asíncrona (IAsyncEnumerable, IAsyncDataAccessLayer) de modo que puedan reemplazarse en la pila al cambiar a dependencias asíncronas?
Si llevamos el problema un poco más lejos, ¿no sería más sencillo asumir que todos los métodos son asíncronos (para devolver una Tarea <> o Promesa <>), y que los métodos sincronicen las llamadas asíncronas cuando en realidad no están asíncrono? ¿Es esto algo que se espera de los futuros lenguajes de programación?
CancellationToken
, y aquellos que lo hacen pueden desear proporcionar un valor predeterminado). La eliminación de los métodos de sincronización existentes (y la ruptura proactiva de todo el código) es un obvio obvio.