Delphi a Object Pascal patří k mým dřívějším zkušenostem s vývojem desktopového softwaru a dodnes ovlivňují způsob, jakým přemýšlím o nativních aplikacích, událostmi řízeném programování a dlouhodobě provozovaných softwarových systémech.
S Delphi jsem pracoval jako s vývojovým prostředím pro aplikace pro Windows psané v jazyce Object Pascal.
Přestože se moje současná vývojářská práce zaměřuje více na technologie jako Kotlin, C++, Qt, Python a webové platformy, Delphi představuje důležitou součást mého zázemí v oblasti nativního vývoje.
Jeho hodnota pro mě není pouze historická.
Práce s Delphi přináší praktické zkušenosti s kompilovanými desktopovými aplikacemi, frameworky založenými na vizuálních komponentách, objektově orientovaným programováním, nativní integrací s operačním systémem a softwarem, který může zůstávat v produkčním provozu mnoho let.
Jak jsem Delphi používal
Moje zkušenosti s Delphi zahrnují například:
-
desktopové aplikace pro Windows,
-
Object Pascal,
-
vizuální uživatelská rozhraní,
-
událostmi řízené programování,
-
formuláře a dialogová okna,
-
lokální zpracování dat,
-
operace se soubory,
-
aplikace napojené na databáze,
-
konfiguraci aplikací,
-
nativní funkce systému Windows,
-
údržbu existujícího kódu.
Delphi nabízí velmi přímočarý vývojový model, ve kterém může návrh uživatelského rozhraní, aplikační logika i kompilovaný nativní kód existovat v rámci jednoho integrovaného prostředí.
Object Pascal
Object Pascal je programovací jazyk používaný moderními aplikacemi v Delphi.
Rozšiřuje Pascal o koncepty, jako jsou:
-
třídy,
-
objekty,
-
dědičnost,
-
rozhraní,
-
výjimky,
-
vlastnosti,
-
metody,
-
generika.
Jeho syntaxe je záměrně explicitní.
Jednoduchá třída může koncepčně vypadat například takto:
type
TUser = class
private
FName: string;
public
property Name: string read FName write FName;
end;
Jazyk zřetelně ukazuje strukturu programu a podporuje relativně jasné oddělení deklarací od implementace.
Silné typování
Object Pascal je silně typovaný jazyk.
Explicitní typy považuji za užitečné, protože usnadňují pochopení kontraktů mezi jednotlivými částmi aplikace.
Proměnné, parametry funkcí a návratové hodnoty dávají jasně najevo, jaký typ dat je očekáván.
S růstem aplikace je to stále důležitější.
Silné typování dokáže odhalit řadu nesprávných předpokladů dříve, než se projeví jako problémy za běhu aplikace.
Kompilované aplikace
Delphi vytváří kompilované nativní aplikace.
Tím se jeho vývojový model liší od interpretovaného nebo čistě prohlížečového softwaru.
Výsledná aplikace může přímo komunikovat s:
-
operačním systémem,
-
soubory,
-
nativními knihovnami,
-
API orientovanými na práci s hardwarem,
-
lokálními databázemi.
Znalost kompilovaného desktopového softwaru ovlivnila také můj pozdější přístup k práci s C++ a Qt.
Vývoj desktopových aplikací pro Windows
Delphi bylo historicky obzvlášť silné v oblasti desktopových aplikací pro Windows.
Projekt může obsahovat:
-
aplikační okna,
-
nabídky,
-
dialogová okna,
-
formuláře pro zadávání dat,
-
tabulky,
-
konfigurační rozhraní,
-
zpracování na pozadí.
Prostředí umožňuje efektivně vytvářet tradiční produktivní a utilitní aplikace.
Visual Component Library
Jednou z klíčových technologií tradičního vývoje v Delphi je Visual Component Library.
VCL poskytuje znovupoužitelné komponenty pro uživatelská rozhraní aplikací ve Windows.
Patří mezi ně například:
-
formuláře,
-
tlačítka,
-
editační prvky,
-
seznamy,
-
nabídky,
-
dialogová okna,
-
datové mřížky.
Komponenty zpřístupňují vlastnosti a události, které lze přímo propojit s aplikační logikou.
To vytváří velmi produktivní model pro vývoj tradičního desktopového softwaru.
Událostmi řízené programování
Aplikace v Delphi jsou výrazně založené na událostmi řízeném přístupu.
Aplikace reaguje například na události tohoto typu:
Kliknutí na tlačítko
→ obsluha události
→ validace
→ aplikační akce
→ aktualizace UI
Tento vývojový model mě naučil přemýšlet o softwaru jako o souboru stavů a reakcí, nikoli pouze jako o posloupnosti instrukcí.
Stejný základní princip se objevuje v řadě moderních technologií, i když se liší syntaxe a architektura.
Formuláře
Formuláře představují aplikační okna a dialogy.
Formulář může obsahovat:
-
vizuální ovládací prvky,
-
stav aplikace,
-
obslužné metody událostí.
U jednoduchých aplikací to umožňuje mimořádně rychlý vývoj.
U větších aplikací se však snažím vyhnout tomu, aby byla přímo ve formulářích soustředěna nadměrná část business logiky.
Oddělení logiky od prezentační vrstvy usnadňuje údržbu projektu.
Vizuální vývoj
Delphi nabízí vizuální návrhář formulářů, ve kterém lze komponenty rozhraní přímo rozmísťovat.
To umožňuje rychlý vývoj uživatelského rozhraní.
Vizuální vývoj však nepovažuji za náhradu za pochopení kódu, který za rozhraním stojí.
Stejný princip platí i pro nástroje, které používám dnes, například Bricks Builder nebo náhledy v Jetpack Compose.
Vizuální nástroje urychlují implementaci.
Udržovatelnost však stále určuje architektura.
Komponenty
Komponentový model Delphi podporuje opakované použití.
Komponenta může zapouzdřit:
-
chování,
-
vlastnosti,
-
události,
-
vizuální prezentaci.
Díky tomu lze větší rozhraní skládat z menších znovupoužitelných částí.
Myšlenka znovupoužitelných komponent je důležitá i v mnoha technologiích, které používám dnes, například:
-
Qt,
-
Jetpack Compose,
-
moderní webová rozhraní.
Vlastnosti
Vlastnosti v Object Pascalu poskytují řízený přístup ke stavu objektu.
Vlastnost může zpřístupnit hodnotu a současně umožnit implementaci řídit způsob jejího čtení nebo změny.
To podporuje zapouzdření a zároveň zachovává dobrou čitelnost aplikačního kódu.
Třídy a objekty
V Delphi používám objektově orientované koncepty, jako jsou:
-
třídy,
-
konstruktory,
-
dědičnost,
-
zapouzdření,
-
polymorfismus.
Stejné koncepty se následně přirozeně přenášejí i do jazyků, jako jsou:
-
C++,
-
Kotlin,
-
PHP.
Konkrétní syntaxe se mění.
Architektonické principy však zůstávají užitečné.
Rozhraní
Rozhraní v Object Pascalu mohou definovat kontrakty nezávisle na konkrétních implementacích.
Díky tomu lze omezit provázanost mezi jednotlivými částmi aplikace.
U větších systémů může návrh orientovaný na rozhraní usnadnit, aby komponenty byly:
-
snáze nahraditelné,
-
snáze testovatelné,
-
snáze udržovatelné.
Tento koncept používám napříč více programovacími jazyky, nejen v Delphi.
Zpracování výjimek
Delphi poskytuje strukturované zpracování výjimek.
Zpracování chyb používám tam, kde mohou aplikační operace legitimně selhat, například při:
-
přístupu k souborům,
-
komunikaci s databází,
-
konverzi dat,
-
práci s externími zdroji.
Cílem není pouze zabránit pádu aplikace.
Aplikace by měla rozlišovat, které chyby lze zotavitelně zpracovat, a reagovat na ně smysluplným způsobem.
Zpracování souborů
Desktopové aplikace často potřebují přímý přístup k souborovému systému.
Delphi poskytuje přímočarý přístup k operacím, jako jsou:
-
čtení souborů,
-
zápis souborů,
-
práce s adresáři,
-
konfigurace.
Externí soubory považuji za nedůvěryhodné vstupy.
Aplikace by měly počítat například se situacemi, kdy:
-
soubor chybí,
-
má neplatný formát,
-
je omezen přístup,
-
obsahuje neočekávaná data.
Tento defenzivní přístup zůstává relevantní bez ohledu na použitý programovací jazyk.
Streamy
Zpracování založené na streamech je užitečné při práci se soubory a binárními daty.
Místo předpokladu, že lze každý zdroj načíst celý do jednoho řetězce nebo bufferu, umožňují streamy zpracovávat data prostřednictvím definovaného rozhraní.
Pochopení tohoto modelu se přímo přenáší do moderního zpracování médií i serverových aplikací.
Konfigurace
Desktopové aplikace často vyžadují trvalé uložení konfigurace.
V závislosti na projektu lze konfiguraci ukládat například do:
-
souborů,
-
nastavení operačního systému,
-
databází.
Preferuji explicitní správu konfigurace aplikace před rozptýlením natvrdo zadaných hodnot po zdrojovém kódu.
Databázové aplikace
Delphi bylo tradičně široce používáno pro databázově orientované desktopové aplikace.
Tento model může vypadat například takto:
Uživatelské rozhraní
↓
Aplikační logika
↓
Přístup k databázi
↓
Relační databáze
Práce s databázovými aplikacemi zdůrazňuje význam:
-
datového modelování,
-
dotazů,
-
validace,
-
transakcí,
-
zpracování chyb.
Tyto koncepty se přímo promítají i do mé současné práce s SQL, PostgreSQL, SQLite a Room.
SQL
Znalost SQL je užitečná bez ohledu na framework používaný pro přístup k databázi.
V databázových aplikacích v Delphi lze pomocí SQL řešit například:
-
dotazy,
-
filtrování,
-
řazení,
-
spojování tabulek,
-
aktualizace dat.
Preferuji porozumět skutečně prováděnému dotazu namísto toho, abych databázové komponenty vnímal jako zcela neprůhlednou abstrakci.
Validace dat
Desktopové formuláře často shromažďují strukturované vstupy od uživatele.
Data ověřuji ještě předtím, než se dostanou k důležité aplikační logice nebo do trvalého úložiště.
Validace může zahrnovat například:
-
povinné hodnoty,
-
číselné rozsahy,
-
očekávané formáty,
-
vzájemnou konzistenci polí.
Grafické rozhraní samo o sobě neznamená, že lze vstupům uživatele bezvýhradně důvěřovat.
Oddělení UI a logiky
Jednou z nejčastějších chyb při rychlém vizuálním vývoji aplikací je umístění veškeré logiky přímo do obsluh tlačítek a událostí formulářů.
Zpočátku to funguje, ale s růstem projektu se takový kód stává obtížně udržovatelným.
Preferuji oddělení:
Uživatelské rozhraní
↓
Aplikační logika
↓
Data / služby
všude tam, kde to složitost aplikace opodstatňuje.
Tento princip se přímo promítl i do architektur, které používám dnes.
Integrace s Windows API
Delphi může přímo komunikovat s Windows API v případech, kdy standardní framework neposkytuje potřebnou funkcionalitu.
Aplikace tak mohou pracovat například s:
-
zprávami operačního systému,
-
okny,
-
soubory,
-
systémovými službami,
-
dalšími nativními funkcemi.
Práce blízko úrovně operačního systému poskytuje užitečnou perspektivu, kterou vyšší aplikační frameworky někdy skrývají.
Nativní knihovny
Aplikace v Delphi mohou spolupracovat také s externími nativními knihovnami.
To vyžaduje porozumění konceptům, jako jsou:
-
načítání knihoven,
-
exportované funkce,
-
datové typy,
-
volací konvence.
Tato rozhraní vyžadují pečlivou implementaci, protože chyby na hranici nativního kódu mohou způsobovat problémy, které jsou méně tolerantní než běžné chyby na aplikační úrovni.
Správa paměti
Tradiční nativní vývoj vyžaduje povědomí o vlastnictví prostředků.
Objekty i další prostředky musí mít jasně definovanou dobu života.
Nesprávné vlastnictví může vést k:
-
únikům paměti,
-
neplatným referencím,
-
únikům prostředků.
Moderní Delphi poskytuje mechanismy, které řadu úloh zjednodušují, ale porozumění životnímu cyklu prostředků zůstává cenné.
Stejné uvažování se přímo uplatňuje také při vývoji v C++.
Životní cyklus objektů
Explicitně přemýšlím o tom, která komponenta objekt vytváří a která je zodpovědná za jeho zničení.
Jasně definované vlastnictví omezuje nejednoznačnost.
Tento koncept je důležitý i v jazycích s automatickou správou paměti, protože prostředky jako:
-
soubory,
-
databázová připojení,
-
nativní handly
mají stále skutečný životní cyklus.
Vlákna
Desktopové aplikace musí dlouhotrvající operace přesouvat mimo UI vlákno, pokud má uživatelské rozhraní zůstat responzivní.
Může jít například o:
-
zpracování souborů,
-
databázové operace,
-
síťovou komunikaci,
-
výpočty.
Základní princip je stejný jako v moderním vývoji pro Android nebo webové prohlížeče:
UI vlákno
→ interakce a vykreslování
Worker
→ výpočetně náročné zpracování
Bezpečnost vláken
Jakmile aplikace pracuje s více vlákny, je nutné se sdíleným měnitelným stavem zacházet velmi opatrně.
Nepředpokládám, že dvě části kódu mohou bezpečně současně měnit stejná data.
Souběh přináší problémy, které se diagnostikují podstatně obtížněji než běžná sekvenční logika.
Tato zkušenost se přímo přenáší do moderních architektur pro zpracování na pozadí.
Časovače a operace na pozadí
Desktopové aplikace někdy používají časovače pro periodické chování.
Časovače používám pro lehké plánování tam, kde je to vhodné, ale vyhýbám se provádění náročných operací přímo v často spouštěných callback funkcích časovačů.
Periodické spouštění by nemělo způsobovat zamrzání uživatelského rozhraní.
Síťová komunikace
Aplikace v Delphi mohou komunikovat po síti a integrovat vzdálené služby.
Platí zde stejné defenzivní principy jako u moderních integrací přes REST.
Vzdálená komunikace může:
-
vypršet na timeoutu,
-
selhat,
-
vrátit data v neplatném formátu,
-
se neočekávaně přerušit.
Spolehlivá aplikace musí síťové selhání považovat za běžnou situaci, nikoli za výjimečný stav.
Stav aplikace
Desktopový software často pracuje s významným množstvím stavových informací.
Může jít například o:
-
aktuální dokument,
-
vybraný záznam,
-
uživatelské preference,
-
aktuálně probíhající operaci,
-
stav připojení.
Důležitý stav preferuji mít definovaný explicitně.
Pokud je stav rozptýlen mezi řadou nesouvisejících ovládacích prvků a globálních proměnných, chování aplikace se výrazně hůře chápe a předvídá.
Globální proměnné
Delphi umožňuje globální stav vytvářet velmi snadno, ale globální proměnné nepoužívám jako výchozí mechanismus komunikace mezi nesouvisejícími částmi aplikace.
Globální měnitelný stav vytváří skryté závislosti.
Preferuji:
-
explicitní objekty,
-
parametry,
-
služby,
-
jasně definované vlastnictví.
Stejný princip platí napříč všemi programovacími jazyky.
Moduly a unity
Object Pascal organizuje kód do jednotek neboli unitů.
Unit může obsahovat:
-
typy,
-
funkce,
-
třídy,
-
implementační detaily.
Tuto strukturu používám k oddělení souvisejících odpovědností.
Projekt se lépe chápe, když je kód organizován podle účelu namísto toho, aby se postupně hromadil v jediném velkém zdrojovém souboru.
Veřejná a privátní rozhraní
Unity rozlišují mezi veřejnými deklaracemi a implementačními detaily.
Toto oddělení považuji za důležité.
Ostatní části aplikace by měly záviset na malém a záměrně navrženém rozhraní, nikoli na každém interním implementačním detailu.
Menší veřejně zpřístupněná plocha usnadňuje bezpečnější refaktoring.
Refaktoring legacy aplikací
Delphi je stále přítomné v řadě dlouhodobě provozovaných podnikových aplikací.
Práce se starším kódem vyžaduje jiný způsob uvažování než tvorba zcela nového projektu.
Legacy aplikace může obsahovat:
-
nezdokumentované předpoklady,
-
silně provázané formuláře,
-
globální stav,
-
staré komponenty třetích stran,
-
databázové závislosti.
Takové systémy preferuji zlepšovat postupně.
Kompletní přepis není automaticky bezpečnější.
Nejdříve porozumět, potom přepisovat
Než začnu měnit starší aplikaci, snažím se nejprve pochopit:
-
co kód skutečně dělá,
-
na jakém chování jsou uživatelé závislí,
-
které externí systémy na aplikaci závisejí,
-
kde se nacházejí skutečná rizika.
Starý software může obsahovat důležité business know-how, které není zdokumentované nikde jinde.
Jeho nahrazení bez porozumění tomuto chování může způsobit více problémů, než kolik jich vyřeší.
Postupná modernizace
Pokud je modernizace potřebná, preferuji řízené změny.
Například:
Existující kód
↓
Izolace odpovědnosti
↓
Vytvoření čistšího rozhraní
↓
Přesun logiky
↓
Testování
Takový přístup umožňuje architekturu postupně zlepšovat a zároveň zachovat funkční chování systému.
Komponenty třetích stran
Projekty v Delphi mohou být výrazně závislé na vizuálních i nevizuálních komponentách třetích stran.
Při údržbě takových projektů je důležitá správa závislostí.
Zohledňuji například:
-
dostupnost zdrojových kódů,
-
kompatibilitu,
-
licencování,
-
budoucí udržovatelnost.
Pohodlná komponenta se může postupně změnit v dlouhodobou architektonickou závislost.
Správa verzí
Starší pracovní postupy v Delphi často vznikly ještě před rozšířením moderního vývoje založeného na Gitu.
U každého udržovaného zdrojového kódu preferuji řádnou správu verzí.
Ta poskytuje:
-
historii změn,
-
dohledatelnost,
-
možnost návratu změn,
-
bezpečnější refaktoring.
I legacy kód může z moderní disciplíny správy verzí výrazně těžit.
Ladění
Delphi poskytuje interaktivní ladicí nástroje pro nativní aplikace.
Při ladění sleduji například:
-
tok vykonávání programu,
-
hodnoty proměnných,
-
výjimky,
-
zásobníky volání.
Cílem je najít skutečný původ problému, nikoli pouze zalepit jeho viditelný příznak.
Tento způsob uvažování při ladění uplatňuji napříč všemi technologiemi, se kterými pracuji.
Varování kompilátoru
Varování kompilátoru mohou odhalit problémy ještě předtím, než se z nich stanou chyby v produkčním prostředí.
Preferuji jejich kontrolu před automatickým ignorováním hlučného buildu.
Varování týkající se například:
-
nepoužitých hodnot,
-
podezřelých konverzí,
-
nedosažitelného kódu
mohou odhalit nesprávné předpoklady.
Čistému buildu se důvěřuje podstatně snáze.
Defenzivní programování
Desktopové aplikace musí zvládat neočekávané situace, jako jsou:
-
chybějící soubory,
-
neplatná konfigurace,
-
nedostupné databáze,
-
neočekávaný vstup,
-
chyby operačního systému.
Preferuji ověřovat předpoklady a zpracovávat selhání co nejblíže místu, kde vzniká.
Základní princip je v Delphi stejný jako v moderním backendovém, mobilním i webovém vývoji.
Výkon
Nativní aplikace mohou být velmi rychlé, ale nativní kompilace sama o sobě neodstraní neefektivní architekturu.
Stále proto zohledňuji například:
-
zbytečné databázové dotazy,
-
blokující operace v UI,
-
velké alokace paměti,
-
opakované výpočty.
Problémy s výkonem je vhodné měřit, nikoli odhadovat.
Udržovatelnost
Nástroje typu Rapid Application Development mohou počáteční implementaci výrazně urychlit.
Problém se objevuje později, pokud projekt roste bez odpovídající architektury.
Proto si cením zejména:
-
jasného pojmenování,
-
dobře vymezených unitů,
-
oddělení odpovědností,
-
explicitního stavu,
-
omezené provázanosti.
Software, který lze snadno vytvořit, ale nelze jej bezpečně upravovat, nepovažuji za dobře zvládnuté softwarové inženýrství.
Delphi a C++
Moje zkušenosti s Delphi poskytují užitečný kontext pro mou práci s C++.
Obě technologie se týkají nativního softwaru a vyžadují větší povědomí o:
-
životním cyklu prostředků,
-
integraci s operačním systémem,
-
kompilovaném kódu,
-
architektuře desktopových aplikací.
C++ nabízí výrazně odlišné možnosti jazyka, ale mnoho nízkoúrovňových softwarových konceptů se přenáší přirozeně.
Delphi a Qt
Mezi vývojem v Delphi/VCL a Qt existují také koncepční podobnosti.
Oba přístupy poskytují frameworky pro tvorbu nativních aplikací ze znovupoužitelných komponent.
V současnosti se v nativním vývoji orientuji více na C++ a Qt, ale zkušenosti s Delphi mi poskytují další perspektivu na architekturu desktopových UI a událostmi řízeného softwaru.
Delphi a moderní aplikační architektura
Mnoho principů, se kterými jsem se poprvé setkal v tradičním desktopovém softwaru, zůstává relevantních i dnes.
Například:
události Delphi
→ moderní událostmi řízené UI
vlákna na pozadí
→ coroutines / workers
databázové komponenty
→ repositories / DAOs
formuláře
→ screens / composables
komponenty
→ znovupoužitelné UI komponenty
Implementační technologie se mění.
Základní inženýrské problémy však často zůstávají překvapivě podobné.
Legacy technologie neznamená nerelevantní znalosti
Delphi neprezentuji jako centrum svého současného technologického stacku.
Moje současné projekty obecně využívají novější ekosystémy tam, kde lépe odpovídají požadavkům.
Předchozí zkušenosti s Delphi však zůstávají užitečné, protože představují jinou vrstvu softwarového vývoje než prohlížečová prostředí nebo vysokoúrovňové skriptovací jazyky.
Zahrnují přímé zkušenosti s:
-
kompilovaným softwarem,
-
nativními rozhraními,
-
životním cyklem desktopových aplikací,
-
integrací s operačním systémem,
-
dlouhodobě udržovanými codebase.
Pochopení více generací softwarových technologií usnadňuje rozpoznat, které inženýrské principy jsou skutečně fundamentální a které jsou pouze trendy specifickými pro konkrétní framework.
Delphi & Object Pascal v mém technologickém stacku
Delphi a Object Pascal vnímám jako součást svých dřívějších a legacy zkušeností vedle současných nativních a aplikačních technologií.
Související části mého současného stacku zahrnují:
-
C++,
-
Qt,
-
SQL,
-
SQLite,
-
Python,
-
Kotlin,
-
Git.
Delphi představuje dřívější část mých zkušeností s vývojem softwaru, která přispívá k mému porozumění nativním desktopovým aplikacím a udržovatelné aplikační architektuře.
Proč Delphi ponechávám ve svém technologickém stacku
Delphi a Object Pascal ve svém technologickém stacku ponechávám proto, že technické zkušenosti nepřestávají být užitečné ve chvíli, kdy začnu preferovat novější framework.
Práce s Delphi přináší zkušenosti s vývojovým modelem postaveným na kompilovaných nativních aplikacích, vizuálních komponentách, událostmi řízeném programování, databázích a přímé interakci se systémem Windows.
Zároveň poskytuje perspektivu na důležitý inženýrský problém: údržbu softwaru, který může zůstat v provozu výrazně déle než technologický cyklus, ve kterém původně vznikl.
Dnes bych technologii pro novou aplikaci volil podle skutečných požadavků projektu, nikoli automaticky ve prospěch Delphi.
Porozumění Delphi a Object Pascalu však zůstává součástí širších inženýrských zkušeností, které přináším do nativního a desktopového vývoje softwaru.