mô hình mvvm lập trình

Tìm hiểu về mô hình lập trình MVVM (Model-View-ViewModel). MVVM có thể nói là mô hình kiến trúc được rất nhiều lập trình viên trong cộng đồng lập trình ưa chuộng sử dụng nó.  mô hình này sinh ra dành cho các ứng dụng sử dụng ngôn ngữ XAML để định nghĩa giao diện ứng dụng như: Windows Phone 8.0, 8.1 Silverlight/RT, WPF, Silverlight, Windows RT, Universal Apps,… Lợi ích từ mô hình này mang lại là rất nhiều. Nhưng lợi ích nổi bật nhất là tách biệt việc thiết kế giao diện và lập trình code logic không phụ thuộc nhau. Bài viết này sẽ chỉ rõ những nội dung tổng quát có thể giúp bạn có thêm cái nhìn cụ thể MVVM là gì, cách sử dụng và lợi ích của nó…

Giới thiệu mô hình Model-View-ViewModel (MVVM)

Lịch sử phát triển

Kể từ khi Microsoft cho ra mắt hai nền tảng phát triển ứng dụng mới đó là WPF và Silverlight, trên nên tảng đó đã có nhiều thay đổi trong việc xử lý sự kiện và binding dữ liệu, giữa các tầng của ứng dụng với nhau. Vì vậy, nảy sinh ra nhu cầu phải có một mô hình phát triển ứng dụng mới phù hợp hơn. Do vậy Model – View – ViewModel (MVVM) pattern ra đời và ngày càng trở nên phổ biến, phát triển hơn.

Xem thêm: WPF là gì

Mô hình MVVM là gì

MVVM không phải là framework hay thư viện, api… nó chỉ đơn thuần là hướng dẫn bạn định nghĩa cấu trúc ứng dụng của bạn. MVVM được phát triển dựa trên kiến trúc MVP.

Mô hình mvvm cho phép tách biệt dữ liệu (Model), mã thực thi (logic hay ViewModel) và giao diện người dùng (View).

Trong các mô hình truyền thống, chúng ta thường xử lý sự kiện Click và viết mã thực thi trực tiếp ở trên một Button nhưng với mô hình MVVM không cho phép làm điều này.

Trong mô hình MVVM, các điều khiển(control) như Button, ListView, SearchBar, v.v. không thể kết buộc trực tiếp đến dữ liệu mà phải thông qua thuộc tính Command – là một thuộc tính kiểu ICommand.

mô hình lập trình mvvm là gì
mô hình lập trình mvvm là gì

MVVM được hiểu như thế nào ?

View:

Thành phần giao diện của ứng dụng. Tương tự như ở trong mô hình MVC, View là thành phần duy nhất mà người dùng có thể tương tác được trong chương trình, nó chính là thành phần mô tả dữ liệu.

Một điểm khác biệt so với các mô hình khác là View trong mô hình này tích cực hơn. Nó có khả năng thực hiện các hành vi và phản hồi lại người dùng thông qua tính năng là: binding, command.

Model:

Cũng tương tự như trong mô hình MVC. Model là các đối tượng giúp truy xuất và thao tác trên dữ liệu thực sự.

ViewModel:

Lớp trung gian giữa View và Model. ViewModel có thể được xem là thành phần thay thế cho Controller trong mô hình MVC. Nó chứa các mã lệnh cần thiết để thực hiện data binding, command.

Một định nghĩa khác về ViewModel:

ViewModel: Sẽ đảm nhận công việc đồng bộ dữ liệu từ model lên View. Mối quan hệ giữa View và View-Model là View sẽ được ánh xạ tới View-Model nhưng View-Model lại không biết thông tin gì về View. Nó được ẩn dấu qua cách sử dụng Data-binding và cơ chế của mô hình Observer. Một View-Model có thể được ánh xạ từ nhiều View.

Một điểm cần lưu ý: là trong mô hình MVVM, các tầng bên dưới sẽ không biết được các thông tin gì về tầng bên trên nó. ViewModel không hề biết gì về View, một ViewModel có thể được sử dụng cho nhiều View (one-to-many). ViewModel sử dụng Observer design pattern để liên lạc với View (thường được gọi là binding data, có thể là 1 chiều hoặc 2 chiều tùy nhu cầu ứng dụng).

Cấu trúc thư mục trong MVVM

Thông thường khi sử dụng với MVVM chúng ta nên tạo 3 thư mục chính chứa các file code liên quan.

cấu trúc thư mục trong mvvm
cấu trúc thư mục trong mvvm

Views

Trong thư mục Views chứ các file giao diện. Và mỗi file giao diện đều có class code-behind đi kèm. Đặc biệt file code-behind ta sẽ không sử dụng đến, mọi điều cần làm sẽ chuyển xuống class ViewModel. Tất nhiên là bạn có thể code trong file code-behind của XAML nhưng điều đó sẽ phá vỡ quy ước MVVM, bạn có thể khai báo thuộc tính datacontext hoặc vài thiết lập khác nhưng nên hạn chế tối thiểu code ở đây. Views được sử dụng để kết hợp với các mô hình MVVM… Nó dùng để cung cấp một sự chia tách gọn gàng của khái niệm giữa UI và presentation logic và data.

Models

Trong thư mục Models trong đó tạo các class chứa data và bất kỳ liên kết validation, logic nghiệp vụ để chắc chắc tính toàn vẹn của data, bạn có thể tách ra thư mục Repositories khác. Chúng được dùng như một phần của mô hình MVVM.

ViewModels

Tương tự ta cũng tạo một thư mục ViewModels. Thông thường một file giao diện thì ta tạo một class ViewModels tương ứng (có đôi lúc ta tạo nhiều class phụ giúp tinh giản file code và gọi chúng trong class ViewModels chính).

ViewModels sẽ sử dụng các model nếu cần định nghĩa dữ liệu. Sự liên kết giữa View-ViewModel giúp chúng gửi và nhận dữ liệu, để hiểu rõ ta cần tìm hiểu các khái niệm về Binding, DataContext, Behaviors SDK. Nhờ đó ta tách code-behind của View và đưa xuống View Model.

Ngoài ra một lớp ViewModels chứa presentation logic và state của ứng dụng. ViewModels cần chứa các chức năng của ứng dụng. ViewModels định nghĩa properties, commands, và events, để chuyển đổi controls trong view cần data-bind.

Data Binding

Data Binding là kĩ thuật dùng để tạo gắn kết giữa phần giao diện (UI) và dữ liệu thông qua phần business logic. Nhờ Data Binding, UI có thể tự động cập nhật lại để hiển thị các thay đổi trong dữ liệu.Ngoài ra, Data Binding trong WPF còn hỗ trợ các chiều khác nhau, nghĩa là các thay đổi có thể cập nhật từ UI vào dữ liệu. Kĩ thuật binding trong mô hình mvvm thực sự là một bước tiến mới, thỏa mãn những điều mà hầu hết lập trình viên mong đợi.

Nếu như tìm hiểu về tính năng này, bạn sẽ không ngạc nhiên gì khi nhiều người nói rằng data binding là thành phần cốt lỗi tạo nên các cơ chế hoạt động trong WPF. Bạn có thể binding dữ liệu nguồn và đích từ bất kì đối tượng nào: như cửa sổ, các control đơn giản như TextBlock cho đến một usercontrol phức tạp.

Tất cả được thực hiện một cách dễ dàng, nhanh chóng, hiệu quả và có thể không cần dùng đến bất kì dòng code-behind (C#, VB.NET, …) nào.

Data Template

Data Template là kĩ thuật dùng để tạo ra một khuôn mẫu giao diện. Template chỉ được áp dụng cho các Control. Một template trong WPF xác định cách thức và cấu trúc mà dữ liệu hoặc control sẽ được hiển thị ra màn hình.

Nói riêng về Data Template, chức năng này giúp cho dữ liệu (thuộc dạng non-visual) được gắn vào một cấu trúc bao gồm một hoặc nhiều thành phần có khả năng hiển thị. Và do đó, dữ liệu sẽ được hiển thị lên cửa sổ một cách trực quan theo ý muốn của lập trình viên. Cũng như Data Binding, tính năng này không yêu cầu bạn phải biết trong code-behind của ứng dụng.

Command

Data Binding và Data Template giúp cho người dùng thấy được những gì có trong dữ liệu và có thể cập nhật lại dữ liệu đó. Tuy nhiên để nhận được tương tác từ người dùng và xử lý, WPF cung cấp một tính năng gọi là command. Các command có thể được xem như dữ liệu và được cung cấp cho người dùng thông qua chức năng binding.

Một command binding cho phép bạn tùy ý xác định các phương thức xử lý, phím tắt hoặc thao tác chuột để kích hoạt.

So sánh ưu điểm và nhược điểm của MVC  MVP và MVVM

Ở đây mình không so sánh mô hình nào nên dùng hơn mô hình nào, mà tùy trường hợp mọi người dùng mô hình nào cho thích hợp với dự án của mình. Mình xin nêu ra ưu nhược điểm của MVP và MVVM nhé!

Ưu nhược điểm của MVC là gì?

mô hình mvc cho lập trình
mô hình mvc cho lập trình

Ưu điểm:

Mô hình MVC có rất nhiều ưu điểm, cụ thể như là:

  • Nhẹ, tiết kiệm băng thông: MVC không tiêu tốn nhiều viewstate nên rất tiết kiệm băng thông. Các thao tác gửi, nhận dữ liệu được diễn ra liên tục. Vì vậy, sử dụng mô hình này website/ ứng dụng hoạt động ổn định hơn.
  • Có thể kiểm tra, phát hiện lỗi phần mềm một cách dễ dàng.
  • Dễ dàng trong việc phân tách các phần Model và View.
  • Mô hình này có kết cấu đơn giản. Không cần quá am hiểu về kỹ thuật cũng có thể sử dụng được.

Nhược điểm:

Bên cạnh những ưu điểm nên bên trên thì MVC cũng tồn tại một số nhược điểm:

  • Controller và View có sự liên quan với nhau. Vì vậy, khi thay đổi ở View thì đồng nghĩa bạn sẽ phải thay đổi ở Controller.
  • Khó thực hiện chạy unit test do Controller và Android API có sự liên hệ chặt chẽ với nhau.
  • Theo thời gian, Controller sẽ trở nên khó kiểm soát vì càng ngày càng có nhiều code được viết thêm vào.
  • MVC phù hợp với các dự án lớn. Với các dự án nhỏ, mô hình này khá cồng kềnh và tốn nhiều thời gian trong việc trung chuyển dữ liệu.

Ưu nhược điểm của MVP là gì?

MVP : Model – View – Presenter

mô hình lập trình mvp
mô hình lập trình mvp

Ưu điểm:

  • Chúng ta dễ dàng viết unit test cho presenter vì nó không gắn với bất cứ view, nó hoạt động độc lập với View và không gắn với bất cứ API nào của Android
  • MVP có cấu trúc code rõ ràng hơn so với MVC nên khá dễ hiểu và dễ dùng. ít bug hơn, dễ dàng review code.

Nhược điểm:

  • Mô hình MVP theo thời gian, Presenter sẽ dần lớn lên do bị thêm các business logic rải rác. Người dùng sẽ rất khó để kiểm soát và chia nhỏ code khi Presenter đã quá lớn.
  • Nó sẽ trở lên rườm rà khi ta xây dựng với các ứng dụng nhỏ, hoặc với các Activity đơn giản.
  • Khó sử dụng lại logic code trong Presenter cho các View khác..

Ưu nhược điểm của MVVM: Model – View – ViewModel?

Ưu điểm:

  • 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.
  • MVVM sẽ tạo sự tương tác hiệu quả giữa designer và developer
  • Tăng khả năng sử dụng lại các thành phần hay việc thay đổi giao diện chương trình mà không cần phải viết lại code quá nhiều
  • phát triển ứng dụng nhanh, đơn giản, dễ nâng cấp, bảo trì…

Nhược điểm :

  • 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.
  • Đối với dự án nhỏ việc áp dụng mô hình MVVM gây cồng kềnh, tốn thời gian trong quá trình phát triển. Tốn thời gian trung chuyển dữ liệu của các thành phần.
  • Đối với dự án lớn hơn, nó gây khó khăn và mất thời gian để thiết kế các ViewModel.
  • Việc liên kết dữ liệu cho tất cả các thành phần gây khó khăn trong việc debug khi cơ sở dữ liệu phức tạp.

Sử dụng mô hình MVC, MVP và MVVM khi nào?

Bạn nên dùng MVP nếu không thể binding dữ liệu qua DataContext (ví dụ như với Windows Forms).

Mô hình MVVM thì nên dùng trong trường hợp có thể binding dữ liệu thông qua DataContext (ví dụ như: WPF).

Còn đối với MVC nên sử dụng khi việc kết nối giữa View và các phần còn lại của ứng dụng không phải lúc nào cùng available (ví dụ như web API). Khi đó, bạn không thể sử dụng MVP hoặc MVVM hiệu quả được và bắt buộc phải chọn mô hình MVC.

Kết luận :

MVVM có thể nói là mô hình kiến trúc được rất nhiều lập trình viên ưa chuộng.  MVVM đã kế thừa những ưu điểm vốn có của MVP, kết hợp với những lợi thế của data binding đem đến một pattern có khả năng phân chia các thành phần với từng chức năng riêng biệt, dễ dàng trong việc maintain, redesign. MVVM cũng đem lại khả năng test rất dễ dàng, giúp làm việc hiệu quả.

Cảm ơn các bạn đã đọc bài viết. Mong nhận được nhiều sự góp ý từ phía bạn.

Xem thêm: Ngôn ngữ lập trình C sharp là gì

Tài liệu tham khảo: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel

Leave a Reply