จำกัดขอบเขตความไม่ปลอดภัยไว้ในโมดูลขนาดเล็ก (Contain unsafety in small modules)
คำอธิบาย
หากคุณมีความจำเป็นต้องเขียนโค้ด unsafe ให้พยายามสร้างโมดูลที่มีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ โดยให้โมดูลนั้นรับผิดชอบการดูแลรักษา invariants ที่จำเป็น เพื่อสร้างอินเทอร์เฟซที่ปลอดภัยครอบทับโค้ดที่ไม่ปลอดภัยนั้น จากนั้นจึงนำโมดูลย่อยนี้ไปประกอบรวมไว้ในโมดูลหลักที่มีเฉพาะโค้ดที่ปลอดภัย (safe code) พร้อมเปิดให้อินเทอร์เฟซที่สะดวกต่อการใช้งาน ทั้งนี้ โมดูลชั้นนอกยังคงสามารถเปิดเผยฟังก์ชันหรือเมท็อดแบบ unsafe ที่เรียกตรงไปยังโค้ดภายในได้ หากผู้ใช้งานต้องการความเร็วสูงสุด
ข้อดี
- ช่วยจำกัดขอบเขตของโค้ด unsafe ที่จำเป็นต้องได้รับการตรวจสอบและทดสอบความปลอดภัย (audit) ให้เหลือน้อยที่สุด
- การเขียนโมดูลชั้นนอกทำได้ง่ายและมั่นใจยิ่งขึ้น เนื่องจากสามารถวางใจในหลักประกันความถูกต้อง (guarantees) ที่โมดูลชั้นในดูแลให้อยู่แล้ว
ข้อเสีย
- ในบางกรณี อาจเป็นเรื่องยากในการออกแบบอินเทอร์เฟซที่ลงตัวและครอบคลุม
- การสร้าง abstraction ครอบทับอาจก่อให้เกิดภาระด้านประสิทธิภาพ (overhead) เล็กน้อย
ตัวอย่าง
- crate
toolshedได้รวบรวมการทำงานที่เป็น unsafe ไว้ในโมดูลย่อยภายใน แล้วนำเสนอเฉพาะอินเทอร์เฟซที่ปลอดภัยให้แก่ผู้ใช้งานภายนอก - โครงสร้าง
Stringในไลบรารีมาตรฐาน (std) แท้จริงแล้วคือตัวห่อหุ้มVec<u8>ที่เพิ่ม invariant ควบคุมว่าข้อมูลภายในจะต้องเป็น UTF-8 ที่ถูกต้องเสมอ ซึ่งการทำงานปกติบนStringจะช่วยรับประกันพฤติกรรมนี้ ทว่าผู้ใช้งานยังคงมีทางเลือกในการเรียกใช้เมท็อดunsafeเพื่อสร้างStringได้โดยตรง ซึ่งในกรณีนั้น ผู้เรียกใช้จะต้องเป็นผู้รับผิดชอบในการรับประกันความถูกต้องของข้อมูลด้วยตนเอง