การอภิปรายล่าสุดในชุมชน TypeScript ได้จุดประกายการถกเถียงเกี่ยวกับแนวทางที่ดีที่สุดสำหรับการจัดการฟังก์ชันที่มีพารามิเตอร์เสริมหลายตัว การสนทนานี้มุ่งเน้นไปที่การใช้งาน keyword arguments แบบ Python ใน TypeScript แต่นักพัฒนาแบ่งออกเป็นสองฝ่ายว่าวิธีแก้ปัญหาที่เสนอมานั้นคุ้มค่ากับความซับซ้อนที่เพิ่มขึ้นหรือไม่
ปัญหาหลัก: การมีพารามิเตอร์มากเกินไป
ปัญหาเริ่มต้นขึ้นเมื่อฟังก์ชัน TypeScript เติบโตเกินกว่าลายเซ็นที่เรียบง่าย ในขณะที่ฟังก์ชันที่มีพารามิเตอร์หนึ่งหรือสองตัวยังคงจัดการได้ แต่การเพิ่มอาร์กิวเมนต์เสริมมากขึ้นจะสร้างปัญหาด้านการอ่าน นักพัฒนามักพบว่าตัวเองต้องส่งค่า undefined เพื่อข้ามพารามิเตอร์ก่อนหน้า ทำให้การเรียกใช้ฟังก์ชันเข้าใจยากและแก้ไขข้อผิดพลาดได้ยาก
บทความต้นฉบับเสนอให้ใช้ object destructuring พร้อมกับค่าเริ่มต้นเพื่อเลียนแบบ keyword arguments ของ Python แนวทางนี้เกี่ยวข้องกับการสร้าง options object เป็นพารามิเตอร์ตัวที่สอง ช่วยให้นักพัฒนาสามารถระบุเฉพาะอาร์กิวเมนต์ที่ต้องการตามชื่อได้
รูปแบบพารามิเตอร์ TypeScript ทั่วไป:
• ฟังก์ชันแบบง่าย: fn(arg1, arg2)
- สำหรับพารามิเตอร์ 1-2 ตัว
• ออบเจ็กต์ออปชัน: fn({ arg1, arg2, arg3, ... })
- สำหรับพารามิเตอร์หลายตัว
• แนวทางแบบผสม: fn(mainArg, { ...optionObject })
- พารามิเตอร์หลักบวกกับออปชัน
• สไตล์ Kwargs: fn(name, { prefix = "Hello", ending = "." }: { prefix?: string; ending?: string } = {})
- การ destructuring พร้อมกับ type annotations
ชุมชนต่อต้านความซับซ้อนของไวยากรณ์
อย่างไรก็ตาม นักพัฒนาหลายคนในชุมชนพบว่าวิธีแก้ปัญหานี้ซับซ้อนเกินไป การวิจารณ์หลักมุ่งเน้นไปที่ไวยากรณ์ที่ยาวเหยียดที่จำเป็นในส่วนการกำหนดฟังก์ชัน เพื่อให้ได้ความปลอดภัยของประเภทที่เหมาะสม นักพัฒนาต้องกำหนดโครงสร้างพารามิเตอร์สองครั้ง - ครั้งหนึ่งสำหรับ destructuring พร้อมค่าเริ่มต้น และอีกครั้งสำหรับ type annotation ของ TypeScript
ฉันไม่ชอบที่มันดูยุ่งเหยิงขนาดนั้น สิ่งที่ฉันทำคือ ถ้าฉันต้องการอาร์กิวเมนต์มากกว่าสองสามตัว ฉันจะรับเฉพาะ object เท่านั้น
ความรู้สึกนี้สะท้อนถึงความชอบที่กว้างขึ้นสำหรับทางเลือกที่เรียบง่ายกว่า นักพัฒนาหลายคนแนะนำว่าเมื่อฟังก์ชันต้องการพารามิเตอร์มากกว่าสองหรือสามตัว แนวทางที่ดีกว่าคือการรับ options object เดียวและจัดการค่าเริ่มต้นภายในตัวฟังก์ชัน
แนวทางทางเลือกได้รับความนิยม
การอภิปรายของชุมชนเผยให้เห็นรูปแบบที่ต้องการหลายแบบ ทางเลือกที่ได้รับความนิยมมากที่สุดคือการรับเฉพาะ options object สำหรับฟังก์ชันที่มีพารามิเตอร์หลายตัว จากนั้นแก้ไขค่าเริ่มต้นที่จุดเริ่มต้นของฟังก์ชัน แนวทางนี้แยกการกำหนดประเภทออกจากตรรกะค่าเริ่มต้น ทำให้โค้ดดูแลรักษาได้ง่ายขึ้น
นักพัฒนาบางคนสนับสนุนแนวทางที่เข้มงวดยิ่งขึ้น โดยตั้งคำถามว่าควรใช้ค่าเริ่มต้นในหลายกรณีหรือไม่ พวกเขาโต้แย้งว่าการบังคับให้นักพัฒนาระบุพารามิเตอร์ทั้งหมดอย่างชัดเจนจะนำไปสู่โค้ดที่เชื่อถือได้มากขึ้นและมีข้อผิดพลาดน้อยลงในการใช้งานจริง
การถกเถียงปรัชญาการออกแบบที่กว้างขึ้น
การอภิปรายขยายไปเกินกว่าความชอบด้านไวยากรณ์ไปสู่คำถามพื้นฐานเกี่ยวกับการออกแบบ API สมาชิกชุมชนบางคนเชื่อว่าการทำให้พารามิเตอร์ชัดเจน แม้จะยาวเหยียด จะนำไปสู่คุณภาพโค้ดที่ดีขึ้นและข้อผิดพลาดรันไทม์น้อยลง คนอื่นให้ความสำคัญกับประสบการณ์นักพัฒนาและความกระชับของโค้ด
การถกเถียงนี้เน้นย้ำถึงความท้าทายทั่วไปในการพัฒนา TypeScript : การสร้างสมดุลระหว่างความปลอดภัยของประเภท ความสามารถในการอ่าน และความสามารถในการดูแลรักษา ในขณะที่แนวทางแบบ kwargs ที่เสนอมาให้ประโยชน์บางอย่าง การตอบสนองของชุมชนแสดงให้เห็นว่าวิธีแก้ปัญหาที่เรียบง่ายมักพิสูจน์ได้ว่าใช้งานได้จริงมากกว่าในแอปพลิเคชันในโลกแห่งความจริง
การอภิปรายนี้แสดงให้เห็นว่าชุมชนภาษาโปรแกรมมิ่งพัฒนาแนวทางปฏิบัติที่ดีที่สุดของตนอย่างต่อเนื่อง โดยชั่งน้ำหนักการแลกเปลี่ยนระหว่างแนวทางต่าง ๆ ตามประสบการณ์จริงมากกว่าความสง่างามทางทฤษฎี
อ้างอิง: Python-style kwargs in TypeScript