Sự khác biệt giữa mẫu thiết kế MVC, MVP & MVVM về mặt mã hóa c #


202

Nếu chúng tôi tìm kiếm Google bằng cụm từ "Sự khác biệt giữa mẫu thiết kế MVC, MVP & MVVM" thì chúng tôi có thể nhận được một vài URL thảo luận về sự khác biệt giữa mẫu thiết kế MVC MVP & MVVM về mặt lý thuyết như :

MVP

Sử dụng trong các tình huống mà liên kết thông qua một datacontext là không thể. Windows Forms là một ví dụ hoàn hảo về điều này. Để tách chế độ xem khỏi mô hình, cần có người thuyết trình. Vì chế độ xem không thể liên kết trực tiếp với người trình bày, thông tin phải được chuyển đến chế độ xem qua giao diện (IView).

MVVM

Sử dụng trong các tình huống có thể liên kết thông qua một datacontext. Tại sao? Các giao diện IView khác nhau cho mỗi chế độ xem được loại bỏ có nghĩa là ít mã hơn để duy trì. Một số ví dụ có thể có MVVM bao gồm các dự án WPF và javascript bằng Knockout.

MVC

Sử dụng trong các tình huống không phải lúc nào kết nối giữa chế độ xem và phần còn lại của chương trình (và bạn không thể sử dụng hiệu quả MVVM hoặc MVP). Điều này mô tả rõ ràng tình huống mà API web được tách ra khỏi dữ liệu được gửi đến trình duyệt máy khách. ASP.NET MVC của Microsoft là một công cụ tuyệt vời để quản lý các tình huống như vậy và cung cấp một khung MVC rất rõ ràng


Nhưng tôi đã không tìm thấy một bài viết nào thảo luận về sự khác biệt về mặt lý thuyết cùng với mã mẫu.

Sẽ thật tuyệt nếu tôi nhận được một bài viết thảo luận về sự khác biệt giữa 3 mẫu thiết kế này (MVC, MVP & MVVM) cùng với mã.

Tôi muốn có được mã nguồn của 3 ứng dụng CRUD tương tự đã được triển khai bởi ba mẫu thiết kế này (MVC, MVP & MVVM). Để tôi có thể duyệt mã và hiểu cách người ta nên viết mã cho ba mẫu thiết kế này (MVC, MVP & MVVM).

Vì vậy, nếu có bất kỳ bài viết nào như vậy tồn tại thảo luận về cách mã sẽ khác nhau cho 3 mẫu thiết kế này (MVC, MVP & MVVM) thì hãy chuyển hướng tôi đến bài viết đó.


14
Trong TechEd 2011 đã có một bài thuyết trình hay nhưng đơn giản về 3 mẫu này. Diễn giả đã thực hiện và hiển thị các ví dụ trên cùng một mô hình kinh doanh bằng C # và Visual Studio. Dưới đây là video trong channel9 MVC, MVP và MVVM: So sánh các mẫu kiến ​​trúc
Marco Medrano

2
Đây là bài viết: realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android . IMO được viết rất tốt và rõ ràng. Nó cũng có một repo Github với một nhánh cho mỗi mẫu.
cuddlecheek

Điều này thật thú vị: cirw.in/blog/time-to-move-on
Andrew

Câu trả lời:


100

Một số khác biệt cơ bản có thể được viết ngắn gọn:

MVC:

MVC truyền thống là nơi có một

  1. Model: Hoạt động như mô hình cho dữ liệu
  2. Chế độ xem: Thỏa thuận với chế độ xem cho người dùng có thể là Giao diện người dùng
  3. Bộ điều khiển: Điều khiển sự tương tác giữa Model và View, trong đó view gọi bộ điều khiển để cập nhật model. Xem có thể gọi nhiều bộ điều khiển nếu cần.

MVP:

Tương tự như MVC truyền thống nhưng Trình điều khiển được thay thế bởi Người trình bày. Nhưng Người trình bày, không giống như Người điều khiển cũng chịu trách nhiệm thay đổi quan điểm. Quan điểm thường không gọi người trình bày.

MVVM

Sự khác biệt ở đây là sự hiện diện của View Model. Đây là một dạng triển khai của Mẫu thiết kế quan sát, trong đó các thay đổi trong mô hình cũng được trình bày trong khung nhìn, bởi VM. Ví dụ: Nếu một thanh trượt được thay đổi, không chỉ mô hình được cập nhật mà dữ liệu có thể là văn bản, được hiển thị trong chế độ xem cũng được cập nhật. Vì vậy, có một ràng buộc dữ liệu hai chiều.


1
Chi tiết nhỏ - bạn có thể chọn nếu đó là ràng buộc dữ liệu hai chiều hoặc bạn cũng có thể xác định ràng buộc một chiều.
Jviaches

10
"Quan điểm thường không gọi người trình bày"? bạn có thể giải thích thêm về câu này? Nếu ui xem sẽ không gọi người trình bày sẽ đến?
Amir Ziarati

3
@AmirZiarati Người trình bày theo dõi các sự kiện. Trong trường hợp các sự kiện, người trình bày đi vào chơi và thực hiện các hành động cần thiết.
Pritam Banerjee

có miễn là nó có một tài liệu tham khảo để xem. Tôi đã hiểu sai tôi nghĩ rằng bạn có nghĩa là xem thậm chí không cần phải gọi người trình bày ban đầu trong khi nó nên ít nhất một lần. cảm ơn;)
Amir Ziarati

1
@PritamBanerjee, Từ lời giải thích, cả MVP & MVVM gần như có cùng chức năng. P hoặc VM cập nhật cả M & V.
Manohar Reddy Poreddy

42

MVC, MVP, MVVM

MVC (cái cũ)

MVP (mô-đun nhiều hơn vì khớp nối thấp. Người thuyết trình là người trung gian giữa Chế độ xem và Mô hình)

MVVM (Bạn đã có ràng buộc hai chiều giữa thành phần VM và UI, vì vậy nó tự động hơn MVP) nhập mô tả hình ảnh ở đây

Một hình ảnh khác: nhập mô tả hình ảnh ở đây


23
Vui lòng không sao chép hình ảnh - đặc biệt là khi chúng không đồng ý với nhau. Xem MVC (cái cũ mà bạn không thấy) các cuộc thảo luận trình duyệt để xem ở hình trên cùng, nhưng nói chuyện với bộ điều khiển ở hình dưới.
peter.fr

1
@UddhavGautam Hơi khó hiểu vì hình ảnh đầu tiên hiển thị View là điểm vào và hình thứ hai hiển thị Trình điều khiển.
everlasto

1
Trong sơ đồ đầu tiên, sự khác biệt giữa MVVM và MVP là gì? Như tôi thấy, nó chỉ là liên kết giữa V và VM / P. Mà trong một trường hợp có các thông điệp qua lại như một liên kết hai chiều và trong trường hợp khác, chúng được thể hiện dưới dạng hai liên kết đơn hướng. Tôi không thấy bất kỳ sự khác biệt chức năng giữa chúng. Tôi đang thiếu gì?
iCyberPaul

1
Trình duyệt nghĩa là người dùng từ nơi xảy ra tương tác giữa bạn và ứng dụng.
Uddhav Gautam

4
Cốt truyện xoắn: không ai thực sự biết chuyện gì đang xảy ra. Tất cả đều thực sự giống nhau. Haha. Không nhưng thực sự, ngay cả với những hình ảnh "hữu ích" này, thật khó để xử lý cái quái gì đang diễn ra. Tôi nghĩ đó là một phần của vấn đề / nhầm lẫn.
Andrew

34

Giải thích tuyệt vời từ liên kết: http://geekswithbloss.net/dlussier/archive/2009/11/21/136454.aspx

Trước tiên hãy nhìn vào MVC

Đầu vào được hướng vào Bộ điều khiển trước, không phải dạng xem. Đầu vào đó có thể đến từ người dùng tương tác với một trang, nhưng cũng có thể là từ việc chỉ cần nhập một url cụ thể vào trình duyệt. Trong cả hai trường hợp, Bộ điều khiển được giao tiếp để khởi động một số chức năng.

Có một mối quan hệ nhiều-một giữa Bộ điều khiển và Chế độ xem. Đó là bởi vì một bộ điều khiển duy nhất có thể chọn các chế độ xem khác nhau được hiển thị dựa trên thao tác được thực thi.

Có một mũi tên từ Bộ điều khiển để Xem. Điều này là do Chế độ xem không có bất kỳ kiến ​​thức hoặc tham chiếu nào đến bộ điều khiển.

Bộ điều khiển trả lại Mô hình, do đó, có kiến ​​thức giữa Chế độ xem và Mô hình dự kiến ​​được truyền vào Mô hình, nhưng không phải Bộ điều khiển phục vụ nó.

MVP - Người dẫn chương trình xem mô hình

Bây giờ hãy nhìn vào mẫu MVP. Nó trông rất giống với MVC, ngoại trừ một số điểm khác biệt chính:

Đầu vào bắt đầu bằng Chế độ xem, không phải Người trình bày.

Có một ánh xạ một-một giữa Chế độ xem và Người thuyết trình được liên kết.

Chế độ xem giữ tham chiếu đến Người trình bày. Người thuyết trình cũng đang phản ứng với các sự kiện được kích hoạt từ Chế độ xem, do đó, nhận thức về Chế độ xem được liên kết với.

Người thuyết trình cập nhật Chế độ xem dựa trên các hành động được yêu cầu mà Người thực hiện trên Mô hình, nhưng Chế độ xem không phải là Mô hình.

MVVM - Model View View Model

Vì vậy, với các mẫu MVC và MVP trước mặt chúng ta, hãy xem mẫu MVVM và xem nó có gì khác biệt:

Đầu vào bắt đầu với Chế độ xem, không phải Mô hình Chế độ xem.

Trong khi Chế độ xem giữ tham chiếu đến Mô hình Chế độ xem, Mô hình Chế độ xem không có thông tin về Chế độ xem. Đây là lý do tại sao có thể có ánh xạ một-nhiều giữa các Chế độ xem khác nhau và một Mô hình Chế độ xem thậm chí trên các công nghệ. Ví dụ: Chế độ xem WPF và Chế độ xem Silverlight có thể chia sẻ cùng một Kiểu xem.


7
"Điều này là do Chế độ xem không có bất kỳ kiến ​​thức nào hoặc tham chiếu đến bộ điều khiển" Điều này không đúng
Adam Wolski

@AmirZiarati ViewModel không phải là một phần của MVP mà là mẫu MVVM.
Joe

Tôi sẽ tốt nếu bạn cung cấp các ví dụ như chúng ta có thể sử dụng các mẫu này ở đâu
JKA

3

Hình ảnh dưới đây là từ bài viết được viết bởi Erwin van der Valk:

hình ảnh giải thích về MVC, MVP và MVVM - của Erwin Vandervalk

Các bài viết giải thích sự khác biệt và đưa ra một số ví dụ mã trong C #


Các hình ảnh trên không gây nhầm lẫn, như trong MVC tại sao XEM trực tiếp truy cập Model? giống người khác?
smkrn110

Trong các sơ đồ này không rõ ý nghĩa của các mũi tên. Liệu mũi tên có nghĩa là truy cập hoặc thao tác? Trong sơ đồ MVC không rõ tại sao không có mũi tên khởi tạo từ Mô hình
Pontios
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.