MVP (Bộ điều khiển giám sát) Chế độ xem có cập nhật mô hình không?


8

Tôi đã đọc về MVP, cụ thể là Bộ điều khiển giám sát. Một điều tôi gặp khó khăn trong đầu là cách View tương tác với Model.

Theo hiểu biết của tôi, Người thuyết trình nên cập nhật Mô hình và Chế độ xem đọc từ Mô hình. Người thuyết trình cũng có thể cập nhật chế độ xem thông qua giao diện. Bài viết của Martin Fowler về điều này dường như chỉ cho thấy điều đó ( http://martinfowler.com/eaaDev/SupervisingPresenter.html ).

Tuy nhiên, các bài viết / blog khác hiển thị chế độ xem cập nhật mô hình trực tiếp ( https://bloss.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-b between- model-view-viewmodel-and- other- tách-trình bày-mẫu / ).

Tôi biết đây chỉ là các mẫu nên sẽ có các triển khai khác nhau, nhưng khung nhìn cập nhật mô hình có vẻ như nó đang làm nhiều hơn mức cần thiết.

Ví dụ, tôi có một lớp người có tên và số điện thoại. Chế độ xem có thể hiển thị tên và số này và nút gửi để thay đổi tên và số của người đó. Khi nhấp vào nút gửi, tôi hy vọng việc cập nhật sẽ được xử lý trong Người thuyết trình chứ không phải Chế độ xem. Tuy nhiên, bài viết tôi tham khảo đề xuất rằng chế độ xem có thể trực tiếp cập nhật mô hình.

Vì vậy, nên xem bao giờ cập nhật các mô hình? Hoặc chỉ nên được xử lý bởi Người trình bày?

BIÊN TẬP:

Mã từ bài viết MSDN:

public class PersonalDataView : UserControl, IPersonalDataView
{
    protected TextBox _firstNameTextBox;

    public void SetPersonalData(PersonalData data)
    {
        _firstNameTextBox.Value = data.FirstName;
    }

    public void UpdatePersonalData(PersonalData data)
    {
        data.FirstName = _firstNameTextBox.Value;
    }
}

Câu trả lời:


6

Có một số biến thể của MVP xung quanh kể từ thiết kế ban đầu của nó vào năm 1996 bởi Mike Potel . Martin Fowler thảo luận về một số trong số họ trong một bài viết khác về kiến ​​trúc GUI .

Một trong những khác biệt chính giữa các biến thể là chế độ xem có hoàn toàn tách biệt với mô hình hay không:

  • Trong trường hợp đầu tiên, người trình bày là người đàn ông ở giữa "quan điểm thụ động" và người mẫu.
  • Trong trường hợp thứ hai, người trình bày là một "bộ điều khiển giám sát", nhưng có các tương tác trực tiếp giữa khung nhìn và mô hình. Bài viết của Potel mô tả tốt loại tương tác: chế độ xem có thể yêu cầu dữ liệu từ mô hình và mô hình có thể thông báo cho chế độ xem một số sự kiện.

Trong mọi trường hợp, khung nhìn sẽ trực tiếp thay đổi mô hình. Sự thay đổi của mô hình luôn diễn ra thông qua Người trình bày (hoặc bộ điều khiển trong MVC).

Lưu ý 1: Bài viết MSDN chỉ hiển thị một mũi tên trực tiếp từ chế độ xem đến mô hình, trong phần giới thiệu về phần MVC (Model View Controller). Mũi tên sai hướng, nhưng văn bản là chính xác: chế độ xem có thể truy cập vào mô hình và tự thay đổi (nghĩa là không phải mô hình, nhưng vẽ lại chính nó) khi thay đổi dữ liệu của mô hình.

Lưu ý 2: Bài viết MSDN cũng cho thấy mẫu MVVM của Microsoft, gần như là MVP, nhưng người trình bày được gọi một cách mơ hồ là "ViewModel". Nhưng một lần nữa, View trong đó không cập nhật mô hình trực tiếp.

Chỉnh sửa của bạn:

Mã chỉnh sửa của bạn hiển thị ràng buộc dữ liệu hai chiều, trong đó cập nhật dữ liệu trong chế độ xem sẽ kích hoạt trực tiếp thay đổi trong mô hình. Điều này thực sự mâu thuẫn với mẫu MVP ban đầu trong đó Chế độ xem thông báo cho Người trình bày về các thay đổi mong muốn thông qua "Giao dịch viên" và Người trình bày có độc quyền để gọi "Lệnh" để cập nhật Mô hình.

Lưu ý 3: Tôi nghĩ rằng tác giả của blog MSDN này quan tâm đến việc giới thiệu kiến ​​trúc MVVM hơn là viết một bài viết chuyên sâu toàn diện, như Martin Fowler đã làm, trên các kiến ​​trúc khác. Tôi cũng nghĩ rằng kiến trúc cơ sở dữ liệu ADO của Microsoft có từ những ngày đầu của khung .net ưa thích một thiết kế hỗn hợp như vậy và làm cho một MVP cổ điển ít tầm thường hơn để thực hiện (nó yêu cầu DataObjectSource để cô lập quyền truy cập mô hình dữ liệu).


1
Cảm ơn bạn đã trả lời. Tôi đã thực hiện một chỉnh sửa cho câu hỏi của tôi. Bài viết MSDN giải thích Bộ điều khiển giám sát MVP và chỉ ra nơi mô hình được truyền vào dưới dạng tham số trong phương thức UpdatePersonalData. Phương pháp đó sau đó trực tiếp cập nhật mô hình. Điều đó dường như mâu thuẫn với những gì bạn đang nói khi bạn nói "Trong mọi trường hợp, khung nhìn sẽ trực tiếp thay đổi mô hình. Sự thay đổi của mô hình luôn diễn ra thông qua Người trình bày (hoặc bộ điều khiển trong MVC)". Tôi không thực sự thích ý tưởng về mô hình được cập nhật trong khung nhìn và tôi đồng ý với cách giải thích của bạn. Có phải nó, chỉ là giải thích?
Eric

1
@EricS Tôi nghĩ rằng tác giả của bài viết trên blog MSDN này đã hiểu sai thuật ngữ "truy cập dữ liệu" trong MVP như một ràng buộc dữ liệu hai chiều. Tôi chỉnh sửa câu trả lời của mình để làm nổi bật điều đó.
Christophe

1
@EricS Nhân tiện, thuật ngữ ràng buộc dữ liệu giữa chế độ xem và mô hình được xác nhận là bị hạn chế trong bài viết của Martin Fowler "Chế độ xem thường sử dụng một số dạng Liên kết dữ liệu để điền nhiều thông tin cho các trường của nó. đến các tương tác phức tạp hơn thì bộ điều khiển bước vào. "
Christophe

1
Tôi vẫn đang cố gắng che giấu sự ràng buộc dữ liệu và nó thực sự là gì và không. Không có khung để thực hiện bất kỳ ràng buộc dữ liệu nào cho tôi, tôi có thể tự thực hiện ràng buộc dữ liệu bằng cách chỉ sử dụng getters và setters không? Trong trường hợp đó, nếu tôi chỉ muốn thực hiện ràng buộc dữ liệu một chiều, tôi sẽ chỉ có một getter lấy dữ liệu từ mô hình, nhưng không bao giờ cập nhật mô hình. Thay vào đó, việc cập nhật mô hình sẽ được ủy quyền cho người trình bày.
Eric

1

Từ bài viết của Người trình bày giám sát của Fowler mà bạn đã liên kết trong câu hỏi của mình:

Yếu tố giao diện người dùng vào chế độ xem và bộ điều khiển trong đó chế độ xem xử lý ánh xạ đơn giản đến mô hình bên dưới và bộ điều khiển xử lý phản hồi đầu vào và logic xem phức tạp.

Nó nói rõ ràng rằng đối với tất cả các tác vụ đơn giản, khung nhìn có thể nói chuyện trực tiếp với mô hình. Vì vậy, nó không mâu thuẫn với bài viết MSDN. Điều này là chính xác bởi vì để ánh xạ / ràng buộc các thuộc tính đơn giản, bạn không cần phải liên quan đến lớp khác vì điều này sẽ làm phức tạp mọi thứ mà không có nhiều lợi ích.

Một lần nữa, Fowler nói về điều này ở cuối bài viết:

[...] Vấn đề lái xe là có bao nhiêu hành vi để lại trong chế độ xem. Chế độ xem thụ động là một mẫu rất giống với Bộ điều khiển giám sát, nhưng với điểm khác biệt là Chế độ xem thụ động đặt tất cả hành vi cập nhật chế độ xem trong bộ điều khiển, bao gồm các trường hợp đơn giản. Điều này dẫn đến việc lập trình thêm, nhưng không có nghĩa là tất cả các hành vi trình bày đều có thể kiểm tra được. Sự lựa chọn giữa hai tùy thuộc vào loại hỗ trợ liên kết dữ liệu nào bạn có và liệu bạn có vui lòng để lại điều đó chưa được kiểm tra bằng các thử nghiệm của bộ điều khiển.

Bạn nên ghi nhớ một số điều:

  • Đảm bảo rằng tại mọi thời điểm, mô hình là "chủ" của dữ liệu. Điều này có nghĩa là Chế độ xem không bao giờ nên ghi trực tiếp vào các trường của mô hình (dù sao đó là một ý tưởng tồi). Thuộc tính là ok nếu ngôn ngữ của bạn hỗ trợ chúng. Bằng cách này, mô hình vẫn có thể phản ứng trên bất kỳ cập nhật nào đối với dữ liệu của nó (ví dụ: bằng cách tính toán một trường khác).
  • Đừng ghép mô hình của bạn để xem. Mô hình phải được kiểm tra độc lập và về nguyên tắc, bạn sẽ có thể thay đổi chế độ xem mà không ảnh hưởng đến mô hình. Điều này có nghĩa là mô hình không bao giờ nên gọi trực tiếp khung nhìn. Sử dụng các giao diện, hoặc có lẽ tốt nhất ở đây, mẫu Observer. Chế độ xem có thể đăng ký chính nó vào mô hình để cập nhật.
  • Không bao giờ đặt bất kỳ logic (kinh doanh) nào vào Chế độ xem. Nếu bạn thấy mình viết các ifcâu lệnh trong mã xem, hãy suy nghĩ xem liệu những câu đó nên thuộc về người trình bày hay mô hình.
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.