M ใน MVC อยู่ที่ไหน


14

ฉันพยายาม refactor ใบสมัครของฉันเป็น MVC แต่ฉันติดอยู่ที่ส่วน M

ในแอปที่มีฐานข้อมูลสำรองโมเดลจะถูกนำไปใช้ในรหัสแอปใช่ไหม

แต่แล้วอะไรคือสิ่งที่อยู่ในฐานข้อมูล - นั่นไม่ใช่แบบจำลองหรือไม่

(ฉันไม่ได้ใช้ฐานข้อมูลเป็นที่เก็บวัตถุแบบง่าย - ข้อมูลในฐานข้อมูลเป็นสินทรัพย์ขององค์กร)


I'm not using the database as a simple object store. ฉันเดาว่านั่นหมายถึงตรรกะทางธุรกิจบางอย่างในฐานข้อมูลในรูปแบบของขั้นตอนการจัดเก็บ ในทางทฤษฎีที่ขัดแย้งกับ MVC แต่ในทางปฏิบัติมันไม่สำคัญ
yannis

@YannisRizos - มีคือ BL ใน DB แต่สิ่งที่ผมหมายถึงว่าเป็นที่ฉันต้องการให้ข้อมูลใน DB ที่จะมีชีวิตและความหมายเกินกว่าแอพลิเคชัน

3
I want the data in the DB to have a life and meaning beyond the application.อะไร?
yannis

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

1
นั่นจะไม่เป็นปัญหาหากมีรูปแบบสำหรับสิ่งใดก็ตามที่มีอยู่ที่ต้องมีการแบ่งปันนั่นจะกลายเป็นส่วนหนึ่งของข้อกำหนดสำหรับรูปแบบการจัดเก็บ สิ่งใดในอนาคตที่ต้องการมันในรูปแบบอื่นสามารถมีงาน ETL หรือแปลงเป็น DAL
StuperUser

คำตอบ:


46

ใช่ทั้งโมเดลในรหัสและฐานข้อมูลคือ "Model"

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

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


15
ดังนั้นจากมุมมองของ C และ V ว่ามีฐานข้อมูลเป็นเพียงรายละเอียดการดำเนินการของ M หรือไม่?

อย่างแน่นอน. ใช้ถ้อยคำอย่างดี
herby

3
@ MattFenwick จากมุมมองของ C และ V ไม่มีฐานข้อมูล คุณกำลังใช้ฐานข้อมูลเป็นมากกว่าการจัดเก็บข้อมูลในแง่ MVC ฐานข้อมูลเป็นเพียงการจัดเก็บข้อมูล แต่มันก็ใช้ได้ดีถ้ามันเหมาะกับใบสมัครของคุณ
yannis

5
+1 สำหรับ "อย่าคิด mvc"
Javier

2
"กันตรรกะทางธุรกิจของคุณออกจากฐานข้อมูลและ UI" - นี่
David Murdoch

17

Trygve Reenskaug เขียนบทความเริ่มต้นที่อธิบายรูปแบบ MVC ในปี 1978 ตัวแบบในคำอธิบายของเขาคือแบบจำลองวัตถุที่แสดงวัตถุในโลกแห่งความเป็นจริงปรากฏการณ์และแนวคิด ในสถานการณ์สมมติของคุณที่มีแอปพลิเคชันที่มีฐานข้อมูลสำรองโมเดลนั้นเป็นเส้นโครงของข้อมูลของคุณ เพื่อให้ง่ายขึ้นโมเดลคือคลาสและความสัมพันธ์ของแอปพลิเคชันของคุณที่เกี่ยวข้อง

ในทางปฏิบัติมักจะมีสองรุ่นที่ใช้ใน MVC, รูปแบบโดเมน (การแมปอะไรกับฐานข้อมูลของคุณ) และรูปแบบของแอปพลิเคชัน โมเดลของแอปพลิเคชั่นเป็นโครงร่างของโดเมนโมเดลที่มีข้อมูลเฉพาะของมุมมองสำหรับการเรนเดอร์มุมมอง วิธีการนี้เรียกว่าMMVC คอนโทรลเลอร์จะโต้ตอบกับโดเมนโดยตรงและแสดงแอปพลิเคชันโมเดลให้กับมุมมอง ในรูปแบบ MVVM จะรวมโมเดลของแอปพลิเคชันและคอนโทรลเลอร์


+1: ฉันชอบคำตอบนี้ดีที่สุด The model is a projection of your data.ฐานข้อมูลถูกออกแบบมาเพื่อเก็บข้อมูลอย่างมีประสิทธิภาพสูงสุดสำหรับการเข้าถึงและการจัดทำดัชนี ควรออกแบบโมเดลรอบโดเมนธุรกิจแทน
Joel Etherton

the Domain Model (what's mapping to your database)เอาฉันที่สองที่จะแยกวิเคราะห์ คำตอบที่ดี!

2
+1 นี่เป็นคำอธิบายที่ยอดเยี่ยมเกี่ยวกับรสชาติที่แตกต่างที่ MVC พัฒนาขึ้น
Ryan Hayes

ขอบคุณเพื่อน. ฉันดำน้ำลึกเข้าไปในสิ่งนี้ในขณะที่เขียนหนังสือของฉัน ดีใจที่มันเข้าท่า!
Michael Brown

3
  1. คุณไม่ต้องการฐานข้อมูลสำหรับ MVC หากแบบจำลองของคุณเกิดขึ้นกับการพูดคุยกับฐานข้อมูล นอกจากนี้ยังสามารถยืนยันตัวเองเป็นไฟล์แบนหรือไม่ยืนยันตัวเองเลย

  2. รุ่นนี้เป็นที่เก็บข้อมูลในหน่วยความจำในแอปพลิเคชันของคุณ คุณจะต้องใช้แบบจำลองเพื่อทำการคำนวณและตรวจสอบความถูกต้องของข้อมูล ตัวอย่างเช่นคุณมีรูปแบบ FinancePayment พร้อมคุณสมบัติเช่นอัตราดอกเบี้ยข้อกำหนดและหลักการ คุณอาจเพิ่มวิธี getMonthlyPayment () ลงในแบบจำลองของคุณเพื่อคำนวณการชำระเงินรายเดือน คุณไม่ต้องการทำเช่นนั้นในตัวควบคุมหรือมุมมอง

  3. มุมมองควรเป็นสิ่งที่สมเหตุสมผลไม่ว่าจะไม่มีเหตุผลใด ๆ หรือใช้การเชื่อมโยงข้อมูลอย่างง่าย (ดูรูปแบบ Passive View and Supervising Controller บนเว็บไซต์ของ Martin Fowler ) มุมมองจะเพิ่มเหตุการณ์เมื่อผู้ใช้ทำสิ่งต่าง ๆ เช่นการคลิกปุ่ม

  4. คอนโทรลเลอร์มีหน้าที่จัดการเหตุการณ์ (เรียกใช้โค้ดบางอย่างเมื่อผู้ใช้คลิกปุ่มบันทึก) และสำหรับการตั้งค่าคุณสมบัติของโมเดลและบอกให้โมเดลโหลดและบันทึกเอง (ถ้าใช้การคงอยู่) คอนโทรลเลอร์ไม่ควรทำการคำนวณกับข้อมูลของโมเดล อย่างไรก็ตามในคอนโทรลเลอร์คุณอาจทำการคำนวณบางอย่างในนามของมุมมองเช่น "if model.profit () <0 จากนั้น widget.colour = 'red'"

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

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


ถูกต้อง! ชัดเจนมาก

2

รุ่นคือรหัสที่มีการเชื่อมต่อกับ V และ C ในส่วนหน้าและไปยังที่จัดเก็บข้อมูลถาวร (สามารถเป็นอะไรก็ได้จากไฟล์ไปยังฐานข้อมูล SQL / NoSQL) ในส่วนหลัง ไม่เพียง แต่รหัสที่โหลดจาก db และร้านค้าไปยัง db (ซึ่งเป็นหนึ่งในความเข้าใจผิดของรุ่น) แต่เป็นรหัสที่ใช้งานได้จริง "โดเมน" ทั้งหมด - เลือกกรองเปลี่ยนแก้ไขคำนวณตัดสินใจ ข้อมูล. รวมตรรกะที่ไม่ใช่ UI ทั้งหมดของแอปพลิเคชัน


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

(เหนือถือเพียงสำหรับสถานการณ์เมื่อข้อมูลในฐานข้อมูลไม่ได้ใช้ร่วมกันกับโปรแกรมอื่น)
Herby

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

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

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

2

สละมุมมองที่ง่ายและเป็นอุดมคติ

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

มุมมองควรเป็นรูปแบบของส่วนหน้าของแอปพลิเคชันและตัวควบคุมควรเป็นแบบจำลองของโฟลว์จากมุมมองหนึ่งไปอีกมุมมองหนึ่ง

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


1

เพื่อความเข้าใจของฉัน MVC เป็นเพียงคำอธิบายของรูปแบบสถาปัตยกรรมของแอปพลิเคชันไคลเอ็นต์ของคุณ ภาพในวิกิพีเดียแสดงเพียงแค่นี้:

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

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


1
But then, what is in the database -- is that not also the model?

ไม่มันไม่ใช่. " รูปแบบการจัดการพฤติกรรมและข้อมูลของโดเมนแอปพลิเคชัน" บ่อยครั้งที่ Model hooks ลงในฐานข้อมูลใช่ แต่ก็ไม่มีข้อกำหนดใด ๆ โมเดลเป็นเลเยอร์ใหม่ระหว่างแอปพลิเคชันของคุณและฐานข้อมูล แบ็คเอนด์อาจเป็นชุดของวัตถุจำลอง, XML หรือสิ่งอื่นที่สนับสนุนการคงอยู่ของข้อมูล

โดยการแยกชั้นที่คุณให้ความยืดหยุ่นมากขึ้นในการใช้แนวทางการทดสอบหน่วยที่ดีกว่าทำให้โค้ดที่จัดการได้ง่ายขึ้น (EG SQL ถูกแทนที่ด้วย Oracle) ท่ามกลางประโยชน์อื่น ๆ

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

การแยกเหล่านี้เป็นกุญแจสำคัญในการอนุญาตให้การควบคุมกลับทำงานได้


+1 สำหรับคำตอบที่ยอดเยี่ยมและให้ข้อมูลมาก แม้ว่าฉันจะแนะนำว่าประโยคสุดท้ายสมควรได้รับการชี้แจง IoC นั้นไม่จำเป็นต้องเป็นที่รู้จักและเข้าใจอย่างกว้างขวางดังนั้นจึงอาจเพิ่มความสับสนเล็กน้อย คำอธิบายที่มีประโยชน์จริง ๆ ของสิ่งที่คุณหมายถึงโดยที่อาจเกินขอบเขตของคำตอบ SE มีสติ แต่มันก็กระโดดออกมาที่ฉัน
Adam Crossland

อย่างไรก็ตามถ้าคุณวางตรรกะทางธุรกิจของคุณในขั้นตอนการจัดเก็บแล้วใช่ฐานข้อมูลจะรวมรูปแบบ (โดยส่วนตัวแล้วฉันจะไม่แนะนำวิธีการนี้)
Roy Tinker

1
@Roy Tinker - ไม่นั่นไม่สำคัญ แบบจำลองถูกแยกออกจากแนวคิด จะมีเอนทิตีที่รวมเข้ากับฐานข้อมูลภายในเลเยอร์ เอนทิตีเหล่านี้ควรยังคงถูกแยกออกจากเอนทิตีอื่น ๆ ที่มีอยู่ภายในโมเดลที่มีความสัมพันธ์อื่น (ตัวอย่างเช่นจำลอง) คอนโทรลเลอร์ควรทำการโทรไปยัง Model ในลักษณะที่ไม่มีความรู้ว่าข้อมูลมาจากไหนและอย่างไร การตัดสินใจนี้ควรจะทำด้วยการฉีดพึ่งพาและ IoC (โดยทั่วไปมันเป็นอินเทอร์เฟซที่สามารถเชื่อมโยงกับแบ็กเอนด์ต่าง ๆ , เยาะเย้ยหรือ DB)
P.Brian.Mackey

1

ฐานข้อมูลคือรายละเอียดการนำไปใช้ของโมเดล โมเดลควรเป็นโมเดลโดเมนแบบเต็มและควรรวมข้อมูลและกระบวนการ การแยกควรอยู่ระหว่างความกังวลที่แตกต่างไม่ใช่ระหว่างกระบวนการและข้อมูลที่เกี่ยวข้องกับกระบวนการนั้น

ดูเพิ่มเติมที่: http://martinfowler.com/bliki/AnemicDomainModel.html


0

มันง่ายมากจริง ๆ "Model" แสดงถึงสิ่งที่เป็นนามธรรมสำหรับอินเทอร์เฟซข้อมูล นั่นคือเหตุผล:

  • ฐานข้อมูลถือเป็นส่วนหนึ่งของโมเดลแต่ไม่ใช่โมเดล
  • ข้อมูลของ Model นั้นมาจากฐานข้อมูลไฟล์บริการบนเว็บหรือแม้แต่ล้อเลียน
  • คลาสของโมเดลใน MVC, HMVC หรือเฟรมเวิร์กที่คล้ายกันควรเก็บเคียวรี (ดู"หลักการแบบจำลองไขมันตัวควบคุมผอม" [ 1 ] [ 2 ] [ 3 ]

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


0

ฉันคิดว่า M มีตรรกะและเก็บข้อมูลไว้ในฐานข้อมูล คอนโทรลเลอร์เรียกใช้งานโมดูลที่จะดำเนินการและโมดูลนี้จะดำเนินการ logics และเก็บข้อมูลในฐานข้อมูล (อาจมีเลเยอร์คงที่) จากนั้นโมดูลนี้จะส่งคืนค่า V


0

M (odel) ใน MVC ควรจับภาพรูปแบบของธุรกิจ / โดเมนในที่เดียว

ซึ่งควรรวมถึงกฎเกณฑ์ทางธุรกิจของโดเมนรวมถึงโครงสร้าง

C (ตัวควบคุม) sholuld นึกคิดเกี่ยวกับตัวเองด้วยการเป็นสื่อกลางข้อมูลของรูปแบบธุรกิจไปยังงานนำเสนอ (เช่นมุมมอง) และจับภาพอินพุตผู้ใช้จาก V (iew) เพื่อเริ่มการเปลี่ยนแปลงสถานะของโมเดล

เลเยอร์ฐานข้อมูลดีลเท่านั้น (หรือควรจัดการเท่านั้น) ด้วยความคงอยู่ของสถานะของโมเดล ณ เวลาใดเวลาหนึ่ง

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


0

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

การโต้ตอบระหว่างตัวแบบและข้อมูลที่เก็บอาจเกิดขึ้นในชั้นข้อมูลแยกต่างหากหรือโดยตรงในตัวแบบซึ่งเป็นกรณีเมื่อใช้ ORM (Object Relational Mapper) กล่าวอีกนัยหนึ่งคือรูปแบบการเชื่อมต่อโดยตรงกับฐานข้อมูลหรือส่งผ่านข้อมูลไปยังวัตถุ "data access" อื่น ๆ ซึ่งเชื่อมต่อกับฐานข้อมูล

ORM (Mapper Object Relation Mapper) จะแมปฟิลด์ในตารางฐานข้อมูลกับแอตทริบิวต์ของวัตถุจำลองของคุณโดยให้ getters และ setters ในกรณีนี้ไม่มีชั้นข้อมูลแยกต่างหากและตัวแบบมีหน้าที่รับผิดชอบโดยตรงในการคงข้อมูลไว้

นี่คือตัวอย่างทับทิมโดยใช้ActiveRecordORM ยอดนิยม:

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Priceเป็นเขตข้อมูลในhousesตารางที่ตรวจพบโดยอัตโนมัติโดยActiveRecordเพิ่มตัวคั่นและตัวตั้งค่าเข้ากับวัตถุ เมื่อsaveเรียกว่าค่าของแอตทริบิวต์ราคาจะคงอยู่กับฐานข้อมูล

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

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


-1

ใช่คุณถูก.

(ตัวควบคุมมุมมองแบบจำลอง)

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

ในทางปฏิบัติมุมมอง MVC และตัวควบคุมมักจะรวมกันเป็นวัตถุเดียวเพราะมีความสัมพันธ์กันอย่างใกล้ชิด ตามMSDN

ตัวควบคุมตีความอินพุตของเมาส์และคีย์บอร์ดจากผู้ใช้เพื่อแจ้งรุ่นและ / หรือ the view to change as appropriate.

ตรวจสอบแผนภาพนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างเช่นรหัสคอนโทรลเลอร์จะตรวจสอบความถูกต้องของข้อมูลและทำให้มันถูกส่งคืนในมุมมอง วัตถุตัวควบคุมมุมมองถูกเชื่อมโยงกับแบบจำลองเดียวเท่านั้น อย่างไรก็ตามa model can have many view-controller objects associated with it.


4
In practice, MVC views and controllers are often combined into a single object because they are closely related.ถ้าคุณทำอย่างนั้นคุณกำลังทำผิด ...
yannis

ไดอะแกรมมาจากไหน และคำจำกัดความจากที่ไหน โปรดอย่าคัดลอกเนื้อหาจากอินเทอร์เน็ตโดยไม่มีการระบุแหล่งที่มาที่เหมาะสม
yannis

@Yannis Rizos - เขาอ้างถึงเอกสาร MS มันไม่ได้อยู่ที่บริบท แต่พวกเขาบอกว่าแอปพลิเคชันที่ไม่ใช่เว็บมักจะมีมุมมอง / ตัวควบคุมร่วมกัน แต่เว็บแอปพลิเคชันมีความแตกต่างที่ชัดเจนมาก นี่อาจเป็นหนึ่งในเหตุผลที่คุณไม่เห็น MS ดัน MVC สำหรับแอพ windows (MVVM แทน) เพียงเว็บแอป msdn.microsoft.com/en-us/library/ff649643.aspx
P.Brian.Mackey

1
@ P.Brian.Mackey ฉันสงสัยว่า MS เป็นอะไรที่อยู่เบื้องหลังสิ่งนี้: P
yannis

ฉันได้แก้ไขคำตอบของคุณเพื่อรวมลิงค์ @ P.Brian.Mackey ที่ให้ไว้ มันโอเคที่จะอ้างแหล่งข้อมูลภายนอกอย่างสมบูรณ์ แต่คุณต้องมีลิงค์ไปยังแหล่งข้อมูลเหล่านั้น MVVM ก็อาจคล้ายกับ MVC มาก แต่ก็ไม่ใช่รูปแบบเดียวกัน ใน MVC มุมมองและควบคุมไม่ควรที่จะรวมกันเป็นวัตถุเดียว ...
Yannis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.