ใช้ System.Tuple คลาสที่ออกแบบไม่ดีใหม่หรือไม่


19

ฉันชอบแนวคิดของ System.Tuple ซึ่งทำให้ฉันสามารถส่งคืนพารามิเตอร์หลาย ๆ ตัวในการเรียกใช้ฟังก์ชันเดียวโดยไม่ต้องสร้างคลาสใหม่ทันทีอย่างไรก็ตามสิ่งนี้ท้าทายการเขียนโปรแกรมที่ดีเช่น Microsoft Patterns & Practices, SOLID Principles เป็นต้น

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


+1: คำถามยอดเยี่ยม นอกจากนี้ - ฉันสงสัยว่า Anders Hejlsberg ชั่งน้ำหนักในเรื่องนี้หรือไม่
Jim G.

คำตอบ:


11

ปัญหาของการใช้Tupleคือพารามิเตอร์ประเภททั่วไปไม่ได้สื่อความหมาย

เพื่อความสามารถในการอ่านคุณอาจต้องการพิจารณาใช้คลาสที่กำหนดเองหรือแม้แต่ประเภทที่ไม่ระบุชื่อกับสมาชิกที่มีชื่อ


สิ่งที่เกี่ยวกับคำอธิบายพารามิเตอร์ XML? ไม่ใช่สถานที่ที่ชัดเจนที่สุดที่จะมอง แต่ดีกว่าไม่มีอะไร
John Bubriski

@SkippyFire - คุณหมายถึงอะไร? ทั้งหมดที่คุณได้รับคือประเภทของT1, T2ฯลฯ ไม่ได้บอกคุณในสิ่งที่พวกเขาหมายถึง
Oded

2
ฉันต้องพูดว่า: ทุกครั้งที่ฉัน (หรือใครบางคนในทีมของเรา) ใช้ Tuple เป็นประเภทฉันมักจะอ้างอิงกลับไปยังส่วนอื่น ๆ ในรหัสเพื่อจดจำสิ่งที่รายการ 1,. รายการ 2 ฯลฯ สำหรับทุกสิ่งที่ไม่น่ารำคาญให้สร้างคลาสที่ไม่ต่อเนื่อง ให้โอกาสตัวเองในอนาคตที่จะรู้ว่าคุณกำลังทำอะไรอยู่
Joe

@Oded ฉันกำลังพูดถึงการเพิ่มเอกสาร XML ให้กับวิธีการยอมรับ Tuple อีกครั้งไม่สมบูรณ์แบบ แต่ดีกว่าไม่มีอะไรถ้าคุณต้องการ / จำเป็นต้องใช้ Tuples
John Bubriski

1
@Oded พารามิเตอร์หรือค่าส่งคืนอาจไม่ถ่ายทอดความหมาย แต่ชื่อของวิธีการสามารถ สมมติว่าคุณมีวิธีการที่เรียกว่าผลตอบแทนGetTopTwoPercentages() Tuple<decimal, decimal>นั่นอาจจะชัดเจนเพียงพอ
John Bubriski

8

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

ชัดเจน

Tuple<Float, Float> getPolarCoords();

นี่คือการทำให้เข้าใจผิด (เพราะจะถือว่าพิกัดคาร์ทีเซียน):

Tuple<Float, Float> getCoords();

และนี่คือความหมายไร้:

Tuple<Float, Float> getTuple();

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

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