encyklopedia.space

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. Observable w 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

  1. Usprawniona testowalność – logikę można testować niezależnie od UI.
  2. Lepsza utrzymywalność kodu dzięki wyraźnemu podziałowi warstw.
  3. Umożliwia współpracę zespołów: deweloperzy UI mogą pracować nad Widokiem, a programiści logiki – nad ViewModelem.
  4. 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:

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.