การปรับปรุง MVP ผ่าน MVC คืออะไร


49

ฉันได้อ่านสามวันเกี่ยวกับModel-View-Controller (MVC)และModel-View-Presenter (MVP)รูปแบบ และมีคำถามหนึ่งที่รบกวนจิตใจฉันอย่างมาก ทำไมนักออกแบบซอฟต์แวร์จึงคิดค้น MVP เมื่อมี MVC อยู่แล้ว

พวกเขาประสบปัญหาอะไรบ้าง MVC ไม่ได้แก้ปัญหา (หรือแก้ไขไม่ดี) แต่ MVP สามารถแก้ไขได้ MVP ปัญหาใดที่ตั้งใจจะแก้ไข?

ฉันได้อ่านบทความมากมายเกี่ยวกับประวัติและคำอธิบายของ MVP หรือเกี่ยวกับความแตกต่างระหว่าง MVC และ MVP แต่ไม่มีคำตอบที่ชัดเจนสำหรับคำถามของฉัน

ในหนึ่งในบทความที่ฉันอ่านมันก็บอกว่า:

ตอนนี้เข้าสู่ Model View Presenter ซึ่งเป็นการตอบสนองต่อความไม่เพียงพอของรูปแบบ MVC เมื่อนำไปใช้กับส่วนติดต่อผู้ใช้แบบกราฟิกที่ใช้องค์ประกอบที่ทันสมัย ในระบบ GUI ที่ทันสมัยส่วนประกอบของ GUI จะจัดการกับอินพุตของผู้ใช้เช่นการเคลื่อนไหวของเมาส์และการคลิกแทนที่จะเป็นตัวควบคุมส่วนกลาง

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



4
ฉันคิดว่ามันเป็นแค่ "The Emperor's New Clothes" คำศัพท์ใหม่จาก Mickeysoft
qwerty_so

4
Victor คุณมีคำถามเฉพาะนอกเหนือจาก "ทำไมมีสองรูปแบบที่แตกต่างกัน?" มีสองรูปแบบที่แตกต่างกันเพราะพวกเขาแก้ปัญหาเดียวกันในสองวิธีที่แตกต่างกันบ้าง หากช่วยได้แบบและมุมมองจะเหมือนกันทั้งสองรูปแบบ มุ่งเน้นไปที่ความแตกต่างระหว่างคอนโทรลเลอร์และผู้นำเสนอ คุณสามารถรับความช่วยเหลือเพิ่มเติมได้ที่นี่: linkedin.com/pulse/…
Robert Harvey

18
"ฉันได้อ่านเกี่ยวกับรูปแบบ MVC และ MVP เป็นเวลาสามวัน" Yikes ฉันขอแนะนำให้คุณไปอาบน้ำร้อนที่แสนผ่อนคลายหรือข้ามก้อนหินข้ามสระน้ำที่เต็มไปด้วยเป็ดหรืออะไรซักอย่าง การอ่านประเภทนั้นหากไม่มีแอปพลิเคชันที่ใช้งานได้จริงจะทำให้สมองคุณละลาย!
user1172763

11
วิธีที่คุณจะได้คำตอบที่ต้องการคือสร้างสิ่งที่ใช้รูปแบบเหล่านี้ จากนั้นคุณจะรู้แจ้ง
Robert Harvey

คำตอบ:


63

MVC มีแนวคิดที่สง่างาม:

  • อินพุตของผู้ใช้ถูกจัดการโดยคอนโทรลเลอร์
  • คอนโทรลเลอร์จะอัพเดตโมเดล
  • โมเดลจะอัพเดตมุมมอง / ส่วนต่อประสานผู้ใช้
           +---+
      +----| V |<----+
user  |    +---+     | updates
input |              |
      v              |
    +---+          +---+
    | C |--------->| M |
    +---+ updates  +---+

อย่างไรก็ตาม: ข้อมูลและการไหลของเหตุการณ์ใน MVC เป็นแบบวงกลม และมุมมองมักจะมีตรรกะที่สำคัญ (เช่นตัวจัดการเหตุการณ์สำหรับการกระทำของผู้ใช้) คุณสมบัติเหล่านี้ทำให้ระบบทดสอบและบำรุงรักษายาก

สถาปัตยกรรม MVP แทนที่ตัวควบคุมด้วยผู้นำเสนอซึ่งเป็นสื่อกลางระหว่างมุมมองและรูปแบบ ทำให้ระบบเป็นเส้นตรง:

       user input         updates
+---+ -----------> +---+ --------> +---+
| V |              | P |           | M |
+---+ <----------- +---+ <-------- +---+
        updates            updates

นี่มีข้อดีดังต่อไปนี้:

  • ลอจิก (เช่นตัวจัดการเหตุการณ์และสถานะส่วนต่อประสานผู้ใช้) สามารถย้ายจากมุมมองไปยังผู้นำเสนอ

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

  • เนื่องจากส่วนต่อประสานผู้ใช้ถูกแยกออกจากตรรกะของแอปพลิเคชันทั้งคู่จึงสามารถพัฒนาได้อย่างอิสระ

แต่ก็มีข้อเสียบางอย่างสำหรับวิธีการนี้:

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

7
คำตอบที่ดี แต่โดยทั่วไปแล้ว MVC ยุคปัจจุบันไม่ได้ใช้ประโยชน์จากตัวจัดการเหตุการณ์มากนัก (ยกเว้นมี) สำหรับการตรวจสอบความถูกต้องของรูปแบบในท้องที่และฉันไม่พิจารณาเหตุการณ์เหล่านั้นในส่วนของ MVC ที่เหมาะสม นั่นเป็นเหตุผลที่เรามี MVP และ MVVM MVC เป็นฝั่งเซิร์ฟเวอร์
Robert Harvey

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

4
@Victor ไม่มีรูปแบบที่ดีที่สุด แต่การแลกเปลี่ยนแตกต่างกัน MVC สามารถจับคู่สำหรับความต้องการที่ซับซ้อน ในแง่ของสถาปัตยกรรม MVP บังคับใช้ความสัมพันธ์แบบ 1: 1 ระหว่างมุมมองและผู้นำเสนอ: แต่ละมุมมองมีผู้นำเสนอของตนเองแต่ละผู้นำเสนอเชื่อมต่อกับมุมมองเดียว ใน MVC มีความสัมพันธ์ n: m มุมมองหนึ่งสามารถส่งอินพุตผู้ใช้ไปยังคอนโทรลเลอร์หลายตัวและคอนโทรลเลอร์หนึ่งสามารถรับอินพุตจากหลาย ๆ มุมมองได้ มีความยืดหยุ่นมากขึ้น แต่ก็มีความวุ่นวายมากกว่า - ไม่มี "แกน" ใน MVC
amon

1
@Victor ฉันไม่มีประสบการณ์เกี่ยวกับ GUI ดังนั้นอาจมีหลายอย่างที่ฉันไม่ได้พูดถึง GUI สุดท้ายที่ฉันทำนั้นเป็นระเบียบอย่างสมบูรณ์เพราะฉันไม่รู้ MVP ในตอนนั้น - ข้อมูลที่เป็นเชิงเส้นและการควบคุมการไหลจะได้รับการปรับปรุงอย่างมาก
amon

9
@ RobertHarvey ฉันจะยืนยันว่าสิ่งที่เว็บเรียกว่า "MVC" ไม่เคย "MVC" ตามคำจำกัดความเดิมเลย ใครก็ตามที่ถูกแย่งชิงคำย่อควรถูกหัวกลับหัวเพื่อเลือกคำที่โหลดและทำให้ทุกคนสับสน
jpmc26

6

ใน MVP ผู้นำเสนอแทนที่คอนโทรลเลอร์ของ MVC ความแตกต่างระหว่างทั้งสองก็คือผู้นำเสนอจะควบคุมมุมมองโดยตรง มันถูกออกแบบมาสำหรับเฟรมเวิร์ก UI ที่ส่วนใหญ่เป็นตัวขับเคลื่อนเหตุการณ์ (เช่นแบบฟอร์ม Windows) โดยไม่ได้รับการสนับสนุนอย่างมากสำหรับการเชื่อมโยงข้อมูลจำนวนมากที่จะให้ยืมกับรูปแบบ MVVM (เช่น WPF) มิฉะนั้นตรรกะจำนวนมากสำหรับการจัดการสถานะมุมมองและการอัพเดตโมเดลการสำรองข้อมูลจะอยู่ในมุมมองของตัวเอง

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