İşlem başarılı olursa boole değeri döndürdüğüm, TryDequeueçeşitli .NET TryParseyöntemlerine benzer bir kalıp kullanan bir yönteme sahip bir tür Queue uygulaması yazıyorum outve fiili boşaltılmış değeri döndürmek için bir parametre kullanıyorum .
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Şimdi, outne zaman mümkün olursa paramlardan kaçınmayı seviyorum . C # 7, onlarla çalışmayı kolaylaştırmak için bize değişken sınırlamalar veriyor, ancak params'leri yararlı bir araçtan daha gerekli bir kötülükten daha çok düşünüyorum.
Bu yöntemden istediğim davranış aşağıdaki gibidir:
- Çıkarılacak bir öğe varsa, onu iade edin.
- Temizlenecek bir öğe yoksa (sıra boş), arayan kişiye uygun şekilde davranması için yeterli bilgiyi sağlayın.
- Kalan öğe yoksa, yalnızca boş bir öğeyi döndürmeyin.
- Boş bir sıradan ayrılmaya çalışıyorsanız, bir istisna atmayın.
Şu anda, bu yöntemin bir arayanı hemen hemen her zaman aşağıdaki gibi bir kalıp kullanır (C # 7 çıkış değişkenini kullanarak):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
En kötüsü değil, hepsi söyledi. Ama yardım edemem ama bunu yapmanın daha güzel yolları olabileceğini hissediyorum (olamayacağını kabul etmeye tamamen istekliyim). Arayanın nasıl ayrılması gerektiğinden nefret ediyorum, eğer varsa tek istediği bir değer elde etmek istediğinde koşullu bir akış.
Bu aynı "denemek" davranışını gerçekleştirmek için var olan diğer bazı desenler nelerdir?
Bağlam için, bu yöntem potansiyel olarak VB projelerinde çağrılabilir, bu nedenle her ikisinde de işe yarayan bir şey için bonus Puan. Bu gerçek olsa da, çok az ağırlık taşımalıdır.
Option<T>yapı tanımlayın ve geri döndürün. Bubool Try(..., out data)işlevler bir tükenmedir.