ใช้คลาส“ เพื่อน” ในการพัฒนาเกม


9

โดยทั่วไปแล้วในการพัฒนาเกม C ++ นั้นมีคุณค่ามากกว่าการห่อหุ้มดังนั้นคุณจึงเห็นสมาชิกชั้นเรียนที่สามารถเข้าถึงได้ทั่วไปซึ่งไม่ควรเปิดเผยต่อสาธารณะ

ฉันดูเหมือนจะพบว่าส่วนใหญ่มีเพียงไม่กี่ข้อเท่านั้นที่จำเป็นต้องรู้ถึงการทำงานภายในของคลาสอื่น ๆ จนถึงจุดที่แก้ไขหรืออ่านข้อมูลส่วนตัวของพวกเขา

การสร้าง getters สาธารณะ / setters สำหรับข้อมูลส่วนตัวนี้แสดงถึงสิ่งที่ไม่ควรแก้ไขโดยเจตนา

การประนีประนอมที่นี่จะใช้คลาสเพื่อนหรือไม่ หรือมีข้อด้อยในการเรียนเพื่อนฉันไม่เห็น

คำตอบ:


8

มีสองข้อเสียที่สำคัญในการเรียนเป็นเพื่อน

  1. คุณไม่สามารถเลือกและเลือกสิ่งที่คุณต้องการให้เพื่อนเห็น มันคือทั้งหมดหรือไม่มีอะไร สิ่งนี้สามารถพิสูจน์ได้ว่าเป็นปัญหาหากคุณกำลังพยายามบังคับใช้ setter ที่ไม่สำคัญบางประเภท
  2. ชั้นเรียนทั้งสองของคุณมีการเชื่อมโยงกันในแง่ที่เพื่อนรู้เกี่ยวกับเพื่อน

ที่ถูกกล่าวว่าการใช้ชั้นเรียนเพื่อนสามารถปรับปรุงการห่อหุ้มได้อย่างแน่นอน

นอกจากนี้คำถามที่เกี่ยวข้องกับ SO: /programming/521754/when-to-use-friend-class-in-c


5

การห่อหุ้มเป็นเรื่องที่ดี แต่การแยกความกังวลนั้นดีกว่า

คลาสที่เข้าถึง "บางส่วนที่เป็นส่วนตัว" ของคลาสอื่นอาจระบุว่ารหัสนั้นไม่ได้รับการออกแบบมาตั้งแต่แรก

ทุกครั้งที่คุณพบว่าตัวเองอยู่ใน "เอ้ยฉันต้องทำให้ชั้นเพื่อนที่นี่" จุดคำถามที่คุณควรถามตัวเองคือ "ฉันกำลังทำอย่างถูกต้องหรือมีวิธีที่สะอาดขึ้นหรือไม่" (aka "สิ่งนี้จะกัดฉันในลาภายหลังหรือไม่")

หากคุณแน่ใจเกี่ยวกับ "ความเป็นมิตร" วางไว้ที่นั่นโดยไม่ลังเล


ฉันเข้าใจว่าการใช้คลาสเพื่อนจะทำให้ชั้นเรียนหนึ่งคู่ไปอีกชั้นหนึ่งอย่างแน่นหนา ฉันสงสัยว่ามีรูปแบบการออกแบบโดยเฉพาะที่บรรเทาปัญหาได้หรือไม่เพราะเพียงห่อบางสิ่งใน getter / setter อาจเป็นวิธีที่แย่กว่านั้น
David Young Young

1
ตัวอย่างที่น่าสนใจคือรูปแบบของโรงงานใน C ++ ต้องการ "เพื่อน" เนื่องจากการใช้งานตัวสร้างส่วนตัว
David Young Young

2

อีกทางเลือกหนึ่งคือการใช้PIMPL idiomโดยที่ส่วนหนึ่งของการนำโครงสร้างไปใช้งานจะเป็นตัวชี้ไปยังประเภทอื่น ผู้ใช้ส่วนใหญ่ของคลาสจะรวมไฟล์ส่วนหัวปกติไว้ซึ่งการนำไปใช้งานเป็นตัวชี้ทึบแสง คลาสที่ต้องการเข้าถึงข้อมูลส่วนตัวสามารถรวมส่วนหัวที่กำหนดประเภทอื่นและใช้อินเทอร์เฟซที่ให้ไว้

นี่เป็นรูปแบบทั่วไปสำหรับโปรแกรมเมอร์ C ที่ต้องการฟังก์ชั่นเหมือนเพื่อน ในความคิดของฉันมันยัง hews อย่างใกล้ชิดกับการคิดเกี่ยวกับการแยกความกังวล (หลักการออกแบบที่ดีโดยทั่วไปที่นำไปสู่การใช้ซ้ำรหัส orthogonal) มากกว่า encapsulation (เทคนิค OO เฉพาะที่มีประโยชน์สำหรับการดำเนินการแยกของความกังวล เพื่อทำสิ่งที่ซับซ้อนเกินไป)

มันมีข้อได้เปรียบมากกว่าเพื่อนที่ไม่ได้จับคู่เพื่อนกับเพื่อนเลย บางคนอาจอ้างว่าเป็นข้อเสียเพราะตอนนี้ทุกคนสามารถ "เพื่อน" ชั้นเรียนของคุณ ฉันคิดว่ามันเป็นความกลัวที่ไม่รับประกันเนื่องจากคุณยังคงทำให้ความสัมพันธ์ชัดเจน (โดยรวมส่วนหัว) หากคุณกลัวสิ่งนั้นแสดงว่าคุณกลัวความสามารถ (หรือเพื่อนร่วมงาน) ในการตัดสินใจทางสถาปัตยกรรมที่ชาญฉลาด แต่ถ้าคุณไม่สามารถตัดสินใจได้อย่างถูกต้องในภายหลังทำไมคุณถึงเชื่อมั่นในตัวเองในfriendตอนนี้?

มันมีข้อเสียของต้นทุนรันไทม์ โดยการจัดเก็บข้อมูลในตัวชี้คุณมีความต่อเนื่องของแคชที่แย่ลงและจำนวนการจัดสรรที่มากขึ้นและคุณต้องมี destructor เพื่อล้างข้อมูล


+1 น่าสนใจไม่เคยได้ยินแนวคิดนี้มาจากพื้นหลัง Java
David Young Young
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.