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

จำกัดขอบเขตความไม่ปลอดภัยไว้ในโมดูลขนาดเล็ก (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 ได้โดยตรง ซึ่งในกรณีนั้น ผู้เรียกใช้จะต้องเป็นผู้รับผิดชอบในการรับประกันความถูกต้องของข้อมูลด้วยตนเอง

ดูเพิ่มเติม