การออกแบบอินเตอร์เฟสและ async


9

สมมติว่าฉันได้สร้างส่วนต่อประสานที่IFolderRepositoryมีวิธีการดังนี้:

IEnumerable<Folder> GetAllFolders();
Folder GetFolderWithId(int id);
void AddFolder(Folder newFolder);
void ModifyFolder(Folder folderToModify, Folder folderAfterModification);
void RemoveFolder(Folder folderToRemove);

และฉันได้ดำเนินการและช่วยให้พูดDatabaseFolderRepository CacheFolderRepositoryDecoratorตอนนี้หลายร้อยสายต่อมา 'ผมอยากจะเพิ่ม SkyDrive โฟลเดอร์ functionallity SkyDriveFolderRepositoryดังนั้นฉันพร้อมที่จะเพิ่ม แต่น่าเสียดายที่ในขณะที่DatabaseFolderRepositoryการดำเนินการใช้วิธีการซิงโครที่จะพูดคุยกับฐานข้อมูล, SkyDrive หนึ่งใช้จำนวนมากและasync awaitจะทำอย่างไรในกรณีเช่นนี้? ในกรณีที่วิธีการทำเครื่องหมายเป็นโมฆะทำเครื่องหมายว่า async ไม่ใช่วิธีการแก้ปัญหา (จำเป็นต้องยกเว้นการจัดการ) ฉันควรเปลี่ยนอินเทอร์เฟซเพื่อส่งคืนTask<T>หรือไม่ แน่ใจว่ามันจะทำงานในตัวอย่างข้างต้น แต่พวกเขาเป็นเพียง 2 ชั้นเรียนการใช้งานอินเตอร์เฟซ หรืออินเทอร์เฟซส่วนใหญ่ของฉันควรมีTaskประเภทการส่งคืน (คุณไม่ต้องการกฎ)


ไม่เกี่ยวข้องกับคำถามของคุณ (ขออภัย) แต่ถ้าคุณมีIFolderส่วนต่อประสานทำไมคุณต้องพึ่งพาการใช้งานที่เป็นรูปธรรม ( Folder) ในทุกวิธีของคุณ?
Konrad Morawski

1
ผู้โทรของคุณคาดหวังอะไร API ที่คุณใช้นั้นเป็นไปตามรหัสข้อผิดพลาดข้อยกเว้นการโทรกลับหรืออะไร คุณเปลี่ยนได้ไหม
david.pfx

@ KonradMorawski มันเป็นตัวพิมพ์ผิด - ขอโทษ มันขึ้นอยู่กับข้อยกเว้นและฉันไม่สามารถเปลี่ยนได้
fex

คำตอบ:


10

คุณอาจพบบทความ MSDN นี้เกี่ยวกับแนวทางปฏิบัติแบบอะซิงโครนัสเพื่อการอ่านที่ดี

คุณถาม:

แต่น่าเสียดายที่ในขณะที่DatabaseFolderRepositoryการดำเนินการใช้วิธีการซิงโครที่จะพูดคุยกับฐานข้อมูล, SkyDrive หนึ่งใช้จำนวนมากและasyncawait

นี่คือที่ส่วนย่อยAsync All the Wayในบทความ MSDN ที่ฉันเชื่อมโยงจะเกี่ยวข้องกับสถานการณ์ของคุณ

โดยเฉพาะอย่างยิ่งมันเป็นความคิดที่ดีในการบล็อกรหัส async โดยการเรียก Task.Wait หรือ Task.Result นี่เป็นปัญหาที่พบบ่อยโดยเฉพาะอย่างยิ่งสำหรับโปรแกรมเมอร์ที่“ จุ่มนิ้วเท้า” ลงในการเขียนโปรแกรมแบบอะซิงโครนัสการแปลงเพียงส่วนเล็ก ๆ ของแอปพลิเคชันของพวกเขาและห่อมันใน synchronous API น่าเสียดายที่พวกเขาพบปัญหาเกี่ยวกับการหยุดชะงัก

เนื่องจากคุณมีอย่างน้อยหนึ่งอินเทอร์เฟซที่ต้องเป็นแบบอะซิงโครนัส YAGNI จึงถูกย้อนกลับ คุณมีจะต้องทำการเปลี่ยนแปลงเพื่อให้การเชื่อมต่อของคุณมีความสอดคล้องกัน ใช่มันจะสร้างความพยายามมากขึ้นสำหรับคุณ แต่ประโยชน์คือความเสี่ยงน้อยกว่าการหยุดชะงัก การดีบักที่ซับซ้อนน้อยกว่า และการบล็อกที่คาดการณ์ได้มากขึ้น (เมื่อจริง ๆ ต้องเกิดขึ้น)

ฉันข้ามคำถามอื่น ๆ ที่คุณถามเมื่อฉันคิดว่าฉันพูดหลักของคำถามของคุณ จัดการกับหลักและคำถามที่เหลือของคุณหายไป บทความนี้มีส่วนเกี่ยวข้องอย่างเป็นธรรมและกล่าวถึงประเด็นอื่น ๆ ที่คุณแจ้งมารวมถึงชี้ให้เห็นถึงข้อผิดพลาดเพิ่มเติม

การเขียนโปรแกรมแบบอะซิงโครนัสเป็นหนึ่งในสิ่งที่คุณต้องยอมรับแนวคิดทั้งหมดและไปกับมัน พยายามแค่ "จุ่มนิ้วเท้าของคุณ" ลงทีละน้อยกลายเป็นเรื่องที่ซับซ้อนมากขึ้นแล้วก็กระโดดเข้ามา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.