Tôi đang viết một kiểu triển khai Hàng đợi có một TryDequeue
phương thức sử dụng một mẫu tương tự như các TryParse
phương thức .NET khác nhau , trong đó tôi trả về giá trị boolean nếu hành động thành công và sử dụng một out
tham số để trả về giá trị bị mất thực tế.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Bây giờ, tôi muốn tránh out
params bất cứ khi nào tôi có thể. C # 7 cung cấp cho chúng tôi các phương tiện biến đổi khác nhau để làm việc với chúng dễ dàng hơn, nhưng tôi vẫn xem xét các thông số cần thiết hơn là một công cụ hữu ích.
Hành vi tôi muốn từ phương pháp này như sau:
- Nếu có một mục để dequeue, trả lại nó.
- Nếu không có mục nào để dequeue (hàng đợi trống), hãy cung cấp cho người gọi đủ thông tin để hành động phù hợp.
- Đừng chỉ trả lại một mục rỗng nếu không còn mục nào.
- Đừng ném một ngoại lệ nếu cố gắng giải quyết từ một hàng đợi trống.
Ngay bây giờ, một người gọi phương thức này hầu như sẽ luôn sử dụng một mẫu như sau (sử dụng cú pháp biến C # 7 out):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Đó không phải là điều tồi tệ nhất, tất cả đã nói. Nhưng tôi không thể không cảm thấy có nhiều cách tốt hơn để làm điều này (tôi hoàn toàn sẵn sàng thừa nhận rằng có thể không có). Tôi ghét cách người gọi phải phá vỡ dòng chảy của nó với một điều kiện khi tất cả những gì nó muốn là nhận được một giá trị nếu có.
Một số mô hình khác tồn tại để thực hiện hành vi "thử" này là gì?
Đối với ngữ cảnh, phương thức này có thể có khả năng được gọi trong các dự án VB, vì vậy điểm thưởng cho thứ gì đó hoạt động tốt trong cả hai. Thực tế này nên mang rất ít trọng lượng, mặc dù.
Option<T>
cấu trúc và trả lại nó. Nhữngbool Try(..., out data)
chức năng đó là một sự gớm ghiếc.