Delphi class function
Na rozdíl od klasických (instančních) metod pracuje class function s třídami a nikoliv objekty. To znamená, že k nim lze přistupovat bez odkazu na objekt (zavolání funkce nemusí předcházet „Create“). Jaké jsou ale možnosti praktického využití?
Jedná se například o situace jako je zjištění defaultních hodnot a dalších informací o třídě (bez instance), u komponent pak třeba registrace v IDE a podobně. Nedávno jsem ale narazil na alespoň z mého pohledu užitečný „patern“. Tím je obsluha modálních oken pro výběr nebo získávání dat. Klasický přístup je zhruba následující:

S použitím class function se celá logika „vytvoř formulář → zobraz modálně → vezmi výsledek → uvolni“ schová do jedné metody. Execute (název metody) je samozřejmě volitelný. Volající kód je čistý a opakovatelný:

V modálním okně je funkce „Execute“ deklarovaná v sekci „public“. Její implementace vytvoří modální okno. Pokud je okno uzavřeno s ModalResult mrOK, je výstupnímu parametru předána hodnota zjištěná pomocnou funkcí „GetSelectedId“. V tomto případě je to hodnota z DataSetu, kterou uživatel označil v komponentě DBGrid.

Jaké jsou výhody?
- Jednoznačné API pro dialog (Execute pattern)
- Volající kód je krátký, jednotný styl napříč projektem
- Logika je centralizovaná mimo UI
- Menší závislosti a lepší přenositelnost (např. do FMX)
- Execute(out Id) je čistý kontrakt – UI se může změnit, ale signatura zůstane
- Znovupoužitelnost a testovatelnost, méně try/finally bloků