สำหรับฉันมันเป็นปัญหาการมีเพศสัมพันธ์และเกี่ยวข้องกับการออกแบบที่ละเอียด แม้แต่รูปแบบการแต่งงานที่คับแคบก็ยังแนะนำการพึ่งพาจากสิ่งหนึ่งไปอีกสิ่งหนึ่ง ถ้าทำเพื่อวัตถุนับแสนถึงแม้ว่าพวกมันจะค่อนข้างเรียบง่ายยึดติดกับ SRP และแม้ว่าการพึ่งพาทั้งหมดจะไหลไปสู่ abstractions ที่เสถียรซึ่งให้ codebase ซึ่งยากมากที่จะให้เหตุผลเกี่ยวกับความสัมพันธ์ทั้งหมด
มีสิ่งที่ใช้ประโยชน์ได้จริงที่ช่วยให้คุณวัดความซับซ้อนของ codebase ซึ่งไม่ได้กล่าวถึงบ่อยครั้งในทางทฤษฎี SE เช่นลึกเข้าไปใน call stack ที่คุณจะได้รับก่อนที่จะถึงจุดสิ้นสุดและความลึกที่คุณต้องไปก่อนด้วย ความมั่นใจอย่างมากเข้าใจผลข้างเคียงที่เป็นไปได้ทั้งหมดที่อาจเกิดขึ้นที่ระดับของ call stack รวมถึงในกรณีที่มีข้อยกเว้น
และฉันก็พบว่าจากประสบการณ์ของฉันระบบที่ราบเรียบด้วยกองการโทรตื้น ๆ นั้นมีแนวโน้มที่จะให้เหตุผลได้ง่ายกว่ามาก ตัวอย่างสุดขั้วจะเป็นระบบเอนทิตีส่วนประกอบที่ส่วนประกอบเป็นเพียงข้อมูลดิบ มีเพียงระบบที่มีฟังก์ชั่นการใช้งานและในกระบวนการดำเนินการและใช้ ECS ฉันพบว่าระบบที่ง่ายที่สุดเท่าที่เคยมีมาเพื่อให้เหตุผลว่าเมื่อใดที่โค้ดเบสที่ซับซ้อนซึ่งครอบคลุมโค้ดหลายร้อยหลายพันบรรทัดโดยทั่วไป มีฟังก์ชั่นทั้งหมด
มีหลายสิ่งมากเกินไปที่จะใช้ประโยชน์ได้
ทางเลือกก่อนตอนที่ผมทำงานใน codebases ก่อนหน้านี้เป็นระบบที่มีหลายร้อยหลายพันของวัตถุส่วนใหญ่มีขนาดเล็กเมื่อเทียบกับระบบโหลขนาดใหญ่ไม่กี่กับวัตถุบางอย่างที่ใช้เพียงเพื่อให้ผ่านข้อความจากวัตถุหนึ่งไปยังอีก ( Message
วัตถุเช่นที่มีของ ส่วนต่อประสานสาธารณะของตัวเอง) นั่นคือสิ่งที่คุณจะได้รับแบบอะนาล็อกเมื่อคุณย้อนกลับ ECS กลับไปยังจุดที่องค์ประกอบมีการทำงานและการรวมกันที่ไม่ซ้ำกันของส่วนประกอบในเอนทิตีทำให้ประเภทวัตถุของตัวเอง และที่จะมีแนวโน้มที่จะให้ผลผลิตที่มีขนาดเล็ก, ฟังก์ชั่นที่เรียบง่ายได้รับการถ่ายทอดและให้บริการโดยรวมกันไม่มีที่สิ้นสุดของวัตถุที่ความคิดรุ่นเล็ก ( Particle
วัตถุเทียบกับPhysics System
, เช่น). อย่างไรก็ตามมันยังมีแนวโน้มที่จะให้กราฟที่ซับซ้อนของการพึ่งพาระหว่างกันซึ่งทำให้มันยากที่จะให้เหตุผลเกี่ยวกับสิ่งที่เกิดขึ้นจากระดับกว้าง ๆ เพียงเพราะมีหลายสิ่งมากมายใน codebase ที่สามารถทำอะไรบางอย่างได้จริง - ประเภทที่ไม่ใช่ประเภท "ข้อมูล" แต่เป็นประเภท "วัตถุ" ที่มีฟังก์ชันการทำงานที่เกี่ยวข้อง ประเภทที่ใช้เป็นข้อมูลที่บริสุทธิ์โดยไม่มีฟังก์ชั่นที่เกี่ยวข้องไม่สามารถผิดพลาดได้เนื่องจากพวกเขาไม่สามารถทำอะไรได้ด้วยตนเอง
อินเทอร์เฟซที่บริสุทธิ์ไม่ได้ช่วยแก้ไขปัญหาความเข้าใจนี้มากนักเพราะแม้ว่าจะทำให้ "การพึ่งพาเวลารวบรวม" มีความซับซ้อนน้อยลงและให้พื้นที่การหายใจที่มากขึ้นสำหรับการเปลี่ยนแปลงและการขยายตัวมันไม่ได้ทำให้ IAccount
วัตถุลูกค้ายังคงจบลงด้วยการเรียกใช้ฟังก์ชั่นบนวัตถุที่บัญชีคอนกรีตแม้ว่าพวกเขาจะถูกเรียกว่าผ่าน ความแตกต่างและอินเทอร์เฟซแบบนามธรรมมีการใช้งานของมัน แต่มันไม่ได้แยกสิ่งต่าง ๆ ในแบบที่ช่วยให้คุณได้จริงเกี่ยวกับผลข้างเคียงที่อาจเกิดขึ้น ณ จุดใดก็ตาม เพื่อให้บรรลุการแยกประเภทที่มีประสิทธิภาพนี้คุณต้องมี codebase ที่มีสิ่งต่าง ๆ น้อยลงที่มีฟังก์ชั่น
ข้อมูลเพิ่มเติม, ฟังก์ชั่นน้อยลง
ดังนั้นฉันจึงได้พบวิธีการของ ECS แม้ว่าคุณจะไม่ได้ใช้มันอย่างสมบูรณ์เพื่อเป็นประโยชน์อย่างยิ่งเนื่องจากมันจะเปลี่ยนสิ่งที่จะเป็นวัตถุหลายร้อยชิ้นให้กลายเป็นเพียงข้อมูลดิบที่มีระบบขนาดใหญ่ออกแบบให้หยาบขึ้นกว่าเดิม ฟังก์ชั่น มันเพิ่มจำนวนประเภท "ข้อมูล" และลดจำนวนประเภท "วัตถุ" ให้น้อยที่สุดดังนั้นจึงลดจำนวนสถานที่ในระบบของคุณที่อาจผิดพลาดได้อย่างแท้จริง ผลลัพธ์ที่ได้คือระบบ "แบน" ที่ไม่มีกราฟที่ซับซ้อนของการพึ่งพาเพียงแค่ระบบไปยังส่วนประกอบไม่เคยกลับกันและไม่เคยมีส่วนประกอบกับส่วนประกอบอื่น ๆ มันเป็นข้อมูลดิบที่มากขึ้นและ abstractions ที่น้อยลงซึ่งมีผลกระทบจากการรวมศูนย์และการทำงานของ codebase ที่แบนราบไปยังส่วนที่สำคัญ, abstractions หลัก
30 สิ่งที่เรียบง่ายนั้นไม่จำเป็นต้องง่ายกว่าในการให้เหตุผลเกี่ยวกับสิ่งที่ซับซ้อนกว่า 1 อย่างถ้าสิ่งที่ง่ายกว่า 30 รายการนั้นมีความสัมพันธ์กันในขณะที่สิ่งที่ซับซ้อนนั้นเป็นของตัวเอง ดังนั้นข้อเสนอแนะของฉันคือการถ่ายโอนความซับซ้อนออกไปจากการโต้ตอบระหว่างวัตถุและอื่น ๆ ไปยังวัตถุที่มีขนาดใหญ่ขึ้นซึ่งไม่จำเป็นต้องมีปฏิสัมพันธ์กับสิ่งอื่นเพื่อให้เกิดการแยกมวลออกไปสู่ระบบ "ทั้งหมด" (ไม่ใช่เสาหิน ไม่ใช่คลาสที่มี 200 วิธี แต่มีบางสิ่งที่สูงกว่าMessage
หรือมากกว่าParticle
แม้จะมีส่วนต่อประสานที่เรียบง่าย) และชอบประเภทข้อมูลเก่าที่ธรรมดากว่า ยิ่งคุณพึ่งพามันมากเท่าไหร่คุณก็ยิ่งมีเพศสัมพันธ์น้อยลงเท่านั้น แม้ว่ามันจะขัดแย้งกับความคิด SE บางอย่างฉันก็พบว่ามันช่วยได้มากจริงๆ