Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

นิยมใช้ 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] (ตัวอย่างเชิงประวัติศาสตร์)

ดูเพิ่มเติม