Architecture Pattern: Kiến thức Android MVC, MVP, MVVM
Về cơ bản chúng ta có thể viết bất kỳ kiểu gì mình muốn miễn là Code chạy đúng. Tuy nhiên trong phát triển phần mềm hiện đại, việc biết viết Code có tổ chức là điều kiện tiên quyết để lựa chọn ứng viên có phù hợp với vai trò công ty đang cần hay không.
Quá trình tiến hóa của Kiến trúc phần mềm trong Android cũng trải qua nhiều lần thay đổi và đến hiện tại Kiến trúc được lựa chọn nhiều nhất là MVVM (Model-View-ViewModel). Trước khi đi sâu vào MVVM hãy để mình giới thiệu cho các bạn đầy đủ quá trình tiến hóa này của phát triển phần mềm.
Model – View – Controller
Model-View-Controller là kiến trúc lâu đời nhất trong lập trình Android. Trong kiến trúc này các lớp của 1 tính năng được chia làm 3 phần:
- Model: Chứa các class chịu trách nhiệm về dữ liệu. Đảm nhận các vai trò dữ liệu: Query database; cập nhật Cache; xử lý network connection
- View: Là Activity, Fragment trong Android. Chịu trách nhiệm xử lý sự kiện, vẽ giao diện và các tính năng cho User.
- Controller: Chứa các class chịu trách nhiệm về xử lý logic của chương trình.
Trong MVC, Lifecycle của Controller sẽ stick theo Lifecycle của View. Trong khi Model có thể có một Lifecycle lớn hơn. Thông thường Model sẽ có Lifecycle ngang với Application, còn View và Controller sẽ có Lifecycle tương ứng với Activity, Fragment của chúng.
Model – View – Presenter
Model – View – Presenter là kiến trúc nâng cấp của MVC. Khi Controller được thay thế bằng Presenter. Trong kiến trúc này sự giao tiếp giữa các Model, View, Presenter được thông qua Abstract Layer – là những Interface (Vài người sẽ thích gọi là Contract). Các Abstract Contract này mục đích là định nghĩa trước các phương thức cần thiết cho tính năng, làm cơ sở để xây dựng nó trong các Implementation.
Ưu điểm của MVP so với MVC là các đoạn code được viết ra sẽ dễ test hơn. Cả về Manual Test lẫn Unit Test. Nguyên nhân là vì chúng ta có các Abstract Contract nên việc mock 1 vài thành phần để test lần còn lại là rất dễ dàng.
Ở góc nhìn của mình, MVP không phải là sự đột phá trong kiến trúc phần mềm. Đây chỉ là một phiên bản cải thiện của MVC giúp code viết ra được Module hóa tốt hơn, và follow được các tiêu chuẩn về testable, reliable codes.
Lifecycle
củaPresenter
sẽ stick theoView
, vàLifecycle
củaModel
cũng sẽ thường nằm ởApplication
level. Điều này tương tự với mô hình MVC.
Model – View – ViewModel
Model – View – ViewModel là một nâng cấp lớn từ 2 kiến trúc cũ MVC, MVP. Ở đây ViewModel
được tạo ra để thay thế cho Controller
hoặc Presenter
. Tuy nhiên điều khác biệt lớn nhất là ViewModel
có một Lifecycle
lớn hơn View
của chúng.
Trong các kiến trúc cũ, khi View bị Destroy
ở các trường hợp Configuration Changes
, thì Controller
và Presenter
cũng sẽ bị Destroy
theo và cùng khởi tạo, restore lại trạng thái.
Trong MVVM
, khi View
bị Destroy
bởi các trường hợp Configuration Changes
, ViewModel
vẫn còn alive và giữ các trạng thái trước đó. Điều này giúp tránh mất dữ liệu trong suốt quá trình User sử dụng Android app của chúng ta.
Ngoài ra khi sử dụng MVVM
chúng ta có thể kết hợp với các class khác của Android: LiveData
, SharedFlow
, StateFlow
giúp cho việc điều khiển View
trở nên dễ dàng, linh hoạt hơn so với cách dùng Presenter
cũ. Tuy nhiên với mình, đây không phải là significant impact
. Vì LiveData
, SharedFlow
, hay StateFlow
đều có thể được sử dụng trong MVC
, MVP
một cách bình thường.
Với những bạn có nhu cầu tìm hiểu sâu về ví dụ cụ thể của từng loại Architecture Pattern có thể tham khảo git repository này: https://github.com/dantech0xff/AndroidFundamentalsByDanTech Mình đã tổng hợp đầy đủ các ví dụ cơ bản để bạn hiểu cách setup một Fragment với từng kiến trúc MVC, MVP, MVVM.
Chúc các bạn thành công!