ฉันกำลังเขียนการใช้ Queue ประเภทที่มีTryDequeue
วิธีการที่ใช้รูปแบบคล้ายกับTryParse
วิธีการ. NET ต่าง ๆซึ่งฉันส่งคืนค่าบูลีนหากการดำเนินการสำเร็จและใช้out
พารามิเตอร์เพื่อส่งคืนค่าที่ถูกตัดจริง
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
ตอนนี้ฉันชอบหลีกเลี่ยงout
params ทุกครั้งที่ทำได้ C # 7 ทำให้เรามีตัวแปรต่าง ๆ เพื่อให้การทำงานกับมันง่ายขึ้น แต่ฉันยังคงพิจารณาถึงความชั่วร้ายที่จำเป็นมากกว่าเครื่องมือที่มีประโยชน์
พฤติกรรมที่ฉันต้องการจากวิธีนี้มีดังนี้:
- หากมีรายการที่จะ dequeue คืนมัน
- หากไม่มีรายการที่จะถอน (คิวว่างเปล่าให้ผู้โทรมีข้อมูลเพียงพอที่จะดำเนินการอย่างเหมาะสม
- อย่าเพิ่งส่งคืนรายการที่ไม่มีค่าหากไม่มีรายการที่เหลืออยู่
- อย่าโยนข้อยกเว้นหากพยายาม dequeue จากคิวที่ว่างเปล่า
ตอนนี้ผู้เรียกใช้เมธอดนี้มักจะใช้รูปแบบดังต่อไปนี้ (โดยใช้ไวยากรณ์ตัวแปร 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)
ฟังก์ชั่นเหล่านั้นเป็นสิ่งที่น่ารังเกียจ