Model-View-Controller: Người dùng có tương tác với View hay với Bộ điều khiển không? [đóng cửa]


13

Gần đây tôi đã tìm hiểu về mẫu thiết kế MVC. Tôi đang học từ cuốn sách Head First Design Pattern.

Theo cuốn sách này (nếu tôi hiểu chính xác):

Ngươi mâu là hầu hết logic và dữ liệu ứng dụng.

Cái nhìn về cơ bản là GUI đại diện cho Model một cách trực quan cho người dùng.

Bộ điều khiển có trách nhiệm 'hòa giải' và đóng vai trò là 'người trung gian' giữa Chế độ xem và Mô hình. Chế độ xem báo cáo cho Bộ điều khiển rằng người dùng đã thực hiện một hành động và Bộ điều khiển dịch nó thành các cuộc gọi phương thức trên Mô hình.

Tuy nhiên, rất nhiều nơi trên web mâu thuẫn với những gì tôi hiểu từ cuốn sách đó. Họ cho rằng nhìn chung người dùng tương tác với Bộ điều khiển, không phải Chế độ xem.

Cái nào đúng hay phổ biến hơn? Người dùng có tương tác trực tiếp với Bộ điều khiển hoặc với Chế độ xem trực tiếp không? Cả hai cách tiếp cận đều được chấp nhận? Cái nào phổ biến hơn?


4
Câu hỏi này không có ý nghĩa trả lời theo cách bạn đã viết nó. Hãy cho chúng tôi một ví dụ về một trong những địa điểm trên web mâu thuẫn với cuốn sách và chúng tôi sẽ cố gắng giải thích nó. Hãy cụ thể với ví dụ của bạn.
Robert Harvey

1
Cả hai câu trả lời, cả hai đều được nêu lên, một câu nói "tương tác với khung nhìn", câu trả lời khác "tương tác với bộ điều khiển" .... khiến tôi nghĩ rằng MVC không phải là một kiến ​​trúc tốt nếu nó bị nhầm lẫn ở mức cơ bản như vậy!
gbjbaanb


Bạn có bấm vào các điều khiển của ứng dụng hoặc vào các truy vấn cơ sở dữ liệu không? Sự tương tác trực tiếp với giao diện người dùng, bản thân nó là một khung nhìn. Chế độ xem thường gọi các yêu cầu đến máy chủ (trong trường hợp ứng dụng web) hoặc gọi các hook được đăng ký trên chúng (trong trường hợp ứng dụng khách). Bên cạnh đó toàn bộ MVC chỉ là tào lao.
luke1985

@spectre Không hữu ích khi loại bỏ MVC mà không cung cấp giải thích và lý tưởng nhất là một giải pháp thay thế. Mặt khác, việc sa thải đó không đóng góp gì và chỉ cần bỏ qua bình luận của bạn. Bên cạnh đó, ngay cả với điều đó, nó vẫn sẽ lạc đề.
gạch dưới

Câu trả lời:


18

Người dùng tương tác với Chế độ xem , nhưng Chế độ xem phải giao tiếp các hành động với Bộ điều khiển . Bộ điều khiển có thể cập nhật Model , nhưng không bắt buộc với mọi / mọi thay đổi.

Mô tả tôi đang cung cấp dựa trên kinh nghiệm cá nhân của tôi với việc triển khai .NET của MVC. Việc thực hiện của bạn có thể khác nhau.

Bộ điều khiển là nơi các hành động được xử lý, về cơ bản là một lớp nghiệp vụ. Một bộ điều khiển đơn giản sẽ không làm gì khác hơn là lấy dữ liệu từ Model để cung cấp cho View. Bộ điều khiển phức tạp sẽ thực hiện tất cả các loại hành động, cho đến quản lý bảo mật, xác thực, ủy quyền, đăng ký và có thể nhiều thứ khác.

Các Xem chỉ phải chịu trách nhiệm cho việc hiển thị thông tin trong một thời trang mà người dùng có thể hiểu được. Có thể có một số giao thoa ở đây với cả Bộ điều khiển và Mô hình vì những thứ như Ứng dụng trang đơn (SPA) sẽ có phản hồi xác thực dữ liệu cho người dùng. Bất kỳ chéo khác là rất nhiều nhăn mặt.

Các mẫu đề với dữ liệu. Điều này bao gồm xác nhận dữ liệu (nếu có). Lưu trữ và truy xuất dữ liệu cũng được xử lý trong lớp này.


CẬP NHẬT

Dường như có một số nhầm lẫn xung quanh ai làm gì khi nào. Tôi bao gồm hai tổng quan khác nhau về kiến ​​trúc MVC vì chúng giống nhau, nhưng không giống nhau. Có chỗ cho cả hai cách giải thích. Có thể, nhiều hơn nữa. Các mô tả ở trên là sự giải thích của tôi về MVC từ nhiều nguồn, bao gồm cả kinh nghiệm xây dựng các ứng dụng của riêng tôi bằng phương pháp này. Hy vọng, bản cập nhật này sẽ giúp làm sáng tỏ một số nhầm lẫn này.

MVC là một nỗ lực để xây dựng một mẫu thiết kế Tách biệt các mối quan tâm để phát triển phần mềm. Nó chủ yếu được thực hiện trong các ứng dụng dựa trên web (theo hiểu biết của tôi).

Cái nhìn xử lý tất cả các tương tác người dùng. Nếu người dùng của bạn nhấp vào nút, Chế độ xem sẽ xác định xem lần nhấp đó là tương tác giao diện người dùng hay thứ gì đó nằm ngoài mối quan tâm của nó (tương tác Bộ điều khiển). Nếu nút thực hiện thao tác sao chép giá trị từ trường này sang trường khác, việc triển khai của bạn sẽ xác định xem đó là mối quan tâm của Chế độ xem hay mối quan tâm của Trình điều khiển. Rất có thể bạn sẽ chỉ làm mờ đi những lo ngại này khi làm việc với Ứng dụng một trang (SPA).

Bộ điều khiển là nơi hành động của bạn được xử lý. Chế độ xem đã thông báo cho người dùng quyết định thay đổi giá trị cho một số trường. Bộ điều khiển có thể thực hiện xác nhận trên dữ liệu đó hoặc có thể được Mô hình xử lý. Một lần nữa đây là phụ thuộc thực hiện. Nếu Bộ điều khiển có các tính năng bảo mật, nó có thể xác định rằng người dùng không có đủ đặc quyền để thực hiện hành động. Nó sẽ từ chối các thay đổi và cập nhật Chế độ xem phù hợp. Bộ điều khiển cũng xác định dữ liệu nào cần lấy từ Mô hình, cách đóng gói và cập nhật Chế độ xem với dữ liệu đó.

Các mẫu xác định như thế nào và nơi để lưu trữ dữ liệu. Nó cũng có thể thực hiện xác thực dữ liệu đó trước khi lưu trữ dữ liệu đó (nên thực hiện việc này vì mọi người sẽ bỏ qua Chế độ xem đôi khi).


Wikipedia có một bài viết về MVC .

  • Một mô hình thông báo cho các khung nhìn / khung nhìn và bộ điều khiển liên quan của nó khi có sự thay đổi trạng thái của nó. Thông báo này cho phép các khung nhìn cập nhật phần trình bày của chúng và bộ điều khiển để thay đổi bộ lệnh có sẵn. Trong một số trường hợp, việc triển khai MVC thay vào đó có thể là "thụ động", do đó các thành phần khác phải thăm dò mô hình để cập nhật thay vì được thông báo.
  • Một khung nhìn được trình điều khiển cho biết tất cả thông tin cần thiết để tạo đại diện đầu ra cho người dùng. Nó cũng có thể cung cấp các cơ chế chung để thông báo cho bộ điều khiển đầu vào của người dùng.
  • Bộ điều khiển có thể gửi lệnh đến mô hình để cập nhật trạng thái của mô hình (ví dụ: chỉnh sửa tài liệu). Nó cũng có thể gửi các lệnh đến chế độ xem được liên kết của nó để thay đổi cách trình bày mô hình của chế độ xem (ví dụ: bằng cách cuộn qua tài liệu).

Từ Tổng quan về Microsoft của MVC .

  • Mô hình. Các đối tượng mô hình là các phần của ứng dụng triển khai logic cho miền dữ liệu của ứng dụng. Thông thường, các đối tượng mô hình lấy và lưu trữ trạng thái mô hình trong cơ sở dữ liệu. Ví dụ: một đối tượng Sản phẩm có thể truy xuất thông tin từ cơ sở dữ liệu, vận hành trên đó và sau đó ghi thông tin cập nhật trở lại bảng Sản phẩm trong cơ sở dữ liệu SQL Server.

    Trong các ứng dụng nhỏ, mô hình thường là một sự tách biệt về khái niệm thay vì vật lý. Ví dụ, nếu ứng dụng chỉ đọc một tập dữ liệu và gửi nó đến dạng xem, ứng dụng không có lớp mô hình vật lý và các lớp liên quan. Trong trường hợp đó, bộ dữ liệu đảm nhận vai trò của một đối tượng mô hình.

  • Lượt xem. Lượt xem là các thành phần hiển thị giao diện người dùng (UI) của ứng dụng. Thông thường, UI này được tạo từ dữ liệu mô hình. Một ví dụ sẽ là chế độ xem chỉnh sửa của bảng Sản phẩm hiển thị hộp văn bản, danh sách thả xuống và hộp kiểm dựa trên trạng thái hiện tại của đối tượng Sản phẩm.

  • Bộ điều khiển. Bộ điều khiển là các thành phần xử lý tương tác của người dùng, làm việc với mô hình và cuối cùng chọn chế độ xem để hiển thị giao diện người dùng. Trong một ứng dụng MVC, khung nhìn chỉ hiển thị thông tin; bộ điều khiển xử lý và đáp ứng đầu vào và tương tác của người dùng. Ví dụ, bộ điều khiển xử lý các giá trị chuỗi truy vấn và chuyển các giá trị này cho mô hình, do đó có thể sử dụng các giá trị này để truy vấn cơ sở dữ liệu.


Điều gì xảy ra nếu bạn không có GUI cho tất cả các hành động? Điều gì xảy ra nếu bạn chỉ triển khai API cho một số phần cụ thể? Điều đó có nghĩa là người dùng đôi khi tương tác với Chế độ xem và đôi khi với Bộ điều khiển trực tiếp?
Mahdi

1
Từ quan điểm của tôi, không. API thay thế cho chế độ xem.
Adam Zuckerman

nhưng API có thể đơn giản url-routes, được đặt trong Controller. Ý tôi là không có Chế độ xem nào cả ...
Mahdi

1
@AdamZuckerman Cảm ơn bạn đã trả lời. Trong phần bình luận tiếp theo tôi sẽ mô tả cách tôi nghĩ một triển khai MVC phổ biến hoạt động, vui lòng xác nhận xem nó có đúng hay không. Cảm ơn
Manila Cohn

2
@Mahdi Một API, theo định nghĩa, có giao diện lập trình chứ không phải giao diện người dùng . Các chương trình tương tác với API, người dùng tương tác với Chế độ xem.
Eric King

4

Người dùng tương tác với Bộ điều khiển . Từ quan điểm kỹ thuật, bạn không tương tác với Chế độ xem , bạn chỉ đang sử dụng nó để tương tác với Bộ điều khiển .

Nhìn bề ngoài, có vẻ như người dùng đang tương tác với GUI - cũng với người không lập trình, điều này có ý nghĩa hơn, tuy nhiên bằng cách nhấp vào nút, về cơ bản bạn đang nói chuyện với Bộ điều khiển chứ không phải Chế độ xem .

Ngoài ra, không phải tất cả các ứng dụng - ngay cả các ứng dụng web MVC cũng không có GUI. Bạn có thể tương tác với Bộ điều khiển thông qua API - url-routesví dụ đơn giản , được đặt trong chính Bộ điều khiển .

Bộ điều khiển phải là nơi NhậnXử lý các yêu cầu của người dùng. Vì vậy, nếu bạn bằng cách nào đó truy cập Mô hình trực tiếp từ Chế độ xem - không quan trọng bằng cách nào, thì đó không phải là MVC nữa.


2
+1 Điều này đúng. Những thứ như menu và thanh công cụ là một phần của GUI nhưng không phải là một phần của khung nhìn và đi thẳng đến bộ điều khiển. Tổ hợp phím cũng vậy.
david.pfx

1
Các lý do quan điểm tồn tại như một sự trừu tượng là vì vậy chúng ta có thể thay thế chúng một cách dễ dàng khi cần thiết. Bộ điều khiển cho một ứng dụng trên nhiều nền tảng khác nhau có thể giống nhau, nhưng các khung nhìn phải nhận ra cử chỉ của người dùng khác nhau và chuyển chúng thành các hoạt động của bộ điều khiển. Do đó, tôi không đồng ý rằng người dùng tương tác trực tiếp với bộ điều khiển.
Fuhrmanator

1
@Mahdi Tôi sẽ nói rằng trong trường hợp đó, không có tương tác người dùng nào cả, đó là chế độ xem giao tiếp với bộ điều khiển theo chương trình. Các tương tác duy nhất được bắt đầu bởi người dùng là thông qua chế độ xem.
Eric King

1
@ david.pfx Tổ hợp phím không thể đi trực tiếp từ cửa sổ trình duyệt đến Bộ điều khiển.
Adam Zuckerman

1
@Izkata "Chế độ xem là một phần của mã yêu cầu được gửi đến" - Xin lỗi nhưng đây là điều tồi tệ nhất tôi nghe thấy ở đây. Làm sao nó có thể xảy ra? Bạn có thể sao lưu nó bằng cách cung cấp một tài liệu tham khảo trong một bài viết hoặc cuốn sách?
Mahdi

1

Hãy sử dụng một ví dụ cụ thể về lý do tại sao người dùng tương tác trực tiếp với chế độ xem chứ không phải bộ điều khiển.

Trong ứng dụng nghe nhạc trên iPhone, một tính năng cấp cao là phát danh sách phát. "Phát danh sách phát" là chức năng của bộ điều khiển cho ứng dụng.

Có nhiều hơn một cách để kích hoạt chức năng đó. Tôi có thể nhấp vào danh sách phát bên trong ứng dụng hoặc tôi có thể yêu cầu Siri (giao diện giọng nói) thực hiện chức năng tương tự. Đó là hai cử chỉ khác nhau được công nhận bởi các quan điểm khác nhau.

Các phản hồi trong mỗi quan điểm cũng khác nhau. Siri sẽ cho bạn biết rằng nó đang phát nhạc bạn yêu cầu. Ứng dụng âm nhạc sẽ hiển thị cho bạn thông tin phản hồi trực quan rằng nó đang phát danh sách phát.

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.