ฉันทำงานเกี่ยวกับการออกแบบ แต่กดปุ่มสิ่งกีดขวางบนถนนต่อไป ฉันมีคลาสเฉพาะ (ModelDef) ที่เป็นหลักเจ้าของต้นไม้โหนดซับซ้อนที่สร้างขึ้นโดยการแยก XML schema (คิด DOM) ฉันต้องการปฏิบัติตามหลักการออกแบบที่ดี (SOLID) และตรวจสอบให้แน่ใจว่าระบบผลลัพธ์นั้นสามารถทดสอบได้ง่าย ฉันมีความตั้งใจที่จะใช้ DI เพื่อส่งผ่านการพึ่งพาในตัวสร้างของ ModelDef (เพื่อให้สามารถสลับสิ่งเหล่านี้ได้อย่างง่ายดายถ้าจำเป็นระหว่างการทดสอบ)
แม้ว่าสิ่งที่ฉันกำลังดิ้นรนคือการสร้างทรีโหนด ต้นไม้นี้จะถูกสร้างขึ้นด้วยวัตถุ "ค่า" อย่างง่ายซึ่งไม่จำเป็นต้องทำการทดสอบอย่างอิสระ (อย่างไรก็ตามฉันยังอาจส่ง Abstract Factory ไปยัง ModelDef เพื่อช่วยในการสร้างวัตถุเหล่านี้)
แต่ฉันอ่านต่อไปว่าคอนสตรัคเตอร์ไม่ควรทำงานจริงใด ๆ (เช่นFlaw: Constructor ทำงานจริง ) นี่เป็นเหตุผลที่เหมาะสมสำหรับฉันหาก "งานจริง" หมายถึงการสร้างวัตถุที่ต้องอาศัยน้ำหนักมากซึ่งในภายหลังอาจต้องการเริ่มต้นการทดสอบ (สิ่งเหล่านั้นควรถูกส่งผ่านทาง DI)
แต่สิ่งที่เกี่ยวกับวัตถุค่าน้ำหนักเบาเช่นต้นไม้โหนดนี้ ต้องสร้างต้นไม้ที่ไหนสักแห่งใช่มั้ย ทำไมไม่สร้างผ่าน ModelDef (ใช้, พูด, buildNodeTree () วิธี)?
ฉันไม่ต้องการสร้างทรีโหนดด้านนอกของ ModelDef แล้วผ่านมันใน (ผ่านตัวสร้าง DI) เนื่องจากการสร้างทรีโหนดโดยการแยกสคีมาต้องใช้รหัสที่ซับซ้อนจำนวนมาก - รหัสที่ต้องทดสอบอย่างละเอียด . ฉันไม่ต้องการผลักไสให้เป็นรหัส "กาว" (ซึ่งควรจะค่อนข้างเล็กและจะไม่ถูกทดสอบโดยตรง)
ฉันคิดว่าการวางโค้ดเพื่อสร้างโหนดทรีในวัตถุ "ตัวสร้าง" ที่แยกต่างหาก แต่ลังเลที่จะเรียกมันว่า "ตัวสร้าง" เพราะมันไม่ตรงกับรูปแบบของตัวสร้าง (ซึ่งดูเหมือนจะเกี่ยวข้องกับการกำจัดเหลื่อมมากกว่า) ก่อสร้าง) แต่แม้ว่าฉันจะเรียกมันว่าสิ่งที่แตกต่าง (เช่น NodeTreeConstructor) มันก็ยังรู้สึกเหมือนแฮ็คเล็กน้อยเพื่อหลีกเลี่ยงการมีตัวสร้าง ModelDef สร้างโหนดต้นไม้ มันจะต้องมีการสร้างที่ไหนสักแห่ง; ทำไมไม่อยู่ในวัตถุที่จะเป็นเจ้าของ?