บทนำ
ระบบส่วนประกอบ - Entity เป็นเทคนิคสถาปัตยกรรมเชิงวัตถุ
ไม่มีฉันทามติสากลว่าคำหมายถึงอะไรเช่นเดียวกับการเขียนโปรแกรมเชิงวัตถุ แต่ก็เป็นที่ชัดเจนว่าระบบนิติบุคคลองค์ประกอบมีวัตถุประสงค์เฉพาะเป็นทางเลือกสถาปัตยกรรมมรดก ลำดับชั้นมรดกเป็นธรรมชาติสำหรับการแสดงสิ่งที่วัตถุคือแต่ในบางชนิดของซอฟต์แวร์ (เช่นเกม), คุณค่อนข้างจะแสดงสิ่งที่วัตถุไม่
มันเป็นรูปแบบวัตถุที่แตกต่างจาก "คลาสและการสืบทอด" ซึ่งคุณมักคุ้นเคยกับการทำงานใน C ++ หรือ Java เอนทิตีมีความหมายเหมือนกับคลาสเช่นเดียวกับต้นแบบใน JavaScript หรือ Self ระบบทั้งหมดเหล่านี้สามารถนำไปใช้ในแง่ของกันและกัน
ตัวอย่าง
พูดเถอะว่าPlayer
เป็นนิติบุคคลที่มีPosition
, Velocity
และKeyboardControlled
ส่วนประกอบซึ่งทำสิ่งที่เห็นได้ชัด
entity Player:
Position
Velocity
KeyboardControlled
เรารู้ว่าPosition
จะต้องได้รับผลกระทบจากVelocity
และโดยVelocity
KeyboardControlled
คำถามคือเราต้องการจำลองลักษณะพิเศษเหล่านั้นอย่างไร
เอนทิตีส่วนประกอบและระบบ
สมมติว่าส่วนประกอบไม่มีการอ้างอิงถึงสิ่งอื่น Physics
ระบบภายนอกสำรวจVelocity
องค์ประกอบทั้งหมดและอัพเดทPosition
เอนทิตีที่เกี่ยวข้อง Input
ระบบลัดเลาะทุกชิ้นส่วนและปรับปรุงKeyboardControlled
Velocity
Player
+--------------------+
| Position | \
| | Physics
/ | Velocity | /
Input | |
\ | KeyboardControlled |
+--------------------+
สิ่งนี้เป็นไปตามเกณฑ์:
ระบบอยู่ในขณะนี้รับผิดชอบในการจัดการเหตุการณ์และตัวประกันพฤติกรรมการอธิบายโดยส่วนประกอบ พวกเขายังรับผิดชอบในการจัดการปฏิสัมพันธ์ระหว่างเอนทิตีเช่นการชนกัน
เอนทิตีและส่วนประกอบ
แต่สมมติว่าชิ้นส่วนจะมีการอ้างอิงกับอีกคนหนึ่ง ตอนนี้เอนทิตีเป็นเพียงตัวสร้างที่สร้างส่วนประกอบบางอย่างรวมเข้าด้วยกันและจัดการอายุการใช้งาน:
class Player:
construct():
this.p = Position()
this.v = Velocity(this.p)
this.c = KeyboardControlled(this.v)
ตอนนี้เอนทิตีอาจส่งอินพุตและอัพเดตเหตุการณ์ไปยังคอมโพเนนต์โดยตรง Velocity
จะตอบสนองต่อการปรับปรุงและKeyboardControlled
จะตอบสนองต่อการป้อนข้อมูล สิ่งนี้ยังคงเป็นไปตามเกณฑ์ของเรา:
ที่นี่การโต้ตอบขององค์ประกอบมีความชัดเจนไม่ได้ถูกกำหนดจากภายนอกโดยระบบ ข้อมูลที่อธิบายพฤติกรรม (ปริมาณของความเร็วคืออะไร) และโค้ดที่ใช้บังคับ (ความเร็วคืออะไร) นั้นเชื่อมโยงกัน แต่ในลักษณะที่เป็นธรรมชาติ ข้อมูลสามารถดูได้เป็นพารามิเตอร์ของพฤติกรรม และบางส่วนไม่ได้ทำหน้าที่ที่ทุก-A Position
เป็นพฤติกรรมของการอยู่ในสถานที่
การโต้ตอบสามารถจัดการได้ในระดับของเอนทิตี (“ เมื่อมีการPlayer
ชนกับEnemy
…”) หรือในระดับของแต่ละองค์ประกอบ (“ เมื่อเอนทิตีที่มีการLife
ชนกับเอนทิตีที่มีStrength
... ”)
ส่วนประกอบ
อะไรคือเหตุผลที่ทำให้เอนทิตีมีอยู่? ถ้ามันเป็นเพียงนวกรรมิกเราก็สามารถแทนที่มันด้วยฟังก์ชั่นที่ส่งคืนชุดของส่วนประกอบ หากภายหลังเราต้องการสอบถามเอนทิตีตามประเภทเราสามารถมีTag
ส่วนประกอบที่ให้เราทำเช่นนั้นได้:
function Player():
t = Tag("Player")
p = Position()
v = Velocity(p)
c = KeyboardControlled(v)
return {t, p, v, c}
ตอนนี้การโต้ตอบจะต้องได้รับการจัดการโดยการสืบค้นที่เป็นนามธรรมแยกกิจกรรมออกจากประเภทเอนทิตีอย่างสมบูรณ์ ไม่มีประเภทเอนทิตีที่ต้องสืบค้นอีกต่อไปTag
ข้อมูลอาจใช้ในการดีบักได้ดีกว่าตรรกะของเกม
ข้อสรุป
เอนทิตีไม่ใช่ฟังก์ชันกฎนักแสดงหรือผู้รวบรวมข้อมูลดาต้าโฟลว์ พวกมันเป็นคำนามที่สร้างแบบจำลองปรากฏการณ์ที่เป็นรูปธรรม - กล่าวอีกนัยหนึ่งมันเป็นวัตถุ มันเป็นตามที่ Wikipedia พูดว่า - ระบบเอนทิตี - ส่วนประกอบเป็นรูปแบบสถาปัตยกรรมซอฟต์แวร์สำหรับการสร้างแบบจำลองวัตถุทั่วไป