วิธีที่ดีที่สุดในการเข้าถึงฟิลด์/คุณสมบัติของคลาส Game1 ใน xna คืออะไร?

ฉันกำลังสร้างเกม xna และจะมีคลาสมากมายที่ควบคุมการวาดภาพและการอัปเดตและอื่นๆ

คลาสเหล่านี้จำเป็นต้องสามารถเข้าถึงอินสแตนซ์ของคลาส Game1 ดั้งเดิมได้ เพื่อให้สามารถควบคุมอุปกรณ์กราฟิกและชุดสไปรท์และสิ่งต่าง ๆ ได้

ปัญหาคือฉันจะมีเครือข่ายของคลาส คลาสที่เรียกคลาสอื่น และคลาสที่อยู่ด้านล่างสุดของเชนยังคงต้องสามารถเข้าถึงคลาส Game1 สำหรับอุปกรณ์กราฟิกและอื่นๆ ได้

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? แค่ส่งต่อ Game1 ต่อไปเป็นพารามิเตอร์หรืออะไร?


person Thomas    schedule 02.08.2012    source แหล่งที่มา


คำตอบ (2)


คำตอบที่ "ถูกต้อง" จากมุมมองด้านวิศวกรรมซอฟต์แวร์/สถาปัตยกรรมคือการส่งทรัพยากรเฉพาะที่คุณต้องการเป็นพารามิเตอร์ไปยังวิธีการของคุณ สิ่งนี้ให้ข้อดีหลายประการ - ข้อดีที่สุดคือการแยกส่วนต่าง ๆ ของโค้ดของคุณออก ทำให้สามารถใช้แยกจากกัน

เพื่อยกตัวอย่าง: คุณอาจมีเกมของคุณ แต่คุณอาจต้องการใช้โค้ดเดียวกันของคุณและสร้างโปรแกรมแก้ไข หรือการทดสอบหน่วย หรือเครื่องมือแปลกๆ อื่นๆ ในหลายกรณี คุณอาจไม่มีคลาส Game ด้วยซ้ำ (เพื่อให้คุณเห็นตัวอย่างที่ชัดเจน วิดีโอของฉันนี้ จะแสดงให้คุณเห็นสองวิธีที่แตกต่างกันมาก ของการรันโค้ดเกมเดียวกัน - สิ่งนี้จะเป็นไปไม่ได้หากไม่มีการแยกส่วนที่เหมาะสม)

(บนพื้นฐานนี้ คุณควรส่งต่อสิ่งที่เฉพาะเจาะจงมากกว่าคลาสที่ได้มาจาก Game)

คุณสามารถก้าวไปอีกขั้นได้ หากคุณมีข้อกำหนดด้านเวอร์ชัน/การพึ่งพาที่ค่อนข้างเปิด และส่งต่อ IServiceProvider (ตัวอย่างเช่น นี่คือสิ่งที่ XNA ส่งไปยังตัวสร้างของ ContentManager) ฉันทำการวิเคราะห์โดยละเอียดว่าทำไมคุณถึงทำเช่นนี้ในคำตอบนี้

อย่างไรก็ตาม

คุณไม่ได้เขียนไลบรารี่ที่จะใช้โดยบุคคลที่สาม คุณกำลังเขียนเกม บุคคลเดียวที่จะใช้รหัสของคุณคือทีมของคุณเอง - และคุณสามารถเข้าถึงซอร์สโค้ดและคุณสามารถแก้ไขได้อย่างอิสระ

ซึ่งหมายความว่าคุณสามารถใช้ทางลัดได้อย่างอิสระ

ในทางปฏิบัติ เป็นเรื่องปกติที่จะหยิบอินสแตนซ์คงที่ของคลาสเกมของคุณ หรือ (และนี่คือวิธีที่ฉันชอบเมื่อฉันรวมอะไรบางอย่างเข้าด้วยกัน) คุณสมบัติคงที่ของคลาสเกมของคุณ และใน XNA คุณรู้ว่าคุณจะมีคลาสเกมเพียงอินสแตนซ์เดียวเท่านั้นในทางปฏิบัติ

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

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

person Andrew Russell    schedule 02.08.2012

ทำไมไม่เก็บการอ้างอิงแบบคงที่ไว้ที่ game1 และทุกอย่างก็อ้างอิงถึงสิ่งนั้นล่ะ

person Brian Mains    schedule 02.08.2012
comment
คุณแน่ใจหรือว่าเป็นวิธีที่ดีที่สุด? โดยพื้นฐานแล้ว ทุกสิ่งที่ฉันสร้างจะขึ้นอยู่กับวิธีที่ฉันจัดการกับปัญหานี้ ดังนั้นจึงจำเป็นต้องถูกต้องมาก... - person Thomas; 02.08.2012
comment
การส่งผ่านมันเป็นพารามิเตอร์หรือตัวสร้างทุกที่อาจไม่จำเป็น การอ้างอิงแบบคงที่ให้ตำแหน่งศูนย์กลางในการเข้าถึงสิ่งนี้ นี่ไม่จำเป็นต้องเป็นปัญหาเฉพาะของ XNA แต่เป็นปัญหาที่คล้ายกันสำหรับแอปพลิเคชันทุกประเภท ความคิดเห็นของฉันและเป็นข้อจำกัดความรับผิดชอบ ฉันดูการเขียนโปรแกรม XNA แต่ยังไม่ได้สร้างเกมของตัวเอง... - person Brian Mains; 02.08.2012