นิยมใช้ crate ขนาดเล็ก (Prefer small crates)
คำอธิบาย
นิยมเลือกใช้ crate ขนาดเล็กที่มีหน้าที่เฉพาะเจาะจงและทำงานสิ่งนั้นได้อย่างยอดเยี่ยม
ระบบ Cargo และ crates.io ช่วยให้การติดตั้งและจัดการไลบรารีภายนอกทำได้อย่างง่ายดายและสะดวกสบายกว่าภาษาอย่าง C หรือ C++ เป็นอย่างมาก ยิ่งไปกว่านั้น เนื่องจากแพ็กเกจที่เผยแพร่บน crates.io จะไม่สามารถถูกแก้ไขหรือลบออกได้ การบิลด์โปรเจกต์ใดๆ ที่ทำงานได้ในปัจจุบันจึงได้รับการรับประกันว่าจะยังคงคอมไพล์ผ่านได้ในอนาคตเสมอ เราจึงควรใช้ประโยชน์จากระบบนิเวศนี้ด้วยการแบ่งแยก dependency ให้มีขนาดเล็กและมีความละเอียดเฉพาะทางมากยิ่งขึ้น
ข้อดี
- Crate ขนาดเล็กทำความเข้าใจได้ง่ายกว่า และช่วยส่งเสริมให้โค้ดมีความเป็นโมดูลสูง
- Crate ช่วยอำนวยความสะดวกในการนำโค้ดกลับมาใช้ซ้ำข้ามโปรเจกต์ ตัวอย่างเช่น crate
urlถูกพัฒนาขึ้นมาเพื่อเป็นส่วนหนึ่งของเว็บบราวเซอร์เอนจิน Servo แต่ในเวลาต่อมากลับได้รับการนำไปใช้งานอย่างกว้างขวางภายนอกโปรเจกต์ดังกล่าว - เนื่องจากหน่วยการคอมไพล์ของ Rust คือระดับ crate การแยกโปรเจกต์ออกเป็นหลายๆ crate ย่อยจึงช่วยให้คอมไพเลอร์สามารถบิลด์โค้ดแบบขนาน (parallel compilation) ได้รวดเร็วยิ่งขึ้น
ข้อเสีย
- อาจนำไปสู่ภาวะ “dependency hell” ได้ เมื่อโปรเจกต์ต้องพึ่งพา crate เดียวกันแต่ต่างเวอร์ชันและขัดแย้งกันในเวลาเดียวกัน ตัวอย่างเช่น crate
urlมีทั้งเวอร์ชัน 1.0 และ 0.5 ซึ่งชนิดข้อมูลUrlจากurl:1.0และurl:0.5ถือเป็นคนละชนิดกันโดยสิ้นเชิง ส่งผลให้ HTTP client ที่เรียกใช้url:0.5จะไม่สามารถรับค่าUrlที่สร้างขึ้นจาก Web Scraper ที่อิงกับurl:1.0ได้ - แพ็กเกจบน crates.io ไม่ได้ผ่านการคัดกรองหรือรับรองอย่างเป็นทางการ ดังนั้น crate บางตัวอาจเขียนขึ้นมาไม่ดี มีเอกสารประกอบไม่ครบถ้วน หรืออาจแฝงโค้ดที่ไม่ปลอดภัย
- Crate ขนาดเล็ก 2 ตัวอาจได้รับการ optimize รวมกันได้น้อยกว่า crate ขนาดใหญ่เพียงตัวเดียว เนื่องจากคอมไพเลอร์ไม่ได้เปิดใช้งาน Link-Time Optimization (LTO) เป็นค่าเริ่มต้น
ตัวอย่าง
crate url ให้เครื่องมือและฟังก์ชันสำหรับการจัดการกับ URL
crate num_cpus ให้ฟังก์ชันสำหรับตรวจสอบจำนวน CPU บนเครื่อง
crate ref_slice ให้ฟังก์ชันสำหรับการแปลง &T ไปเป็น &[T] (ตัวอย่างเชิงประวัติศาสตร์)