Saya menulis jenis implementasi Antrian yang memiliki TryDequeue
metode yang menggunakan pola yang mirip dengan berbagai TryParse
metode .NET , di mana saya mengembalikan nilai boolean jika tindakan berhasil, dan menggunakan out
parameter untuk mengembalikan nilai dequeued aktual.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Sekarang, saya suka menghindari out
params kapan pun saya bisa. C # 7 memberi kita delcarations variabel untuk membuatnya bekerja lebih mudah, tapi saya masih menganggap params lebih dari kejahatan yang diperlukan daripada alat yang berguna.
Perilaku yang saya inginkan dari metode ini adalah sebagai berikut:
- Jika ada item yang harus didekor, kembalikan.
- Jika tidak ada item yang harus di-dequeue (antrian kosong), berikan pemanggil informasi yang cukup untuk bertindak dengan tepat.
- Jangan hanya mengembalikan item nol jika tidak ada item yang tersisa.
- Jangan melemparkan pengecualian jika mencoba keluar dari antrian kosong.
Saat ini, pemanggil metode ini hampir selalu menggunakan pola seperti berikut (menggunakan sintaks variabel C # 7):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Yang bukan yang terburuk, semua diceritakan. Tetapi saya merasa bahwa mungkin ada cara yang lebih baik untuk melakukan ini (saya benar-benar mau mengakui bahwa mungkin tidak ada). Aku benci bagaimana penelepon harus memecah alirannya dengan syarat ketika semua yang diinginkannya adalah mendapatkan nilai jika ada.
Apa beberapa pola lain yang ada untuk mencapai perilaku "coba" yang sama?
Untuk konteks, metode ini berpotensi disebut dalam proyek VB, jadi poin bonus untuk sesuatu yang berfungsi baik di keduanya. Namun, fakta ini seharusnya memiliki bobot yang sangat kecil.
Option<T>
struct dan kembalikan.bool Try(..., out data)
Fungsi - fungsi itu adalah kekejian.