Pertanyaan ini menyangkut bahasa C #, tetapi saya berharap untuk mencakup bahasa lain seperti Java atau TypeScript.
Microsoft merekomendasikan praktik terbaik dalam menggunakan panggilan asinkron di .NET. Di antara rekomendasi ini, mari kita pilih dua:
- ubah tanda tangan dari metode async sehingga mereka mengembalikan Task atau Task <> (dalam TypeScript, itu akan menjadi Janji <>)
- ubah nama metode async menjadi diakhiri dengan xxxAsync ()
Sekarang, ketika mengganti komponen sinkron level rendah dengan async, ini berdampak pada tumpukan penuh aplikasi. Karena async / menunggu memiliki dampak positif hanya jika digunakan "all up up", itu berarti tanda tangan dan nama metode setiap lapisan dalam aplikasi harus diubah.
Arsitektur yang baik sering melibatkan penempatan abstraksi di antara setiap lapisan, sehingga mengganti komponen tingkat rendah dengan yang lain tidak terlihat oleh komponen tingkat atas. Dalam C #, abstraksi mengambil bentuk antarmuka. Jika kami memperkenalkan komponen baru, level rendah, async, setiap antarmuka dalam tumpukan panggilan perlu dimodifikasi atau diganti oleh antarmuka baru. Cara masalah dipecahkan (async atau sinkronisasi) di kelas pelaksana tidak tersembunyi (abstrak) untuk penelepon lagi. Penelepon harus tahu apakah itu sinkron atau asinkron.
Bukankah async / menunggu praktik terbaik yang bertentangan dengan prinsip "arsitektur yang baik"?
Apakah ini berarti bahwa setiap antarmuka (katakanlah IEnumerable, IDataAccessLayer) memerlukan rekanan async mereka (IAsyncEnumerable, IAsyncDataAccessLayer) sedemikian rupa sehingga dapat diganti dalam tumpukan saat beralih ke dependensi async?
Jika kita mendorong masalah sedikit lebih jauh, bukankah akan lebih mudah untuk menganggap setiap metode sebagai async (untuk mengembalikan Tugas <> atau Janji <>), dan untuk metode untuk menyinkronkan panggilan async ketika sebenarnya tidak async? Apakah ini sesuatu yang diharapkan dari bahasa pemrograman masa depan?
CancellationToken
, dan mereka yang memang ingin menyediakan default). Menghapus metode sinkronisasi yang ada (dan secara proaktif memecah semua kode) jelas bukan starter.