ใน MVC หลายมุมมองสามารถมีคอนโทรลเลอร์เดียวกันหรือหนึ่งมุมมองต้องมีคอนโทรลเลอร์ที่ไม่ซ้ำใคร


15

ฉันมีคำถามในขณะที่ออกแบบสถาปัตยกรรมสำหรับโครงการรอบ MVC (เป็นโครงการ SDK C ++ / Marmalade ฉันไม่ได้ใช้กรอบ MVC ใด ๆ โดยเฉพาะฉันกำลังทำอยู่)

ในหลาย ๆ บทความ (เช่นเดียวกับบทความเดิมของ Steve Burbek ) ฉันอ่านแนวคิด "MVC triad" ที่ทำให้ฉันรู้สึกแย่ตั้งแต่ที่ฉันใช้แนวคิดนี้ไป เมื่อฉันอ่านครั้งแรกดูเหมือนว่าแอปพลิเคชันจะถูกสร้างขึ้นรอบ ๆ "MVC triad" - หนึ่งชิ้นสำหรับแต่ละส่วน UI ที่ฉันควรจะ - แต่ฉันพบว่ามันค่อนข้างไม่ยืดหยุ่นและฉันคิดว่านั่นไม่ใช่วิธีที่ MVC ตั้งใจใช้ จากนั้นทำการค้นคว้าเพิ่มเติมเกี่ยวกับปัญหาฉันพบตัวอย่างของการมีเพศสัมพันธ์อย่างแน่นหนาของคอนโทรลเลอร์และมุมมองคือความสัมพันธ์แบบ 1 ต่อ 1 - TextEditView มี TextEditController

แต่เมื่อฉันกลับไปที่โครงการของฉันฉันพบว่าอาจเป็นประโยชน์ที่จะมีตัวควบคุมหนึ่ง (โดย 'หน่วยทางลอจิคัล' เช่น AddElementController) และหลายมุมมองสำหรับตัวควบคุมนั้น

ฉันคิดอย่างชัดเจนเกี่ยวกับบางสิ่งบางอย่างเช่น AddElementController ที่ควรมีแท็บ UI บางประเภท ฉันควรมี AddElementController ที่มี AddElementTabView และหลาย AddImageView, AddSoundView ฯลฯ สำหรับแท็บหรือไม่ หรือฉันควรจะมี 'ตัวควบคุมย่อย' ที่แตกต่างกันสำหรับแต่ละมุมมองแท็บ

โดยสรุปและเกี่ยวกับรูปแบบ MVC (ไม่ใช่ความเข้าใจเฉพาะของกรอบ X / การนำไปใช้ของรูปแบบนี้) ถูกต้องหรือไม่ที่จะมีมุมมองหลายอย่างสำหรับตัวควบคุมหรือแต่ละมุมมองควรมีตัวควบคุมเฉพาะหรือไม่

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

ขอบคุณทุกคนล่วงหน้า

คำตอบ:


14

ปัญหาคือรูปแบบ MVC ได้รับการออกแบบในระบบที่ไม่มีอยู่จริงอีกต่อไป มันถูกคิดค้นใน Smalltalk ในเวลาที่ไม่มีห้องสมุด UI ในการสร้างหน้าต่างโต้ตอบให้คุณดึงกล่องทั้งหมดให้เน้นสี่เหลี่ยมที่เหมาะสมตรวจสอบให้แน่ใจว่าข้อความที่คุณวาดถูกลงท้ายด้วยจุดที่ถูกต้อง ... ฯลฯ ...

ลองนึกภาพว่าจะชอบเขียนแอปโต้ตอบโดยไม่ใช้อะไรนอกจากผ้าใบผืนใหญ่ผืนหนึ่ง นั่นคือโลกที่ MVC มาจาก

"มุมมอง" ในระบบนี้เป็นกล่องข้อความและเป็นคลาสที่รับผิดชอบการวาดกล่องข้อความการวาดพื้นที่ที่เลือกตอบสนองต่อการเปลี่ยนแปลงของข้อความ ฯลฯ ...

"คอนโทรลเลอร์" เป็นอีกคลาสหนึ่งที่นำเหตุการณ์เมาส์ที่เกิดขึ้นภายในกล่องเช่นการเลื่อนเมาส์, คีย์ลง, คีย์, คลิก, ฯลฯ ... และมันจะตัดสินใจว่าเกิดอะไรขึ้น เราควรเปลี่ยนข้อความหรือไม่ เราควรเปลี่ยนการเลือกหรือไม่ สิ่งที่ต้องการ

"model" เป็นอีกคลาสหนึ่งที่แสดงข้อมูลพื้นฐานและสถานะของส่วนประกอบ แบบจำลองกล่องข้อความจะมีข้อความแน่นอนแบบอักษรการเลือก ฯลฯ ...

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

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

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

คุณยังสามารถเรียกความสัมพันธ์เช่นนี้ว่า "สาม" ได้หรือไม่? บางที แต่ฉันคิดว่ามันบอกเป็นนัยว่าแอปพลิเคชัน MVC รุ่นเก่าที่เก่ากว่ามากเกินไป

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


5

มันขึ้นอยู่กับ. MVC มีหลายรูปแบบบางแบบที่ความสัมพันธ์แบบ 1: 1 เข้าท่า (เช่น "กล่องโต้ตอบต่ำต้อย") และอื่น ๆ ที่ไม่ใช่กรณีนี้ ฉันขอแนะนำให้อ่านบทความชุด " Build Your CAB ของคุณเอง " เพื่ออธิบายตัวแปร MVC ที่สำคัญที่สุด


3

มุมมองไม่มีตัวควบคุมใน MVC ตัวควบคุมเป็นเจ้านายดังนั้นตัวควบคุมจะตัดสินใจว่าจะให้มุมมองใดที่จะแสดงผลและมุมมองไม่ได้ / ไม่สนใจว่าตัวควบคุมตัวใดที่ร้องขอมุมมอง

คุณสามารถ / จะมีหลายมุมมองจากคอนโทรลเลอร์ แค่คิดเกี่ยวกับการสร้างแบบจำลองสำหรับแต่ละมุมมองถ้าคุณต้องการใช้รูปแบบ MVC


3

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

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

ตัวควบคุมอาจส่งคืนมุมมองเดียวกันเสมอ (1: 1) หากมีคำขอเพียงประเภทเดียวที่ผู้ใช้สามารถควบคุมได้และมันต้องการการตอบสนองแบบเดียวกันเสมอ ตัวอย่างเช่นHelloWorldControllerจะส่งคืนการHelloWorldViewแสดง "Hello, World!" เสมอ

ในอีกด้านหนึ่งตัวควบคุมมักจะต้องตัดสินใจในมุมมองที่แตกต่างกันขึ้นอยู่กับสิ่งที่โมเดลบอก TeamRosterControllerอาจกลับRugbyTeamRosterViewหรือFootbalTeamRosterViewขึ้นอยู่กับชนิดของทีมที่มีการร้องขอ

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

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

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