TryDequeue다양한 .NET TryParse메소드 와 유사한 패턴을 사용 하는 메소드 가있는 큐 구현 유형을 작성 중입니다. 여기서 조치가 성공하면 부울 값 out을 리턴하고 매개 변수를 사용 하여 실제 큐에 넣은 값을 리턴하십시오.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
이제 out가능할 때마다 매개 변수 를 피하고 싶습니다 . C # 7을 사용하면 변수를 쉽게 제거 할 수있는 다양한 분리가 가능하지만, 여전히 유용한 도구보다 매개 변수가 필요한 악을 더 고려합니다.
이 방법에서 원하는 동작은 다음과 같습니다.
- 대기열에 넣을 품목이 있으면 반품하십시오.
- 대기열에서 비울 항목이 없으면 발신자에게 적절한 조치를 취하기에 충분한 정보를 제공하십시오.
- 남은 항목이 없으면 null 항목 만 반환하지 마십시오.
- 빈 대기열에서 대기열을 해제하려고 할 때 예외를 던지지 마십시오.
현재이 메소드의 호출자는 거의 항상 다음과 같은 패턴을 사용합니다 (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)기능은 혐오입니다.