ดังนั้นฉันสงสัยว่าเทคนิคนี้ใช้ในทางปฏิบัติจริง ๆ หรือไม่ ฉันควรใช้ทุกที่หรือด้วยความระมัดระวัง?
แน่นอนว่ามันถูกใช้ ฉันใช้มันในโครงการของฉันในเกือบทุกชั้น
เหตุผลในการใช้ PIMPL สำนวน:
ความเข้ากันได้ไบนารี
เมื่อคุณพัฒนาไลบรารีคุณสามารถเพิ่ม / ปรับเปลี่ยนฟิลด์เป็นXImpl
โดยไม่ทำลายความเข้ากันได้ของไบนารีกับไคลเอนต์ของคุณ (ซึ่งอาจหมายถึงล่ม!) เนื่องจากรูปแบบไบนารีของX
คลาสไม่เปลี่ยนแปลงเมื่อคุณเพิ่มเขตข้อมูลใหม่ลงในXimpl
คลาสจึงปลอดภัยที่จะเพิ่มฟังก์ชันการทำงานใหม่ให้กับไลบรารีในการปรับปรุงรุ่นรอง
แน่นอนคุณยังสามารถเพิ่มวิธีการที่ไม่ใช่แบบเสมือน / สาธารณะใหม่ให้กับX
/ XImpl
โดยไม่ทำลายความเข้ากันได้ของไบนารี
การซ่อนข้อมูล
หากคุณกำลังพัฒนาห้องสมุดโดยเฉพาะอย่างยิ่งกรรมสิทธิ์ซึ่งเป็นที่พึงปรารถนาที่จะไม่เปิดเผยว่ามีการใช้ไลบรารี / เทคนิคการใช้งานอื่นใดในการปรับใช้ส่วนต่อประสานสาธารณะของห้องสมุดของคุณ อาจเป็นเพราะปัญหาทรัพย์สินทางปัญญาหรือเพราะคุณเชื่อว่าผู้ใช้อาจถูกล่อลวงให้ใช้สมมติฐานที่เป็นอันตรายเกี่ยวกับการใช้งานหรือเพียงแค่ทำลายการห่อหุ้มโดยใช้เทคนิคการคัดเลือกนักแสดงที่น่ากลัว PIMPL แก้ปัญหา / บรรเทา
เวลารวบรวม
เวลาในการรวบรวมลดลงเนื่องจากมีเพียงไฟล์ซอร์ส (การนำไปใช้) X
ที่ต้องสร้างใหม่เมื่อคุณเพิ่ม / ลบฟิลด์และ / หรือวิธีการไปยังXImpl
คลาส (ซึ่งแม็พกับการเพิ่มฟิลด์ / เมธอดส่วนตัวในเทคนิคมาตรฐาน) ในทางปฏิบัติมันเป็นเรื่องธรรมดา
ด้วยเทคนิคส่วนหัว / การนำไปใช้งานมาตรฐาน (โดยไม่มี PIMPL) เมื่อคุณเพิ่มฟิลด์ใหม่ลงX
ในไคลเอนต์ที่เคยจัดสรรX
(ทั้งบนสแต็กหรือบนกอง) จะต้องทำการคอมไพล์ใหม่เนื่องจากต้องปรับขนาดของการจัดสรร ทีนี้ลูกค้าทุกคนที่ไม่ได้จัดสรร X ก็จำเป็นต้องทำการคอมไพล์ใหม่ แต่มันเป็นแค่ค่าใช้จ่าย (โค้ดผลลัพธ์ที่ฝั่งไคลเอ็นต์จะเหมือนกัน)
ยิ่งไปกว่านั้นด้วยการแยกส่วนหัว / การใช้งานมาตรฐานXClient1.cpp
จะต้องมีการคอมไพล์ใหม่แม้ว่าจะมีการX::foo()
เพิ่มX
และX.h
เปลี่ยนวิธีการส่วนตัวแม้ว่าXClient1.cpp
จะไม่สามารถเรียกวิธีการนี้ได้ด้วยเหตุผลของการห่อหุ้ม! ดังกล่าวข้างต้นเป็นค่าใช้จ่ายที่บริสุทธิ์และเกี่ยวข้องกับการทำงานของระบบสร้าง C ++ ในชีวิตจริง
แน่นอนว่าการคอมไพล์ซ้ำไม่จำเป็นเมื่อคุณเพียงแค่ปรับเปลี่ยนการใช้งานเมธอด (เพราะคุณไม่ได้แตะที่ส่วนหัว) แต่นั่นก็เป็นวิธีการเดียวกับเทคนิคส่วนหัว / การใช้งานมาตรฐาน
แนะนำให้ใช้เทคนิคนี้ในระบบฝังตัวหรือไม่ (ในกรณีที่ประสิทธิภาพมีความสำคัญมาก)
ขึ้นอยู่กับว่าเป้าหมายของคุณแข็งแกร่งแค่ไหน อย่างไรก็ตามคำตอบเดียวสำหรับคำถามนี้คือ: วัดและประเมินสิ่งที่คุณได้รับและสูญเสีย นอกจากนี้ยังต้องคำนึงถึงว่าหากคุณไม่ได้เผยแพร่ไลบรารีที่ตั้งใจจะใช้ในระบบฝังตัวโดยลูกค้าของคุณจะใช้ประโยชน์จากเวลาในการรวบรวมเท่านั้น!
struct XImpl : public X
. นั่นทำให้ฉันรู้สึกเป็นธรรมชาติมากขึ้น มีปัญหาอื่นที่ฉันพลาดไปไหม