Bài viết này giới thiệu về các mô hình cơ bản để phát triển ứng dụng Mobile : MVC, MVP, MVVM
Mô hình MVC - Model View Controller
Model: gồm tập các lớp đặc tả cho logic nghiệp vụ (business model) và các hoạt động truy cập dữ liệu (data model).
View: đại diện cho các thành phần giao diện người dùng (User Interface). View đảm nhận trách nhiệm hiển thị dữ liệu từ Controller như là kết quả tới người dùng.
Controller: chịu trách nhiệm xử lý các yêu cầu (request) gửi đến. Controller nhận đầu vào từ người dùng thông qua View, xử lý dữ liệu của người dùng với sự giúp đỡ của Model và trả lại kết quả cho View. Controller đóng vai trờ điều hướng View và Model
Mô hình MVP - Model View Presenter
Mô hình MVP cũng gần giống mô hình MVC. Trong đó Controller được thay thế bởi Presenter.
Model và View cũng giống như mô hình MVC.
Presenter sẽ nhận input của người dùng thông qua View, xử lý dữ liệu của người dùng với sự giúp đỡ của Model và trả kết quả về View. Presenter giao tiếp với View qua interface. Interface được định nghĩa trong lớp Presenter, Activity/ Fragment hoặc các component khác implement interface này và render dữ liệu.
Trong cấu trúc MVP, presenter thao túng model và cập nhật ở view. View và Presenter tách biệt với nhau hoàn toàn và giao tiếp với nhau qua thông qua interface. Vì nếu tách riêng từng phần ở view sẽ dễ dàng cho việc kiểm thử ứng dụng ở MVP hơn so với mô hình MVC.
Mô hình MVVM - Model View View-Model
Mô hình MVVM hỗ trợ two-way data binding giữa View và View-Model. Điều này cho phép tự động lan truyền sự thay đổi, trong state của View-Model đến View. Tổng quan, View-Model sử dụng mô hình obsever để thông báo sự thay đổi trong View-Model đến Model.
MVC rất tốt trong việc phân chia model và view. Chắc chắn sẽ dễ dàng test model vì nó không liên quan đến view và view không có gì nhiều để test (unit test). Tuy nhiên Controller vẫn còn nhiều hạn chế.
MVP sẽ "clear" hơn so với MVC. Chúng ta có thể dễ dàng viết unit test cho presenter vì nó không gắn với bất cứ view và API nào của Android và nó cũng cho phép chúng ta làm việc với các view khác miễn là view đó implement interface liên kết.
MVVM Thực hiện Unit testing bây giờ sẽ rất dễ dàng, vì bạn thực sự không phụ thuộc vào view. Khi test bạn chỉ cần xác nhận rằng các biến observable được set thích hợp khi model thay đổi. Không cần phải tạo mockup cho view để test như ở mô hình MVP.
Mô hình MVC - Model View Controller
Model: gồm tập các lớp đặc tả cho logic nghiệp vụ (business model) và các hoạt động truy cập dữ liệu (data model).
View: đại diện cho các thành phần giao diện người dùng (User Interface). View đảm nhận trách nhiệm hiển thị dữ liệu từ Controller như là kết quả tới người dùng.
Controller: chịu trách nhiệm xử lý các yêu cầu (request) gửi đến. Controller nhận đầu vào từ người dùng thông qua View, xử lý dữ liệu của người dùng với sự giúp đỡ của Model và trả lại kết quả cho View. Controller đóng vai trờ điều hướng View và Model
Mô hình MVP - Model View Presenter
Mô hình MVP cũng gần giống mô hình MVC. Trong đó Controller được thay thế bởi Presenter.
Model và View cũng giống như mô hình MVC.
Presenter sẽ nhận input của người dùng thông qua View, xử lý dữ liệu của người dùng với sự giúp đỡ của Model và trả kết quả về View. Presenter giao tiếp với View qua interface. Interface được định nghĩa trong lớp Presenter, Activity/ Fragment hoặc các component khác implement interface này và render dữ liệu.
Trong cấu trúc MVP, presenter thao túng model và cập nhật ở view. View và Presenter tách biệt với nhau hoàn toàn và giao tiếp với nhau qua thông qua interface. Vì nếu tách riêng từng phần ở view sẽ dễ dàng cho việc kiểm thử ứng dụng ở MVP hơn so với mô hình MVC.
Mô hình MVVM - Model View View-Model
Mô hình MVVM hỗ trợ two-way data binding giữa View và View-Model. Điều này cho phép tự động lan truyền sự thay đổi, trong state của View-Model đến View. Tổng quan, View-Model sử dụng mô hình obsever để thông báo sự thay đổi trong View-Model đến Model.
Những điểm chính về mô hình MVP
- Người dùng tương tác với các View.
- Có mối quan hệ 1-1 giữa View và Presenter, tức là một View được ánh xạ tới chỉ một Presenter.
- View có một tham chiếu đến Presenter, nhưng không tham chiếu đến Model.
- Cung cấp giao tiếp 2 chiều giữa View và Presenter.
Những điểm chính về mô hình MVVM
- Người dùng tương tác với các View.
- Có mối quan hệ n-1 giữa View và ViewModel, tức là nhiều View có thể được ánh xạ tới một ViewModel.
- View có một tham chiếu đến ViewModel, nhưng ViewModel không có thông tin về các View.
- Hỗ trợ giao tiếp 2 chiều giữa View và ViewModel.
MVC rất tốt trong việc phân chia model và view. Chắc chắn sẽ dễ dàng test model vì nó không liên quan đến view và view không có gì nhiều để test (unit test). Tuy nhiên Controller vẫn còn nhiều hạn chế.
Mặt hạn chế của Controller
- Khả năng kiểm thử (test) - Controller bị ràng buộc với Android API nên sẽ khó để thực hiện unit test.
- Tính linh hoạt - Controller liên quan khá chặt chẽ với các view. Nếu chúng ta thay đổi view chúng ta sẽ phải thay đổi lại ở controller.
- Khả năng duy trì - Qua thời gian, controller sẽ ngày càng phình to ra do việc thêm code dẫn đến việc khó kiểm soát.
MVP sẽ "clear" hơn so với MVC. Chúng ta có thể dễ dàng viết unit test cho presenter vì nó không gắn với bất cứ view và API nào của Android và nó cũng cho phép chúng ta làm việc với các view khác miễn là view đó implement interface liên kết.
Mặt hạn chế của Presenter
- Khả năng duy trì - Cũng giống như Controller, Presenter dễ dàng bị thêm các business logic rải rác qua thời gian. Các developers sẽ rất khó để chia nhỏ presenter khi đã quá lớn.
MVVM Thực hiện Unit testing bây giờ sẽ rất dễ dàng, vì bạn thực sự không phụ thuộc vào view. Khi test bạn chỉ cần xác nhận rằng các biến observable được set thích hợp khi model thay đổi. Không cần phải tạo mockup cho view để test như ở mô hình MVP.
Mặt hạn chế của ViewModel
- Khả năng duy trì - Khi view có thể gán cả biến và biểu thức, các logic không liên quan sẽ tăng dần theo thời gian, ảnh hưởng đến việc thêm code vào XML. Để phòng tránh điều nay, luôn luôn lấy giá trị trực tiếp từ ViewModel so với việc cố gắng tính toán và viết lại chúng khi gán biểu thức ở view.




Comments
Post a Comment