ส่งคืนอินเตอร์เฟสหรือคลาส


9

สมมติว่าฉันมีวิธี

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

ฉันได้อ่านว่ามันจะดีกว่าที่จะกลับมาอินเตอร์เฟซ (อย่างใดอย่างหนึ่งIListหรือIEnumerable) Listเมื่อเทียบกับกลับ ข้อโต้แย้งบางประการที่ฉันเคยได้ยินเกี่ยวกับการทำเช่นนั้นคือมันซ่อนข้อมูลและให้ความยืดหยุ่นแก่นักพัฒนา API ในการเปลี่ยนการแสดงข้อมูลภายในในภายหลัง

ความกังวลของฉันเกี่ยวกับการส่งคืนIEnumerableคือคุณสูญเสียฟังก์ชันการทำงานเช่นการเข้าถึงแบบสุ่มและCountคุณสมบัติ

ฉันรู้ว่าการยอมรับIEnumerableพารามิเตอร์เป็นสิ่งที่สมเหตุสมผลเนื่องจากทำให้ผู้บริโภคมีความยืดหยุ่นที่ดีที่สุดในการส่งข้อมูลไปยังวิธีการของฉันซึ่งเป็นข้อกำหนดที่เรียบง่ายสำหรับวิธีการใช้งาน

แนวปฏิบัติที่ดีที่สุดสำหรับประเภทส่งคืนคืออะไร


5
สำคัญกว่านั้น: ใช้อินเทอร์เฟซเป็นชนิดพารามิเตอร์
Michael Borgwardt

คำตอบ:


10

โดยทั่วไปแล้วคุณอาจเริ่มต้นด้วยส่วนต่อประสานและย้ายเฉพาะประเภทคอนกรีตเป็นประเภทส่งคืนหากคุณพบว่าคุณใช้วิธีการพิเศษมากกว่าที่คาดไว้

ถ้าคุณกลับอินเตอร์เฟซคุณจะมีความยืดหยุ่นมากขึ้น คุณสามารถเปลี่ยนการใช้งานในภายหลังเพื่อส่งคืนชนิดคอนกรีตที่แตกต่างกัน ในทางกลับกันจะทำให้ผู้โทรมีข้อมูลน้อยลงอย่างชัดเจนดังนั้นจึงอาจไม่สามารถดำเนินการบางอย่างได้ (ตัวอย่างเช่น: หากคุณกลับมาList<T>ผู้เรียกสามารถใช้ ConvertAll และอื่น ๆ ... ซึ่งพวกเขาไม่สามารถทำได้ถ้าคุณเพียง แต่ประกาศว่าคุณกลับมาIList<T>) ในบางสถานการณ์มันก็คุ้มค่าที่จะระบุประเภทที่เป็นรูปธรรม

เกี่ยวกับวิธีนับหรือเรียงลำดับไม่มีอินเทอร์เฟซการรวบรวมมาตรฐานสำหรับสิ่งนั้น อย่างไรก็ตามคุณสามารถเขียนวิธีการขยายเพื่อเรียงลำดับหรือนับ IList ใด ๆ


ฉันเดาว่านี่ไม่ใช่กฎที่ยากจริงๆใช่ไหม
แมทธิว

ใช่มันขึ้นอยู่กับการใช้งาน
Yusubov

1

หากคุณจำเป็นต้องมีคอลเลกชันของคุณมีCountคุณสามารถใช้ICollection<T>ซึ่งเพียงพอทั่วไป


-1 Count ได้พูดคุยกันแล้วและคำตอบนี้ไม่ได้เพิ่มอะไรใหม่
superM

@ Konrad Rudolph นี่ไม่ใช่คำตอบมันเป็นความคิดเห็น
superM

@superM มันมีค่ามากพอที่จะทำบุญกับคำตอบของตัวเองฉันคิดว่าเพราะมันพูดถึงเหตุผลของ OP อย่างชัดเจนในการตัดสินใจเลือกอินเตอร์เฟสในตอนแรก
Konrad Rudolph

1

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


1

วิธีการตัวอย่างที่เฉพาะเจาะจง: คุณถูกต้องว่าการส่งคืนIEnmuerable<T>หมายความว่าคุณจะสูญเสียฟังก์ชันการทำงานCountและการจัดทำดัชนี (แม้ว่าคุณจะสามารถใช้วิธี LINQ Count()และElementAt()ใช้งานได้อย่างมีประสิทธิภาพหากประเภทที่ใช้จริงใช้IList<T>)

หากคุณกลับมาIList<T>คุณจะสูญเสียฟังก์ชันการทำงานบางอย่าง แต่การได้รับประโยชน์โดยทั่วไปอาจคุ้มค่า

แต่สิ่งที่ดีกว่านั้นคือสิ่งระหว่างIEnumerable<T>และIList<T>เพราะส่วนใหญ่แล้วจะไม่สมเหตุสมผลสำหรับผู้บริโภคในการกลายพันธุ์คอลเลกชันที่ส่งคืน แต่มันก็สมเหตุสมผลสำหรับเขาที่จะใช้Countหรือจัดทำดัชนี

ในสุทธิ 4.5 IReadOnlyList<T>มีอินเตอร์เฟซที่ดังกล่าว


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