Я пишу тип реализации Queue, в котором есть TryDequeue
метод, который использует шаблон, аналогичный различным TryParse
методам .NET , где я возвращаю логическое значение, если действие выполнено успешно, и использую out
параметр для возврата фактического значения в очереди.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Теперь я люблю избегать out
параметров, когда могу. C # 7 выдает нам переменные делкарации, чтобы упростить работу с ними, но я все же считаю параметры скорее необходимым злом, чем полезным инструментом.
Поведение, которое я хочу от этого метода, следующее:
- Если есть предмет для удаления из очереди, верните его.
- Если нет элементов для удаления из очереди (очередь пуста), предоставьте вызывающей стороне достаточно информации, чтобы действовать соответствующим образом.
- Не просто возвращайте нулевой элемент, если ничего не осталось.
- Не выбрасывайте исключение, если пытаетесь удалить из пустой очереди.
Прямо сейчас вызывающая сторона этого метода почти всегда использует шаблон, подобный следующему (используя синтаксис переменной C # 7 out):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Что не самое худшее, все сказали. Но я не могу помочь, но чувствую, что могут быть более хорошие способы сделать это (я полностью готов признать, что не может быть). Я ненавижу, как вызывающий должен разбить свой поток на условные, когда все, что он хочет, это получить значение, если оно существует.
Какие существуют другие паттерны, способствующие такому же «пробному» поведению?
Для контекста этот метод потенциально может быть вызван в проектах VB, так что бонусные баллы за то, что хорошо работает в обоих. Этот факт должен иметь очень небольшой вес, хотя.
Option<T>
структуру и верните ее. Этиbool Try(..., out data)
функции - мерзость.