Setelah C # 5 memperkenalkan async
dan await
memodelkan untuk pemrograman asinkron, komunitas C # tiba pada konvensi penamaan untuk menambahkan akhiran "Async" ke metode yang mengembalikan tipe yang ditunggu, seperti ini:
interface Foo
{
Task BarAsync();
}
Banyak penganalisa kode statis (baik berbasis Roslyn dan non-Roslyn) sejak itu ditulis bergantung pada konvensi penamaan ini ketika mendeteksi bau kode di sekitar pemrograman asinkron.
Sekarang C # 8 telah memperkenalkan konsep enumerables asynchronous, yang sendiri tidak dapat ditunggu tetapi dapat digunakan bersamaan await foreach
, tampaknya ada dua opsi untuk metode penamaan yang kembali IAsyncEnumerable
:
interface Foo
{
// No "Async" suffix, indicating that the return value is not awaitable.
IAsyncEnumerable<T> Bar<T>();
}
atau
interface Foo
{
// With "Async" suffix, indicating that the overall logic is asynchronous.
IAsyncEnumerable<T> BarAsync<T>();
}
Apakah ada pedoman konvensi penamaan yang definitif (dari tim bahasa C #, .NET Foundation, atau pihak berwenang lainnya) mengenai opsi di atas, seperti bagaimana konvensi penamaan C # 5 distandarisasi dengan jelas dan tidak diserahkan kepada penilaian programmer berdasarkan pendapat?
async
dan gunakanawait
di dalam), dan sampelAsync
akhiran untuk metode yang kembaliIAsyncEnumerable
, misalnya ChannelReader.ReadAllAsync . Dalam kasus lain, misalnya dalam EF Core,AsAsyncEnumerable()
digunakan yang sudah jelasJawaban:
Tidak ada pedoman yang lebih baik daripada apa yang sudah dilakukan oleh tim .NET :
IAsyncEnumerable<T>
IAsyncEnumerable
dengan memanggil AsAsyncEnumerable ()IAsyncEnumerable
sSystem.Linq.Async
mempertahankan nama mereka. Tidak adaSelectAsync
atauSelectAsAsyncEnumerable
, adilSelect
.Dalam semua kasus, jelas apa hasil dari metode ini. Dalam semua kasus, hasil dari metode harus ditunggu
await foreach
sebelum mereka dapat digunakan.Jadi pedoman sebenarnya tetap sama - pastikan namanya membuat perilaku jelas :
AsAsyncEnumerable()
atauToAsyncEnumerable()
, tidak perlu menambahkan akhiran apa pun.Async
akhiran agar pengembang tahu mereka perluawait foreach
hasilnya.Penganalisa kode dan generator tidak terlalu peduli dengan nama metode, mereka mendeteksi bau dengan memeriksa kode itu sendiri. Sebuah analisa kode akan memberitahu Anda bahwa Anda lupa untuk menunggu Tugas atau
await foreach
sebuahIAsyncEnumerable
tidak peduli bagaimana Anda memanggil metode dan variabel. Generator cukup menggunakan refleksi untuk memeriksaIAsyncEnumerable
dan memancarkanawait foreach
Ini adalah gaya analisis yang memeriksa nama-nama. Tugas mereka adalah memastikan kode menggunakan gaya yang konsisten sehingga pengembang dapat memahami kode tersebut. Penganalisis gaya akan memberi tahu Anda bahwa suatu metode tidak mengikuti gaya yang Anda pilih. Gaya itu bisa menjadi panduan gaya tim atau yang umum diterima.
Dan tentu saja, semua orang tahu awalan umum untuk bidang instance pribadi adalah
_
:)sumber
ChannelReader.ReadAllAsync
contohnya. Karena ini datang langsung dari tim .NET, sulit untuk salah mengikuti.Ini bukan metode async, jadi nama tidak boleh diakhiri dengan 'Async'. Suffix metode itu adalah konvensi untuk memperjelas bahwa metode itu harus ditunggu, atau hasilnya ditangani sebagai Tugas.
Saya pikir nama yang mengembalikan koleksi normal adalah tepat. GetFoos (), atau serupa.
sumber
Async
suffix. Sufiks digunakan dalam .NET Core sendiri: ChannelReader.ReadAllAsync mengembalikan IAsyncEnumerable. SebuahIAsyncEnumerable
harus digunakan denganawait foreach
, sehingga akhiran masuk akal.Async suffix dan bahkan kata kunci
async
hanya boilerplate, tidak ada artinya selain beberapa argumen keterbelakangan. C # memiliki semua informasi untuk membedakan fungsi-fungsi itu sama seperti perbedaanyield
dalam metode yang kembaliIEnumerable
, karena Anda tahu Anda tidak perlu menambahkan sesuatu sepertienumerable
atau beberapa kata kunci lain pada metode tersebut.Anda perlu menambahkan akhiran Async hanya karena C # akan mengeluh tentang kelebihan, jadi pada dasarnya keduanya sama dan mereka melakukan hal yang sama dengan semua aturan polimorfisme (jika kita tidak memperhitungkan faktor manusia dari perilaku yang merusak secara intenasional):
Tetapi Anda tidak dapat menulisnya seperti ini karena kompilator akan mengeluh. Tapi hey! Ini akan menelan monstrositas yang satu ini:
dan bahkan ini:
Jadi ini dia. Anda menambahkan Async hanya untuk menghentikan kompiler untuk mengeluh. Bukan untuk mengklarifikasi hal-hal. Bukan untuk membuat mereka lebih baik. Jika tidak ada keluhan - tidak ada alasan untuk menambahkannya, maka dalam kasus Anda, saya akan menghindari ini, kecuali jika itu terjadi
Task<IAsyncEnumerable>
.PS: Hanya untuk lebih memahami seluruh gambar di sini - jika suatu saat nanti seseorang menambahkan ekstensi metode komputer C # (fantazy, huh) yang akan beroperasi dalam paradigma yang berbeda, kita mungkin akan membutuhkan akhiran lain seperti Quant atau sesuatu, karena C # akan mengeluh sebaliknya. Ini akan menjadi metode yang sama persis tetapi itu akan bekerja dengan cara lain. Seperti halnya polimorfisme. Sama seperti antarmuka lakukan.
sumber