Misalkan saya telah membuat antarmuka IFolderRepository
dengan metode seperti itu:
IEnumerable<Folder> GetAllFolders();
Folder GetFolderWithId(int id);
void AddFolder(Folder newFolder);
void ModifyFolder(Folder folderToModify, Folder folderAfterModification);
void RemoveFolder(Folder folderToRemove);
dan saya sudah menerapkan DatabaseFolderRepository
dan katakanlah CacheFolderRepositoryDecorator
. Sekarang 'ratusan baris kemudian' Saya ingin menambahkan fungsi folder SkyDrive jadi saya siap untuk menambahkan SkyDriveFolderRepository
. Sayangnya sementara DatabaseFolderRepository
implementasi menggunakan metode sinkron untuk berbicara dengan database, skydrive satu menggunakan banyak async
dan await
. Apa yang harus dilakukan dalam kasus seperti itu? Dalam kasus metode void menandainya async bukanlah solusi (perlu penanganan pengecualian). Haruskah saya mengubah antarmuka untuk kembali Task<T>
? Tentu itu akan bekerja dalam contoh di atas tetapi mereka hanya 2 kelas implementasi antarmuka. Atau haruskah sebagian besar antarmuka saya memiliki Task
tipe pengembalian (terhadap Anda tidak akan memerlukannya aturan)?
IFolder
antarmuka, mengapa Anda mengandalkan implementasi konkret (Folder
) dalam semua metode Anda?Jawaban:
Anda mungkin akan menemukan artikel MSDN ini tentang praktik Asynchronous sebagai bacaan yang baik.
Kamu bertanya:
Di sinilah sub-bagian
Async All the Way
dalam artikel MSDN yang saya tautkan terkait dengan situasi Anda.Karena Anda memiliki setidaknya satu antarmuka yang perlu disinkronkan, YAGNI dibalik. Anda yang akan perlu untuk melakukan perubahan sehingga antarmuka Anda konsisten. Ya, itu akan menciptakan lebih banyak upaya di depan untuk Anda. Tetapi manfaatnya adalah risiko kebuntuan yang lebih sedikit; debugging yang kurang rumit; dan lebih banyak pemblokiran yang dapat diprediksi (saat itu sebenarnya perlu terjadi).
Saya melewatkan beberapa pertanyaan lain yang Anda tanyakan karena saya pikir saya menjawab inti dari pertanyaan Anda. Berurusan dengan inti dan sisa pertanyaan Anda hilang. Artikel ini cukup terlibat dan membahas poin-poin lain yang Anda kemukakan serta menunjukkan perangkap tambahan.
Pemrograman asinkron adalah salah satu di mana Anda harus merangkul seluruh konsep dan hanya pergi dengannya. Mencoba untuk hanya "mencelupkan jari kaki ke dalam" sedikit demi sedikit berakhir menjadi jauh lebih rumit daripada hanya melompat langsung.
sumber