Piszę rodzaj implementacji kolejki, która ma TryDequeuemetodę używającą wzorca podobnego do różnych TryParsemetod .NET , w której zwracam wartość logiczną, jeśli akcja się powiodła, i używam outparametru do zwrócenia rzeczywistej wartości kolejkowania.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Teraz lubię unikać parametrów, outkiedy tylko mogę. C # 7 daje nam zmienne delcarations, aby ułatwić sobie z nimi pracę, ale nadal uważam params za bardziej konieczne zło niż przydatne narzędzie.
Zachowanie, którego chcę od tej metody, jest następujące:
- Jeśli jest element do usunięcia z pudełka, zwróć go.
- Jeśli nie ma elementów do usunięcia z kolejki (kolejka jest pusta), przekaż dzwoniącemu wystarczającą ilość informacji, aby działać poprawnie.
- Nie zwracaj tylko pustego przedmiotu, jeśli nie ma już żadnych przedmiotów.
- Nie rzucaj wyjątku, jeśli próbujesz usunąć kolejkę z pustej kolejki.
W tej chwili program wywołujący tę metodę prawie zawsze używał wzoru podobnego do następującego (używając składni zmiennej C # 7 out):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Co nie jest najgorsze. Ale nic nie mogę poradzić, ale czuję, że mogą istnieć lepsze sposoby na to (jestem całkowicie skłonny przyznać, że może nie być). Nienawidzę tego, jak osoba dzwoniąca musi zerwać swój przepływ z warunkiem, gdy wszystko, czego chce, to uzyskać wartość, jeśli taka istnieje.
Jakie są inne wzorce, które pozwalają osiągnąć to samo „próbowanie”?
W kontekście, ta metoda może być potencjalnie wywoływana w projektach VB, więc punkty bonusowe za coś, co działa dobrze w obu. Ten fakt powinien jednak mieć niewielką wagę.
Option<T>strukturę i zwróć ją. Tebool Try(..., out data)funkcje są obrzydliwością.