Це питання стосується мови C #, але я очікую, що він охопить і інші мови, такі як Java або TypeScript.
Microsoft рекомендує кращі практики використання асинхронних дзвінків у .NET. Серед цих рекомендацій виберемо дві:
- змінити підпис методів асинхронізації, щоб вони повернули Завдання або Завдання <> (в TypeScript це буде Обіцянкою <>)
- змінити назви методів асинхронізації, щоб закінчити xxxAsync ()
Тепер, замінюючи синхронний компонент низького рівня на асинхронний, це впливає на повний стек програми. Оскільки async / await має позитивний вплив лише в тому випадку, якщо він використовується "до кінця", це означає, що назви підписів та методів кожного шару в додатку повинні бути змінені.
Хороша архітектура часто передбачає розміщення абстракцій між кожними шарами, так що заміна компонентів низького рівня іншими не бачить компонентів верхнього рівня. У C # абстракції мають форму інтерфейсів. Якщо ми введемо новий, низькорівневий компонент асинхронізації, кожен інтерфейс у стеку викликів повинен бути або змінений, або замінений на новий інтерфейс. Спосіб вирішення проблеми (асинхронізація чи синхронізація) в реалізаційному класі вже не прихований (абстрагується) для абонентів. Абоненти повинні знати, чи це синхронізація чи асинхронізація.
Чи не асинхронізація / очікування кращих практик, що суперечать принципам "хорошої архітектури"?
Чи означає це, що кожен інтерфейс (скажімо, IEnumerable, IDataAccessLayer) потребує свого асинхронного аналога (IAsyncEnumerable, IAsyncDataAccessLayer) таким, щоб їх можна було замінити в стеці при переході на асинхронні залежності?
Якщо ми поставимо проблему трохи далі, чи не було б простіше вважати кожен метод асинхронним (повернути завдання <> або обіцяти <>), а також методи синхронізувати виклики асинхронізації, коли вони насправді не є асинхронізація? Чи варто цього чекати від майбутніх мов програмування?
CancellationToken
, а ті, хто може, бажають надати за замовчуванням). Видалення існуючих методів синхронізації (і проактивне порушення всього коду) - очевидно, що не починається.