Cette question concerne le langage C #, mais je m'attends à ce qu'il couvre d'autres langages tels que Java ou TypeScript.
Microsoft recommande les meilleures pratiques sur l' utilisation des appels asynchrones dans .NET. Parmi ces recommandations, prenons deux:
- modifier la signature des méthodes asynchrones afin qu'elles renvoient la tâche ou la tâche <> (dans TypeScript, ce serait une promesse <>)
- modifier les noms des méthodes asynchrones pour qu'ils se terminent par xxxAsync ()
Désormais, le remplacement d’un composant synchrone de bas niveau par un composant asynchrone a une incidence sur l’ensemble de la pile de l’application. Comme async / wait n’a un impact positif que s’il est utilisé «à tous les niveaux», cela signifie que les noms de signature et de méthode de chaque couche de l’application doivent être modifiés.
Une bonne architecture implique souvent de placer des abstractions entre chaque couche, de sorte que le remplacement des composants de bas niveau par d'autres ne soit pas vu par les composants de niveau supérieur. En C #, les abstractions se présentent sous la forme d'interfaces. Si nous introduisons un nouveau composant asynchrone de bas niveau, chaque interface de la pile d'appels doit être modifiée ou remplacée par une nouvelle interface. La façon dont un problème est résolu (asynchrone ou sync) dans une classe d'implémentation n'est plus cachée (abstraite) pour les appelants. Les appelants doivent savoir si c'est synchrone ou asynchrone.
Est-ce que les meilleures pratiques ne sont pas asynchrones / en contradiction avec les principes de "bonne architecture"?
Cela signifie-t-il que chaque interface (par exemple IEnumerable, IDataAccessLayer) a besoin de son homologue asynchrone (IAsyncEnumerable, IAsyncDataAccessLayer) pour pouvoir être remplacée dans la pile lors du basculement vers des dépendances asynchrones?
Si nous poussons le problème un peu plus loin, ne serait-il pas plus simple de supposer que chaque méthode est asynchrone (pour renvoyer une tâche <> ou une promesse <>), et que les méthodes synchronisent les appels asynchrones lorsqu'ils ne sont pas réellement Async? Est-ce quelque chose à attendre des futurs langages de programmation?
CancellationToken
, et celles qui le font peuvent souhaiter fournir une valeur par défaut). Supprimer les méthodes de synchronisation existantes (et briser de manière proactive tout le code) est une évidence.