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