Model-View-Controller: ผู้ใช้โต้ตอบกับวิวหรือกับคอนโทรลเลอร์หรือไม่ [ปิด]


14

ฉันเพิ่งเรียนรู้เกี่ยวกับรูปแบบการออกแบบ MVC ฉันเรียนรู้จากหนังสือรูปแบบการออกแบบหัวแรก

ตามหนังสือเล่มนี้ (ถ้าฉันเข้าใจถูกต้อง):

โมเดลเป็นแอปพลิเคชันและข้อมูลส่วนใหญ่

มุมมองนั้นเป็น GUI ที่แสดงแบบจำลองแก่ผู้ใช้

ผู้ควบคุมมีหน้าที่รับผิดชอบในการ 'ไกล่เกลี่ย' และทำหน้าที่เป็น 'คนกลาง' ระหว่างมุมมองและโมเดล มุมมองรายงานไปยังตัวควบคุมที่ผู้ใช้ทำการกระทำและตัวควบคุมแปลเป็นวิธีการเรียกใช้ในแบบจำลอง

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

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


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

1
2 คำตอบทั้งคู่ upvoted หนึ่งพูดว่า "โต้ตอบกับมุมมอง" อีกคนบอกว่า "โต้ตอบกับตัวควบคุม" ... ทำให้ฉันคิดว่า MVC ไม่ดีสถาปัตยกรรมถ้ามันสับสนในระดับพื้นฐาน!
gbjbaanb


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

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

คำตอบ:


18

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

คำอธิบายที่ฉันให้จะขึ้นอยู่กับประสบการณ์ส่วนตัวของฉันกับการใช้งาน. NET ของ MVC การใช้งานของคุณอาจแตกต่างกัน

ควบคุมคือที่การกระทำที่มีการประมวลผลพื้นชั้นธุรกิจ คอนโทรลเลอร์ที่เรียบง่ายจะไม่ทำอะไรมากไปกว่าการรับข้อมูลจาก Model ไปยังฟีดไปที่ View คอนโทรลเลอร์ที่ซับซ้อนจะดำเนินการทุกประเภทขึ้นอยู่กับการจัดการความปลอดภัยการพิสูจน์ตัวตนการอนุญาตการลงทะเบียนและสิ่งอื่น ๆ อีกมากมาย

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

ตัวแบบเกี่ยวข้องกับข้อมูล รวมถึงการตรวจสอบข้อมูล (ถ้ามี) การจัดเก็บและดึงข้อมูลได้รับการจัดการในชั้นนี้


UPDATE

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

MVC เป็นความพยายามในการสร้างรูปแบบการแยกความกังวลสำหรับการพัฒนาซอฟต์แวร์ มันถูกนำไปใช้เป็นหลักในแอปพลิเคชันที่ทำงานบนเว็บ

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

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

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


วิกิพีเดียมีบทความเกี่ยวกับ MVC

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

จากภาพรวมของ Microsoft MVC

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

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

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

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


ถ้าคุณไม่มี GUI สำหรับการกระทำทั้งหมด จะทำอย่างไรถ้าคุณมีการใช้งาน API เฉพาะบางส่วนเท่านั้น นั่นหมายความว่าบางครั้งผู้ใช้โต้ตอบกับมุมมองและบางครั้งกับคอนโทรลเลอร์โดยตรงหรือไม่
มาห์ดี.

1
จากมุมมองของฉันไม่ API แทนที่ด้วยมุมมอง
Adam Zuckerman

แต่ API อาจจะง่ายที่วางไว้ในurl-routes Controllerฉันหมายถึงไม่มีวิวเลย ...
มาห์

1
@ AdamZuckerman ขอบคุณที่ตอบคำถาม ในความคิดเห็นถัดไปฉันจะอธิบายว่าฉันคิดว่าการใช้งาน MVC ทั่วไปได้อย่างไรโปรดยืนยันว่าถูกต้องหรือไม่ ขอบคุณ
Aviv Cohn

2
@Mahdi API หมายถึงมีส่วนติดต่อการเขียนโปรแกรมไม่ใช่ส่วนต่อประสานผู้ใช้ โปรแกรมโต้ตอบกับ API ผู้ใช้โต้ตอบกับมุมมอง
Eric King

4

โต้ตอบผู้ใช้ที่มีตัวควบคุม จากจุดของมุมมองทางเทคนิคที่คุณไม่ได้มีปฏิสัมพันธ์กับดูคุณก็ใช้มันในการโต้ตอบกับตัวควบคุม

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

ไม่ใช่ทุกแอปพลิเคชั่น - แม้แต่ MVC เว็บแอพพลิเคชั่นก็มี GUI คุณอาจโต้ตอบกับตัวควบคุมผ่านทาง API - ง่ายเพียงแค่url-routesยกตัวอย่างเช่นอยู่ในควบคุมตัวเอง

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


2
+1 สิ่งนี้ถูกต้อง สิ่งต่างๆเช่นเมนูและแถบเครื่องมือเป็นส่วนหนึ่งของ GUI แต่ไม่ใช่ส่วนหนึ่งของมุมมองและตรงไปที่ตัวควบคุม การกดแป้นเช่นเดียวกัน
david.pfx

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

1
@Mahdi ฉันจะบอกว่าในกรณีนั้นไม่มีการโต้ตอบกับผู้ใช้เลยเป็นมุมมองที่สื่อสารกับคอนโทรลเลอร์โดยทางโปรแกรม การโต้ตอบเท่านั้นที่เริ่มโดยผู้ใช้ผ่านมุมมอง
Eric King

1
@ david.pfx Keystrokes ไม่สามารถไปโดยตรงจากหน้าต่างเบราว์เซอร์ไปยังคอนโทรลเลอร์
Adam Zuckerman

1
@Izkata "มุมมองเป็นส่วนหนึ่งของรหัสที่ส่งคำขอไปยัง" - ขออภัย แต่นี่เป็นสิ่งที่แย่ที่สุดที่ฉันได้ยินที่นี่ เป็นไปได้ยังไง? คุณสามารถสำรองข้อมูลโดยการอ้างอิงในบทความหรือหนังสือได้หรือไม่?
มาห์ดี

1

ลองใช้ตัวอย่างที่เป็นรูปธรรมว่าทำไมผู้ใช้โต้ตอบโดยตรงกับมุมมองไม่ใช่ตัวควบคุม

ในแอพเพลงบน iPhone คุณสมบัติระดับสูงคือเล่นเพลย์ลิสต์ "Play a play" เป็นฟังก์ชั่นของคอนโทรลเลอร์สำหรับแอพ

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

ความคิดเห็นในแต่ละมุมมองก็แตกต่างกันเช่นกัน Siri จะบอกคุณว่ากำลังเล่นเพลงที่คุณขอ แอพเพลงจะแสดงคำติชมด้วยภาพว่ากำลังเล่นเพลย์ลิสต์

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