TryDequeue
さまざまな.NET TryParse
メソッドに似たパターンを使用するメソッドを持つタイプのQueue実装を記述していout
ます。アクションが成功した場合はブール値を返し、パラメーターを使用して実際のデキューされた値を返します。
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
今、私out
はできる限りparams を避けるのが好きです。C#7では、変数のデリケートが提供され、それらの操作が簡単になりますが、paramsは有用なツールよりも必要な悪であると考えています。
このメソッドに必要な動作は次のとおりです。
- デキューするアイテムがあれば、それを返します。
- デキューするアイテムがない場合(キューが空の場合)、適切に機能するのに十分な情報を発信者に提供します。
- アイテムが残っていない場合、nullアイテムを返すだけではいけません。
- 空のキューからデキューしようとしても例外をスローしないでください。
現在、このメソッドの呼び出し元は、ほとんど常に次のようなパターンを使用します(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)
機能は憎悪です。