หากคลาส“ ResourceManager” ถือว่าไม่ดีตัวเลือกอื่นคืออะไร


19

ฉันได้ยินความคิดเห็นที่ขัดแย้งเช่น:

  • "คลาส Dedicated Manager แทบไม่เคยเป็นเครื่องมือทางวิศวกรรมที่เหมาะสม"
  • "คลาส Dedicated Manager เป็นวิธีที่ดีที่สุดในการอยู่รอดโครงการขนาดใหญ่ที่มีทรัพยากรนับพัน"

ลองคลาส ResourceManager คลาสสิกที่มีฟังก์ชั่นต่อไปนี้:

  • โหลดเนื้อหา (พื้นผิว, เสียง, โมเดล 3 มิติ ฯลฯ )
  • ตรวจสอบให้แน่ใจว่ามีการโหลดเนื้อหาเพียงครั้งเดียวโดยเก็บแคชไว้
  • การอ้างอิงนับสินทรัพย์เพื่อพิจารณาว่าสามารถยกเลิกการจัดสรรได้หรือไม่
  • ซ่อนที่สินทรัพย์จริงมาจาก (เช่นอาจเป็นหนึ่งไฟล์ต่อสินทรัพย์หรือสินทรัพย์ทั้งหมดในไฟล์แพ็คเกจหนึ่งหรือสินทรัพย์สามารถโหลดผ่านเครือข่ายได้)
  • สามารถโหลดเนื้อหาโดยไม่ต้องเริ่มโปรแกรมใหม่ซึ่งมีประโยชน์อย่างยิ่งสำหรับศิลปินที่ทำงานในเกม

Let 's ยังใช้อาร์กิวเมนต์ "singletons ที่ไม่ดี" ออกจากตารางโดยแกล้งทำเป็นวัตถุ ResourceManager เหล่านี้จะไม่ singletons และแทนจะถูกส่งผ่านไปรอบ ๆ ผ่านฉีดพึ่งพา

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

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


3
อาจจะเรียกมันว่าคลังสินค้าแทนที่จะเป็นโรงงานหรือ : P
deceleratedcaviar

คำตอบ:


9

ฉันคิดว่าปัญหาไม่ใช่ว่ามันเป็นการออกแบบที่ไม่ดี ปัญหาคือชื่อ "Manager" นั้นไม่ใช่ตัวอักษรเช่น "Update" และ "Process" และ "Actor" ไม่มีใครช่วยเหลือคนที่พยายามทำความเข้าใจระบบนี้และมันจะสร้างความสับสนหากคุณมีคลาสอื่น ๆ ที่ดำเนินการบางอย่างกับสินทรัพย์

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

IMHO คุณลักษณะที่สำคัญที่สุดของชื่อที่ดีคือมันไม่ซ้ำกันในบริบทที่ผู้คนจะเห็น (ฐานรหัส) และง่ายต่อการจดจำ การทดสอบควรเป็นแบบที่คุณสามารถสนทนากับเพื่อนร่วมทีมของคุณที่คุ้นเคยกับรหัสโดยไม่ต้องชี้แจงสิ่งที่คุณอ้างถึง สิ่งนี้จะช่วยถ้าคุณจำเป็นต้องเขียนเอกสารอ้างอิง

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

แต่ถ้า AssetManager ของคุณเหนียวแน่นพอและไม่มีอะไรอื่นในเกมของคุณคือ AssetManagery มันอาจเป็นชื่อที่ดีอย่างสมบูรณ์


การแยก AssetLoader / AssetCache ไม่ใช่ความคิดที่ผิด
Tom Dalling

4

"ฉันจะทำสิ่งนี้ได้ในที่เดียวหรือฉันจะทำหลายอย่าง"

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

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

ท้ายสุดประเด็นสองสามข้อที่ควรคำนึงถึง:

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

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


ป.ล. นอกเหนือจากข้อโต้แย้งประเภท "Singletons is สาหัส" (ซึ่งเป็นเรื่องดันทุรังมาก) คุณเคยเห็นข้อโต้แย้งที่ดีกับ ResourceManagers หรือไม่? "เรียนเฉพาะผู้จัดการแทบไม่เคยเครื่องมือวิศวกรรมสิทธิ" เป็นข้อโต้แย้งที่ไม่ทั้งหมดสำหรับกรณีนี้โดยเฉพาะ

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