ก่อนอื่นตัวอย่างที่คุณให้นั้นไม่มีประสิทธิภาพอย่างไม่น่าเชื่อ มันไม่มีประสิทธิภาพเพียงเล็กน้อยเท่านั้น ความไร้ประสิทธิภาพต่ำกว่าระดับที่เข้าใจได้ แต่ในกรณีใด ๆ มาต่อกับคำถาม
วิธีที่ผมเข้าใจมันเมื่อเราพูดถึงการแยกของ UI และ Logicเราหมายถึงการหลีกเลี่ยงการมีเพศสัมพันธ์อย่างใกล้ชิด
Close couplingหมายถึงสถานการณ์ที่ UI รู้ (และเรียกใช้) ตรรกะและตรรกะรู้ (และเรียกใช้) UI เพื่อหลีกเลี่ยงการมีเพศสัมพันธ์อย่างใกล้ชิดไม่จำเป็นต้องหันไปใช้ข้อต่อร่วมกันโดยสิ้นเชิง (นั่นคือสิ่งที่คุณดูเหมือนจะมีจุดมุ่งหมายด้วยการทำลายอินเทอร์เฟซระหว่างพวกเขาลงไปที่ส่วนต่อประสานสายอักขระที่ใช้ร่วมกันน้อยที่สุด) สิ่งหนึ่งที่ต้องทำคือการใช้ข้อต่อหลวมๆ
การมีเพศสัมพันธ์แบบหลวมหมายความว่า A รู้จัก B แต่ B ไม่รู้ว่า A. ในคำอื่น ๆ ทั้งสองฝ่ายที่เกี่ยวข้องมีบทบาทลูกค้าและเซิร์ฟเวอร์ที่แตกต่างกันโดยที่ลูกค้ารู้จักเซิร์ฟเวอร์ แต่เซิร์ฟเวอร์ไม่รู้จักลูกค้า
ในกรณีของ UI และตรรกะวิธีที่ดีที่สุดในการจัดเรียงนี้ในความคิดของฉันคือการเห็นตรรกะเป็นเซิร์ฟเวอร์และ UI เป็นลูกค้า ดังนั้น UI จึงถูกสร้างขึ้นสำหรับตรรกะมีความรู้เกี่ยวกับตรรกะและเรียกใช้ตรรกะในขณะที่ตรรกะไม่ได้รู้อะไรเกี่ยวกับ UI และตอบสนองต่อคำขอที่ได้รับ (และคำขอเหล่านี้เกิดขึ้นจาก UI แต่ตรรกะไม่ทราบว่า)
หากต้องการวางไว้ในแง่ที่เป็นจริงมากขึ้นไม่มีที่ไหนในไฟล์ซอร์สโค้ดของลอจิกหากคุณพบคำสั่ง include / import / using ใด ๆ ที่อ้างถึงไฟล์ UI ในขณะที่ไฟล์ซอร์สโค้ดของ UI จะเต็มไปด้วย include / import / using คำสั่งที่อ้างถึงไฟล์ลอจิก
ดังนั้นเพื่อกลับมาที่กรณีของคุณไม่มีอะไรผิดปกติกับความจริงที่ว่ารหัส UI ที่ใส่กล่องคำสั่งผสมรู้เกี่ยวกับชั้นแฮมเบอร์เกอร์ จะมีปัญหาหากระดับแฮมเบอร์เกอร์รู้อะไรเกี่ยวกับกล่องคำสั่งผสม
อนึ่งการออกแบบนี้ช่วยให้สิ่งอื่นที่คุณคาดหวังจากระบบดังกล่าว: มันเป็นไปได้ที่จะเสียบ UIs ที่แตกต่างกันมากเท่าที่คุณต้องการตรรกะและสิ่งทั้งหมดควรยังคงทำงาน