วิธีการใช้การออกแบบข้อมูลเชิงวัตถุกับการเขียนโปรแกรมเชิงวัตถุ? [ปิด]


17

ฉันได้อ่านบทความมากมายเกี่ยวกับ Data Oriented Design (DOD) และฉันเข้าใจ แต่ฉันไม่สามารถออกแบบระบบ Object Oriented Programming (OOP) โดยที่ DOD อยู่ในใจฉันคิดว่าการศึกษา OOP ของฉันกำลังบล็อกฉันอยู่ ฉันจะคิดว่าจะผสมสองอย่างนี้ได้อย่างไร วัตถุประสงค์คือมีส่วนต่อประสาน OOP ที่ดีในขณะที่ใช้ DOD เบื้องหลัง

ฉันเห็นสิ่งนี้เช่นกัน แต่ก็ไม่ได้ช่วยอะไรมาก: /programming/3872354/how-to-apply-dop-and-keep-a-nice-user-interface


3
คุณต้องโพสต์สิ่งที่เฉพาะเจาะจงมากขึ้น (และเกี่ยวข้องกับเกม) คำถามนี้กว้างเกินไป
DeadMG

คุณพูดถูก แต่ฉันไม่เคยเห็นเรื่องนี้มาพูดถึงในสาขาอื่นนอกเหนือจากการเขียนโปรแกรมเกม
Pombal

4
@DeadMG: ฉันไม่เคยเห็นคำว่าการออกแบบเชิงข้อมูลมาใช้นอกการพัฒนาเกมยกเว้นเมื่อกล่าวถึงวิธีปฏิบัติที่มีต้นกำเนิดในการพัฒนาเกม หากคุณกำลังคิดเกี่ยวกับการออกแบบที่ขับเคลื่อนด้วยข้อมูลไม่ใช่สิ่งเดียวกัน

คำตอบ:


16

ฉันจะบอกว่าบล็อกของ Noel Llopisน่าจะเป็นคำแนะนำที่ดีที่สุดสำหรับการผสมผสานการเขียนโปรแกรมเชิงวัตถุและการออกแบบเชิงข้อมูล เขาเป็นหนึ่งในผู้เริ่มต้นของคำ DOD เป็นโปรแกรมเมอร์ C ++ ที่แข็งแกร่งและได้เขียนข้อตกลงที่ดีเกี่ยวกับสไตล์ของเขาและวิธีที่เขาใช้ประโยชน์จากคุณสมบัติ OO ของ C ++

ฉันเดาว่าถ้าฉันจะเรียกองค์ประกอบสำคัญของการรวมพวกเขาตาม Noel:

  • ใช้ POD และไม่ใช่สมาชิกฟังก์ชั่นที่ไม่ใช่เพื่อนให้มากที่สุด ฟังก์ชั่นที่ไม่ใช่สมาชิกและไม่เป็นเพื่อนปรับปรุงการห่อหุ้มและเป็นส่วนสำคัญของการวางแนวข้อมูลเพราะพวกเขาเก็บข้อมูลข้อมูล
  • หลีกเลี่ยงการเก็บสถานะ "ชั่วคราว" ไว้บนวัตถุของคุณ สถานะชั่วคราวอุดตันข้อมูลของคุณ หากคุณต้องการแคชบางสิ่ง (เช่นเพื่อประสิทธิภาพ) นั่นจะเป็นของคลาสใหม่ที่มีฟังก์ชันที่ไม่ใช่สมาชิกที่ไม่ใช่สมาชิกที่เชื่อมโยงทั้งสองประเภทไม่ใช่ความสัมพันธ์แบบ is-a และ a-a
  • หลีกเลี่ยงวัตถุที่อาจอยู่ในสถานะ A หรือรัฐ B ชอบสลับไปมาระหว่างวัตถุสองวัตถุหนึ่งในนั้นคือ A และหนึ่งในนั้นคือ B
  • หลีกเลี่ยงความแตกต่างหลีกเลี่ยงฟังก์ชั่นเสมือนหลีกเลี่ยงแม่แบบหลีกเลี่ยงสิ่งใดก็ตามที่ทำให้ข้อมูลของคุณมีลักษณะเหมือนกันของความเหมือนจริงมากกว่าความเหมือนจริง

ชื่อใหญ่อื่น ๆ ในโฆษณาชวนเชื่อ DOD ในขณะนี้คือ Mike Acton of Insomniac แต่การอ่านสิ่งที่เขาเขียนฉันจะบอกว่าเขาไม่ใช่ pro-OO จริงๆ (หรือ anti-OO ตราบใดที่ยังเน้นข้อมูล)


ขอบคุณสำหรับคำตอบ แต่สิ่งที่คุณกำลังพูดคือสิ่งที่ฉันควรทำเพื่อใช้ DOD ไม่ใช่วิธีที่ฉันสามารถใช้ OO กับมันได้ ฉันได้อ่านบล็อกของ Noel, Mike Acton rants (: D), สิ่งพิมพ์ของ DICE และอื่น ๆ ฉันเข้าใจวิธีใช้ DOD ไม่ใช่ OO ปนกัน
Pombal

2
คุณคิดว่า OO คืออะไร ฉันจะเรียกรหัส OO ของ Noel เป็นส่วนใหญ่ตัวอย่างเช่น - ยังมีคลาสและอินสแตนซ์ยังมีการแจกจ่ายตามประเภทยังอาจมีการสืบทอด (C ++ 0x นิยามของ POD ถูกเปลี่ยนเพื่ออนุญาตสิ่งนี้) ยังคงมีหนึ่งแบบจำลองปัญหาที่เริ่มต้นด้วยข้อมูลมากกว่าการดำเนินการ

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

@sharethis: ถ้าฉันเข้าใจการคัดค้านของคุณมันเป็นความหลากหลายที่เป็นคุณสมบัติหลักของ OO ผมเห็นด้วยภาษาที่อ้างว่าเป็น OO โดยการสนับสนุนสำหรับมันจะแปลก แต่ไม่ได้หมายความว่ามันเป็นเครื่องมือของรีสอร์ทเป็นครั้งแรกสำหรับชนิดของปัญหาหนึ่งเผชิญหน้าการเขียนโปรแกรมเกมที่แม้ในขณะที่เกมเป็นโปรแกรมในรูปแบบ OO ฉันยังจะยืนยันว่า DOD เป็นจริงเกี่ยวกับการหลีกเลี่ยงความแตกต่างหลากหลายชนิด (subtyping เล็กน้อย) แต่ให้กำลังใจผู้อื่น (ใน C ++, ad hoc polymorphism กับ ADL หรือ polymorphism โครงสร้างผ่านการรับรองเกี่ยวกับการเป็นตัวแทนค่า)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.