ประเภทใน Ruby 3 - ขอแนะนำ RBS ภาษาใหม่สำหรับการกำหนดประเภท
(developer.squareup.com)ตั้งแต่ Ruby 3 เป็นต้นไป จะมีการเพิ่ม Type Annotation แบบเดียวกับ TypeScript เข้ามา บทความนี้อธิบายว่า Matz และทีม Ruby Committer มีแนวคิดอย่างไรในการนำ static type เข้ามาสู่ Ruby และใช้แนวทางใดในการแก้ปัญหา โดยด้านล่างคือสรุป
ใน Ruby 3 มีการเพิ่มภาษาใหม่ชื่อ RBS และมาพร้อมกับ Ruby 3
RBS เป็นภาษาสำหรับ Type Annotation ของ Ruby
- ที่มาของการนำมาใช้
( แปล untype เป็น dynamic type )
ประเภทและ dynamic type เป็นข้อถกเถียงที่มีมาอย่างยาวนานในภาษาการเขียนโปรแกรม โดย dynamic type ช่วยให้พัฒนาได้รวดเร็ว แต่มีปัญหาเมื่อขยายทีมและ code base ส่วนประเภทนั้นเหมาะกับระบบขนาดใหญ่ แต่มีความยืดหยุ่นน้อยกว่า
เพื่อให้ได้ข้อดีของทั้งสองแนวทาง C# จึงมีฟีเจอร์ dynamic ที่เลื่อนการตรวจสอบประเภทไปจนถึง runtime, PHP และ Python มีตัวเลือกสำหรับการตรวจสอบประเภท ส่วน TypeScript เลือกใช้ภาษาประเภทที่สร้างขึ้นสำหรับภาษาที่เดิมไม่ได้ระบุประเภทไว้
Ruby จึงสร้างภาษาแยกแยะประเภทมาตรฐานอย่าง RBS ขึ้นมาเพื่อให้ได้ข้อดีของทั้งสองแบบ
- RBS มีหน้าตาอย่างไร?
RBS คล้ายกับ .h ของ C/C++/ObjC หรือ .d.ts ของ TypeScript ข้อดีของแนวทางนี้คือ สามารถรับประโยชน์จากการตรวจสอบประเภทได้โดยไม่ต้องแก้ไขไฟล์ Ruby ที่มีอยู่เดิม
ใน RBS มีการนิยามคุณสมบัติของคลาสและประเภทของเมธอด RBS เป็นภาษาที่ใช้อธิบายโครงสร้างของโปรแกรม Ruby และให้ภาพรวมของโค้ด รวมถึงคลาสและเมธอดที่นิยามไว้แก่ผู้พัฒนา ข้อดีที่ใหญ่ที่สุดคือ สามารถตรวจสอบนิยามรูปแบบได้ทั้งในส่วนของ implementation และการทำงานจริง
- ความสามารถหลักของ RBS
การพัฒนาระบบประเภทสำหรับภาษา dynamic นั้นแตกต่างจากภาษาที่มี static type อยู่แล้ว ในโลกนี้มีโค้ด Ruby อยู่เป็นจำนวนมาก และระบบประเภทสำหรับ Ruby จำเป็นต้องรองรับโค้ดให้ได้มากที่สุดเท่าที่จะทำได้
ดังนั้นจึงมีการแนะนำคุณลักษณะสำคัญสองประการของโค้ด Ruby และวิธีที่ RBS ใช้แก้ปัญหา
- Duck Typing
Duck typing คือเทคนิคการเขียนโดยไม่รู้ประเภทแน่ชัด แต่คาดว่าต้องมีเมธอดบางอย่างอยู่ RBS รองรับแนวทางนี้ด้วยการนำ interface เข้ามา ทำให้สามารถตรวจสอบได้ว่าอาร์กิวเมนต์มีเมธอดนั้นหรือไม่
- ความไม่สม่ำเสมอ
นี่คืออีกแพตเทิร์นหนึ่งของโค้ดที่ทำให้นิพจน์สามารถมีค่าจากหลายประเภทที่ต่างกันได้ ซึ่งเป็นแนวทางที่นิยมใน Ruby เช่นกัน และ RBS ก็รองรับสิ่งนี้ผ่าน union type และ method overload
- การเขียนโปรแกรม Ruby ร่วมกับประเภท
แนะนำข้อดีหลักของ RBS
-
ค้นพบบั๊กได้มากขึ้น
-
ความปลอดภัยของ
nil -
การทำงานร่วมกับ IDE ที่ดีกว่าเดิม
-
แนวทางสำหรับ Duck Typing
3 ความคิดเห็น
https://crystal-lang.org - น่าสนใจว่าคริสตัลจะวางความสัมพันธ์กับ RBS อย่างไร (Crystal เป็นภาษาแบบคอมไพล์ที่ยืมไวยากรณ์ของ Ruby มาใช้)
; m; เนื้อหาถูกตัดกลางทางอยู่เรื่อย ๆ เลยลบโค้ดทั้งหมดออกแล้วครับ/ค่ะ ต้องขออภัยที่กลายเป็นสแปมโดยไม่ตั้งใจ T_T..
อ๊ะ น่าจะเป็นเพราะมี `