我正在编写一种类型为Queue的实现,该实现的TryDequeue
方法使用与各种.NET TryParse
方法类似的模式,如果操作成功,我将在其中返回一个布尔值,并使用一个out
参数来返回实际出列的值。
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
现在,我想尽可能避免使用out
params。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)
功能令人讨厌。