この質問はC#言語に関するものですが、JavaやTypeScriptなどの他の言語をカバーするものと期待しています。
Microsoft は、.NETで非同期呼び出しを使用する場合のベストプラクティスを推奨しています。これらの推奨事項のうち、2つを選択しましょう。
- TaskまたはTask <>を返すように非同期メソッドのシグネチャを変更します(TypeScriptでは、Promise <>になります)
- 非同期メソッドの名前をxxxAsync()で終わるように変更します
現在、低レベルの同期コンポーネントを非同期コンポーネントに置き換えると、これはアプリケーションのフルスタックに影響します。async / awaitは「最後まで」使用した場合にのみプラスの影響を与えるため、アプリケーション内のすべてのレイヤーのシグネチャとメソッド名を変更する必要があることを意味します。
優れたアーキテクチャでは、各レイヤーの間に抽象化を配置することが多く、低レベルのコンポーネントを他のコンポーネントに置き換えることは、上位レベルのコンポーネントには見えません。C#では、抽象化はインターフェイスの形式を取ります。新しい低レベルの非同期コンポーネントを導入する場合、コールスタック内の各インターフェイスを変更するか、新しいインターフェイスに置き換える必要があります。実装クラスで問題が解決される方法(非同期または同期)は、呼び出し元には隠されません(抽象化されません)。呼び出し元は、同期か非同期かを知る必要があります。
「良いアーキテクチャ」の原則と矛盾するベストプラクティスを非同期/待機しませんか?
非同期依存関係に切り替えるときにスタック内で置き換えることができるように、各インターフェイス(IEnumerable、IDataAccessLayerなど)が非同期の対応物(IAsyncEnumerable、IAsyncDataAccessLayer)を必要とするということですか?
問題をもう少し進めると、すべてのメソッドが非同期(Task <>またはPromise <>を返す)であると仮定し、メソッドが実際に非同期呼び出しを同期しないようにする方が簡単ではないでしょうか非同期?これは将来のプログラミング言語から期待されるものですか?
CancellationToken
、デフォルトを提供したいメソッドもあります)。既存の同期メソッドを削除する(およびすべてのコードを積極的に破壊する)ことは、明らかに非スターターです。