Vývoj desktopových aplikací

Ekosystémy pro desktopový vývoj

Vývoj desktopových aplikací stojí na různých platformách a runtime prostředích. .NET (C#, F# a VB) nabízí bohaté GUI frameworky pro Windows i multiplatformní scénáře. Java poskytuje přenositelnost prostřednictvím JVM s knihovnami typu JavaFX či Swing. C++ umožňuje plně nativní, vysoce výkonné aplikace s knihovnami jako Qt, wxWidgets či JUCE. Volba výrazně ovlivňuje výkon, uživatelský zážitek, náročnost údržby, bezpečnost, integraci s operačním systémem i náklady na distribuci.

Srovnání platforem: vysoká úroveň

Dimenze .NET Java C++
Runtime .NET CLR / CoreCLR JVM / HotSpot / OpenJ9 Žádný (nativní binárka)
GUI frameworky WPF, WinForms, WinUI 3, MAUI (desktop) JavaFX, Swing, SWT Qt, wxWidgets, MFC, JUCE, ImGui
Přenositelnost Windows (nativně), Linux/macOS přes MAUI/GTK#/Avalonia Vysoká (JVM na cílové platformě) Vysoká (v závislosti na frameworku a toolchainu)
Výkon JIT/AOT, dostačující pro většinu GUI, P/Invoke pro nativní kritické části JIT, velmi dobrý, občas vyšší latence startu Špičkový (nativní), kontrola nad pamětí
Distribuce MSIX/MSI, self-contained publikace Jlink/jpackage, bundlery pro různé platformy NSIS/Wix, platformní balíčky (DEB/RPM, PKG/DMG)
Typické scénáře Line-of-Business na Windows, podnikové nástroje Kros-platformní nástroje, vzdělávání, podnikové klienty CAD/CAE, audio/video, grafika, nástroje s požadavky na výkon

.NET: přehled GUI technologií

  • WPF (Windows Presentation Foundation): vektorové vykreslování přes DirectX, data binding, šablony a MVVM. Vhodné pro komplexní podniková uživatelská rozhraní na Windows.
  • WinForms: zralý, jednoduchý event-driven model, rychlý vývoj CRUD aplikací. Omezenější možnosti skinování a škálování DPI, ale stále relevantní.
  • WinUI 3 / Windows App SDK: moderní Fluent komponenty, kompozice a původ v UWP. Vhodné pro moderní Windows UX.
  • .NET MAUI (desktop): multiplatformní (Windows, macOS, Linux částečně přes komunitu). Jeden kód, různé renderery.
  • Avalonia (komunita): XAML-like, multiplatformní, silná alternativa k MAUI pro desktop-first aplikace.

Java: GUI stack a přenositelnost

  • JavaFX: scénografický model (Scene Graph), CSS stylování, FXML, mediální stack, 3D. Vhodné pro modernější uživatelská rozhraní.
  • Swing: starší, stále masově používaný; stabilní API a rozsáhlý ekosystém komponent. Často využívaný v korporátní sféře.
  • SWT: tenká vrstva nad nativními widgety; vzhledově bližší nativu, složitější distribuce.
  • Distribuce přes jlink/jpackage: vytváření minimalizované runtime image s bundlerem pro danou platformu (EXE, DMG, DEB).

C++: nativní rámce a výkon

  • Qt: bohaté widgety, QML (deklarativní UI), mezinárodní prostředí, WebEngine, síť a multimédia, signal/slot model. Komerční i open-source licence.
  • wxWidgets: nativní vzhled přes obal nad nativními toolkity. Mírně menší ekosystém komponent.
  • MFC/Win32: historické, velmi blízko OS API; plná kontrola, vyšší náročnost údržby.
  • JUCE: audio DSP, pluginy (VST/AU/AAX), cross-platform UI – standard pro profesionální audio aplikace.

Návrhové vzory UI: MVC, MVP, MVVM, MVI

Na desktopu je populární MVVM (WPF/MAUI/Avalonia) díky data bindingu a příkazům (commandům). V Javě se používá MVP/MVC (Swing/JavaFX), v C++ (Qt) kombinace signals/slots s modelem-view (QAbstractItemModel). Klíčem je oddělit prezentační logiku od doménové a správu stavu provádět testovatelným způsobem.

Vykreslování, DPI a přístupnost

  • DPI a škálování: High-DPI je základní požadavek (4K/5K obrazovky). WPF, WinUI, MAUI i JavaFX podporují škálování; v C++ záleží na frameworku (Qt má kvalitní podporu HiDPI).
  • Accessibilita: UIA (Windows), ATK/AX (Linux/macOS). Využijte role, názvy, popisy a klávesovou navigaci. JavaFX, Swing a Qt poskytují adaptéry na platformní API pro přístupnost (A11y).

Výkon a práce s vlákny

  • UI vlákno: GUI běží v jediném vlákně (Dispatcher ve WPF, Event Dispatch Thread ve Swingu/JavaFX, hlavní vlákno v Qt). Dlouhotrvající operace běží na pozadí (Task, CompletableFuture, std::async/QThread).
  • Asynchronní modely: .NET async/await, Java CompletableFuture / strukturovaná konkurence (Project Loom), C++ std::future a Qt signály.
  • Profilace: sledujte pauzy garbage collectoru (.NET/Java), alokace a cache missy v C++. Optimalizujte především IO a cykly layoutu/vykreslování.

Správa paměti a stabilita

  • .NET/Java: garbage collector usnadňuje vývoj, ale vyžaduje odpovědné zacházení s velkými a UI objekty (odvázání event handlerů, vzory Dispose/Close).
  • C++: RAII, chytré ukazatele (unique_ptr, shared_ptr), důsledná správa vlastnictví. V Qt se používá parent-child vlastnictví QObjectů.

Modularita a pluginy

  • .NET: MEF/DI kontejnery, dynamické načítání Assembly, AssemblyLoadContext (.NET 5+).
  • Java: JPMS (Java 9+), OSGi, ServiceLoader, vlastní pluginové systémy přes ClassLoader.
  • C++: dynamické knihovny (DLL/SO/DYLIB), symboly, stabilní ABI; Qt nabízí QPluginLoader.

IPC, automatizace a integrace s OS

  • IPC: pojmenované kanály (Pipes), sockety, gRPC, D-Bus (Linux), COM (Windows), sdílená paměť.
  • Integrace s OS: asociace souborů, kontextová menu shellu, registr, služby/daemony, notifikace, taskbar/badge, klávesové zkratky, systémová lišta (system tray).

Úložiště a princip offline-first

  • Databáze: SQLite jako standard pro desktop; ORM: EF Core (.NET), JPA/Hibernate (Java), přístup přes Qt SQL v C++.
  • Datové formáty: JSON, Protocol Buffers, MessagePack; transakční logy pro robustní obnovu stavu.

Testování: jednotkové, integrační a UI testy

  • .NET: xUnit, NUnit, MSTest, UI testy (WinAppDriver, Playwright pro WebView2), snapshoty XAML.
  • Java: JUnit/Jupiter, TestFX (JavaFX), Jemmy (Swing), Mockito k izolaci komponent.
  • C++: GoogleTest, Catch2, Doctest, UI testovací nástroje dle frameworku (QtTest).
  • Stabilita UI testů: využívejte test IDs, explicitní čekání, izolovaná data a deterministické layouty.

Systémy sestavení a závislosti

  • .NET: MSBuild, SDK-style projekty, NuGet, centralizovaná správa balíčků, self-contained publikace.
  • Java: Maven, Gradle, BOM, multi-module buildy, reprodukovatelné sestavení.
  • C++: CMake, Meson, vcpkg, Conan pro správu knihoven, toolchain files pro cross-kompilace.

Distribuce a aktualizace

  • Windows: MSIX, MSI (WiX), ClickOnce (legacy), Squirrel. Podpis kódu (Authenticode), reputace SmartScreen.
  • macOS: DMG/PKG, notarizace a podpis (Developer ID), sandbox při distribuci do Mac App Store.
  • Linux: DEB/RPM, AppImage, Flatpak/Snap; požadavky na závislosti a knihovny.
  • Automatické aktualizace: kanály (stable/beta), delta balíčky, rollback; bezpečnost aktualizačního kanálu (TLS, podepsané manifesty).

Bezpečnost a compliance

  • Sandbox a oprávnění: na Windows často plný desktop; je vhodné zvážit princip least privilege a proměnné UAC. Na macOS sandbox při distribuci přes Store.
  • Ochrana tajemství: klíčové trezory (DPAPI, Keychain, libsecret), bez uložení tajemství v binárních souborech.
  • Zpevnění aplikace: ASLR/DEP, kódování vstupů, bezpečné deserializace, podpis binárek a integrita aktualizací.

UX a nativní chování

  • Nativní idiomy: klávesové zkratky, menu bar na macOS, taskbar na Windows, portálové integrace na Linuxu.
  • Responzivní desktop: layout mřížky, škálování, minimalizace jank při změně velikosti; plynulost je stejně důležitá jako na webu.

Webové vložky a hybridní přístupy

  • WebView2 (Edge) v .NET/Win: vykreslení webového UI uvnitř desktopu; sdílení kódu s webovou aplikací.
  • JxBrowser/JCEF pro Javu: integrace Chromium do Java UI.
  • C++/Qt WebEngine: embedded Chromium, vhodné pro hybridní obrazovky a dokumentaci.

Modernizace legacy aplikací

  • WinForms → WPF/WinUI: postupný přepis klíčových obrazovek, hostování WinForms ve WPF (ElementHost) a naopak.
  • Swing → JavaFX: JFXPanel jako přechodné řešení, modulární migrace.
  • MFC → Qt: paralelní moduly, postupná výměna UI vrstev, zachování C++ jádra.

Telemetrie, logování a diagnostika

  • Logování: strukturované (Serilog, NLog, SLF4J, Logback, spdlog, g3log). Korelace operací a anonymizace citlivých údajů (PII).
  • Chybové hlášení (crashes): WER (Windows Error Reporting), Sentry, Rollbar, Crashpad. Symboly (PDB/dSYM) pro srozumitelné stacktrace.
  • Metoda „perf budget“: definujte cíle startu aplikace (TTI), reakce na vstup a spotřebu RAM/CPU/GPU.

Licencování a obchodní modely

  • Licenční klíče a aktivace: hardwarový otisk, offline licence, odolnost proti manipulaci.
  • OEM a Store kanály: Microsoft Store, Mac App Store, vlastní distribuce. Požadavky na sandbox a certifikace.

Praktické volby podle scénáře

  • Backoffice na Windows: .NET WPF/WinUI, rychlý vývoj, snadná integrace s Active Directory a Office, EF Core s SQLite/SQL Serverem.
  • Kros-platformní nástroj: JavaFX (jpackage) nebo Qt (C++). Pokud preferujete C#, zvažte Avalonia/MAUI.
  • Výkonově náročné aplikace (CAD/audio/video): C++ s Qt/JUCE, případně hybridní řešení s .NET a nativními knihovnami (C++/CLI, P/Invoke).

Ukázky minimálních programů (zkráceno)

.NET (WPF, C#):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Title="Ahoj" Width="300" Height="200"><StackPanel><Button Content="Klikni" /></StackPanel></Window>

Java (JavaFX):

public class App extends Application { public void start(Stage s){ Button b = new Button("Klik"); s.setScene(new Scene(new StackPane(b), 300, 200)); s.show(); } }

C++ (Qt Widgets):

int main(int argc, char** argv) { QApplication app(argc, argv); QPushButton b("Klik"); b.show(); return app.exec(); }

CI/CD pro desktop