Этот вопрос касается языка C #, но я ожидаю, что он охватит другие языки, такие как Java или TypeScript.
Microsoft рекомендует лучшие практики по использованию асинхронных вызовов в .NET. Среди этих рекомендаций давайте выберем две:
- измените сигнатуру асинхронных методов, чтобы они возвращали Task или Task <> (в TypeScript это будет Promise <>)
- изменить имена асинхронных методов на xxxAsync ()
Теперь, при замене низкоуровневого синхронного компонента на асинхронный, это влияет на весь стек приложения. Поскольку async / await оказывает положительное влияние только в том случае, если используется «до конца», это означает, что имена сигнатур и методов каждого уровня в приложении должны быть изменены.
Хорошая архитектура часто предполагает размещение абстракций между каждым уровнем, так что замена компонентов нижнего уровня другими невидима компонентами верхнего уровня. В C # абстракции принимают форму интерфейсов. Если мы представляем новый низкоуровневый асинхронный компонент, каждый интерфейс в стеке вызовов должен быть либо изменен, либо заменен новым интерфейсом. Способ решения проблемы (асинхронный или синхронный) в реализующем классе больше не скрыт (абстрагирован) для вызывающих. Вызывающие абоненты должны знать, является ли это синхронизацией или асинхронностью.
Разве асинхронные / не ждут лучших практик, противоречащих принципам «хорошей архитектуры»?
Означает ли это, что каждому интерфейсу (скажем, IEnumerable, IDataAccessLayer) требуется свой асинхронный аналог (IAsyncEnumerable, IAsyncDataAccessLayer), чтобы их можно было заменить в стеке при переключении на асинхронные зависимости?
Если мы продвинем проблему чуть дальше, не будет ли проще предположить, что каждый метод является асинхронным (для возврата Task <> или Promise <>), и чтобы методы синхронизировали асинхронные вызовы, когда они на самом деле не являются асинхронный? Это то, что можно ожидать от будущих языков программирования?
CancellationToken
, а те, которые это делают, могут захотеть указать значение по умолчанию). Удаление существующих методов синхронизации (и упреждающее разрушение всего кода), очевидно, не является началом.