ViewModel
ViewModel (pol. model widoku) jest kluczowym składnikiem architektury MVVM (Model‑View‑ViewModel), stosowanej w tworzeniu aplikacji z interfejsem użytkownika. Pełni rolę pośrednika pomiędzy Modelem a Widokiem, zapewniając dwukierunkowe powiązanie danych oraz oddzielenie logiki prezentacji od logiki biznesowej.
Historia
Idea ViewModelu wywodzi się z języka programowania C# oraz platformy Windows Presentation Foundation, gdzie po raz pierwszy zastosowano wzorzec MVVM w 2005 roku. W kolejnych latach koncepcja została zaadaptowana w innych środowiskach, m.in. w Xamarin, Silverlight, UWP oraz w frameworkach JavaScript (KnockoutJS, Vue.js) i SwiftUI.
Struktura i zasady działania
- Powiązanie danych (Data Binding) – ViewModel udostępnia właściwości, które są automatycznie synchronizowane z elementami UI w Widoku.
- Komendy (Commands) – zamiast obsługi zdarzeń w kodzie Widoku, logika akcji jest enkapsulowana w obiektach typu
ICommand(w .NET) lub analogicznych mechanizmach w innych językach. - Powiadamianie o zmianach – ViewModel implementuje interfejsy takie jak
INotifyPropertyChanged(C#) lub wykorzystuje obserwatory (np.Observablew RxJS), aby informować Widok o zmianach stanu. - Separacja warstw – Model nie posiada odniesień do UI, co pozwala na łatwiejsze testowanie jednostkowe oraz ponowne użycie kodu.
Implementacje w popularnych technologiach
| Platforma / Framework | Typowe biblioteki / klasy | Opis |
|---|---|---|
| WPF | INotifyPropertyChanged, ICommand |
Standardowe wsparcie MVVM w .NET, z użyciem XAML jako warstwy Widoku. |
| Xamarin.Forms | BindableObject, Command |
Umożliwia współdzielenie ViewModelu między platformami Android, iOS oraz UWP. |
| Vue.js | Obiekty data, methods |
Reaktywny system wiązania danych odpowiadający koncepcji ViewModelu. |
| SwiftUI | @StateObject, @ObservedObject |
Widok obserwuje obiekt ViewModelu oznaczony protokołem ObservableObject. |
| Angular | Komponenty z właściwościami i metodami | Choć nie używa nazwy „ViewModel”, komponent pełni podobną rolę. |
Zalety stosowania ViewModelu
- Usprawniona testowalność – logikę można testować niezależnie od UI.
- Lepsza utrzymywalność kodu dzięki wyraźnemu podziałowi warstw.
- Umożliwia współpracę zespołów: deweloperzy UI mogą pracować nad Widokiem, a programiści logiki – nad ViewModelem.
- Ułatwia implementację responsywnego UI i dynamicznych aktualizacji danych.
Wady i ograniczenia
- Wprowadza dodatkową warstwę abstrakcji, co może zwiększyć złożoność projektu.
- Nie zawsze jest optymalny dla bardzo prostych interfejsów, gdzie klasyczne podejście MVC może być wystarczające.
- Wymaga dobrze zdefiniowanego mechanizmu powiadamiania o zmianach; niewłaściwa implementacja może prowadzić do problemów z wydajnością.
Przykładowy kod (C# / WPF)
public class PersonViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
public ICommand SaveCommand { get; }
public PersonViewModel()
{
SaveCommand = new RelayCommand(Save, CanSave);
}
private void Save() { /* logika zapisu */ }
private bool CanSave() => !string.IsNullOrWhiteSpace(Name);
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Powiązane pojęcia
W ramach encyklopedii można również zapoznać się z następującymi artykułami:
- MVVM – Model‑View‑ViewModel
- MVC – Model‑View‑Controller
- WPF – Windows Presentation Foundation
- Xamarin.Forms
- Vue.js
- SwiftUI
- Data Binding
- Komendy (Commands)
- Testowanie jednostkowe
Podsumowując, ViewModel jest centralnym elementem architektury MVVM, pozwalającym na czyste oddzielenie logiki prezentacji od warstwy danych oraz zapewniającym efektywne powiązanie interfejsu użytkownika z modelem aplikacji.