MVP Pattern–Cái nhìn cơ bản

1. Sơ lược:

Các ứng dụng ASP.NET trước đây thường chứa nhiều UI logic trong từng trang, điều này làm cho việc kiểm thử ở mức độ đơn vị (unit test) trở nên khó và có khi không thể thực hiện được. Mẫu thiết kế Model-View-Presenter (MVP) đưa ra cho các lập trình viên một cách để tách biệt UI vào một form để thuận lợi cho việc kiểm thử. Hơn nữa, việc tách biệt này làm cho UI-centric business ít bị “break” khi UI có sự thay đổi nào đó.

Khi thực thi mẫu thiết kế MVP, có 2 cách tiếp cận khác nhau là Passive View và Supervising Controller. Đó cũng là những mẫu thiết kế khác của việc thiết kế UI như Model-View-Controller (MVC). MVC và MVP có những mục đích tương tự nhau, mặc dù chúng khác nhau trong cách chúng đạt được mục tiêu của mình.

2. Model-View-Presenter:

* Bài toán:

Một trang web trong một ứng dụng Web chứa các control nhằm hiển thị dữ liệu ứng dụng. Người dùng có thể chỉnh sửa dữ liệu và submit những thay đổi đó. Trang web này lấy dữ liệu, xử lý các sự kiện, thay đổi các control khác trên trang Web này để trả về các sự kiện, và submit dữ liệu đã bị thay đổi. Việc viết code để thực hiện nhiệm vụ trên vào phần code-behind của trang web làm cho class trở nên phức tạp, khó mà bảo trì và kiểm thử. Ngoài ra, nó cũng khó trong việc chia sẻ code giữa các trang web mà yêu cầu cùng behavior.

* Mong muốn:

– Bạn muốn mở rộng code để có thể kiểm tra một cách tự động. (các View thường rất khó kiểm thử).

– Bạn muốn chia sẻ code giữa các trang web mà yêu cầu cùng behavior.

– Bạn muốn tách biệt business logic từ UI logic để dễ hiểu và bảo trì.

* Giải pháp:

Tách biệt nhiệm vụ cho việc hiển thị và xử lý sự kiện thành những lớp khác nhau là View và Presenter. Lớp View (trang Web) quản lý các control trên trang Web và nó chuyển các sự kiện sang lớp Presenter. Lớp Presenter chứa các thành phần logic để trả lời các sự kiện, cập nhật model (business logic và dữ liệu của ứng dụng) và tính toán trạng thái của View.

Để tạo điều kiện cho việc kiểm thử Presenter, cho Presenter tham chiếu đến View interface thay vì để View tự thực thi, khi đó bạn có thể dễ dàng thay thế View thực bằng một đối tượng ảo (mock) để thực thi kiểm thử.

3. View Updates

Khi Model được cập nhật, View phải được cập nhật để thích ứng với những thay đổi. Việc cập nhật View có thể được xử lý theo nhiều cách. Các biến thể của MVP là Passive View và Supervising Controller xác định những cách khác nhau để thực thi việc cập nhật View.

Với Passive View, Presenter cập nhật View để ánh xạ các thay đổi vào Model. Việc tương tác với Model được xử lý duy nhất bởi Presenter, View không quan tâm đến những thay đổi trong Model.

Với Supervising Controller, View tương tác trực tiếp với Model để thực thi việc kết buộc dữ liệu (data-binding) mà có thể được xác định rõ ràng mà không cần đến sự can thiệp của Presenter. Presenter cập nhật Model, nó tính toán trạng thái của View chỉ trong trường hợp nơi mà UI phức tạp không thể được xác định một cách rõ ràng được yêu cầu. Ví dụ về UI phức tạp như việc thay đổi màu của một control hoặc việc hiển thị các controls động.

PassiveViewAndSupervisingController

Việc quyết định sử dụng Passive View hay Supervising Controller nằm chủ yếu ở mức độ kiểm thử mà bạn muốn đạt được cho ứng dụng của bạn. Nếu việc kiểm thử là phần quan tâm chính trong ứng dụng của bạn, Passive View có thể phù hợp hơn vì bạn có thể kiểm thử tất cả UI bằng cách kiểm thử Presenter. Mặt khác, nếu bạn muốn đơn giản hóa code hơn việc kiểm thử, Supervising Controller có thể là lựa chọn tốt hơn vì bạn không phải viết code trong Presenter để cập nhật View cho các thay đổi. Khi chọn giữa Passive View và Supervising Controller, bạn nên lưu ý những điểm sau:

+ Cả hai biến thể đều cho phép bạn tăng khả năng kiểm thử của Presenter.

+ Passive View thường cung cấp “bề mặt” kiểm thử rộng hơn so với Supervising Controller vì tất cả những cập nhật của View đều nằm ở Presenter.

+ Supervising Controller hoàn như đòi hỏi ít code hơn là Passive View vì Presenter không “hợp tác” với những cập nhật View đơn giản.

4. Tương tác với Model

Bạn có thể thực thi việc tương tác với Model theo nhiều cách. Ví dụ, bạn có thể thực thi mẫu Observer và dùng một Presenter “lắng nghe” các sự kiện của Model và cập nhật View khi được yêu cầu. Cách tiếp cận khác là sử dụng một application controller để cập nhật Model.

[Application Controller: bạn có thể tạo các Presenter tương tác với một application controller để tránh việc thêm trang theo sau và chuyển đổi màn hình sang các Presenter, hơn nữa, là làm cho nó dễ dàng cập nhật trang theo sau.]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s