Ukrutně ostré C# 3. díl

V minulých dílech seriálu o C# jsme vám přinesli informace o základních vlastnostech tohoto jazyka a o novém vývojov


V minulých dílech seriálu o C# jsme vám přinesli informace o základních
vlastnostech tohoto jazyka a o novém vývojovém prostředí Visual Studio.NET.
Tentokrát se již pustíme do psaní skutečných aplikací.
Začněme nějakým jednoduchým programem, abychom viděli, jak vlastně zdrojový kód
C# vypadá. Poznamenejme ještě, že zdrojový kód programů psaných v C# bývá
uložen do textových souborů s příponou .cs. Než se pustíte do tvorby větších
programů, pojďme si nejdříve vytvořit klasickou Hello, world! aplikaci. Pro
tento jednoduchý úkol nám bude stačit klasická konzolová aplikace vypisující
svoje důležité sdělení na obrazovku. Výpis zdrojového kódu je velice krátký a
relativně přehledný: Celý výpis začíná klíčovým slovem namespace. Mnoho
programátorů pravděpodobně tuší, co se za ním skrývá. Tímto slovem uvodíme
prostor jmen. Všechny identifikátory v něm jsou unikátní, čímž zabráníme
kolizím jmen tříd a funkcí. Velmi důležitá je též klauzule using. Tímto slovem
importujeme další jmenné prostory, takže pak můžeme používat jejich prvky bez
uvedení plné kvalifikace (pokud nejsou v konfliktu s některým prvkem aktivního
prostoru jmen). Prostor jmen System je poskytován knihovnou tříd .NET. Nyní
přeskočíme několik řádků komentáře. Podobně jako v jazyce Java musí být všechno
uzavřeno ve třídě. Deklaraci třídy uvedeme klíčovým slovem class následovaným
jejím jménem. Deklarace třídy ještě může být uvozena atributy public, private,
protected a internal a modifikátory new, abstract a sealed. Všechny tyto
atributy mají takřka stejný význam jako u deklarace funkcí v jazyce C++ a řídí
přístup k jednotlivým typům a metodám. Jediným neznámým je atribut internal.
Tento atribut zajistí, že daný symbol bude definován pouze v daném souboru.
Funkce modifikátorů je trochu jiná, i když se také týká dědičnosti tříd. Slovem
sealed označujeme třídy, ze kterých již nechceme povolit další dědění. Slovem
abstract naopak uvádíme třídy, jejichž instance nejde vytvářet přímo, ale
teprve po jejich odvození. Modifikátor new je novinkou. Je možné ho použít
pouze na vnořené třídy (nested class). Slouží k tomu, aby schoval některé
zděděné členy třídy.
Po deklaraci jména třídy následuje tělo její deklarace uzavřené do složených
závorek. Oproti jazyku C++ (a obdobně jako v jazyce Java) jsou všechna těla
funkcí psána do těchto složených závorek. Ve stejném souboru, v jakém je třída
deklarována, je tedy také definována (implementována).
Tak jako v jazycích C++ a Java i v C# se konstruktor třídy jmenuje stejně jako
třída samotná. Destruktor však v implicitně generovaných třídách budeme hledat
marně. Neznamená to však, že by nebylo možné napsat vlastní destruktor. Psaní
vlastního destruktoru je však v C# dosti složité, stejně jako jeho volání, a
překračuje rámec tohoto článku.

Funkce programu
Celý program se spustí funkcí Main. Tato funkce musí být statická. Umožníme
tak, aby ji framework .NET zavolal dříve, než se vytvoří instance
zapouzdřujícího objektu. Pokud však chceme používat jiné nestatické metody této
třídy, musíme nejdříve vytvořit její instanci. V našem případě funkce Main
nevrací žádnou hodnotu ani nevyžaduje žádné vstupní paramety. Můžete si však
zvolit, jaké parametry bude vaše funkce vyžadovat a jaké bude vracet hodnoty.
Jelikož se jedná o náš první program v C#, jeho jediná řádka vypíše na
obrazovku pozdrav světu a program se opět ukončí. Výpis na obrazovku u
konzolových aplikací provádíme pomocí funkce Console.WriteLine(). Třída Console
je součástí prostoru jmen System. Tudíž řádky Console.WriteLine("Hello,
world!");a
System.Console.WriteLine("Hello, world!");
vykonají v našem případě prakticky to samé. Při použití plně kvalifikovaného
jména přitom můžeme odstranit naši řádku s klauzulí using. Je to ovšem za cenu
dalšího psaní, možnosti více překlepů atd.
Programátoři v C a C++ si jistě všimnou, že některé věci se v našem programu
neobjevují. Program například nepoužívá operátoru "::" nebo """. Operátor "::"
není vůbec operátorem a """ je použit pouze v malém zlomku programů. Oddělovač
"." se používá ve složených jménech, jako například Console.WriteLine.
Program navíc neobsahuje žádné předběžné (forward) deklarace. Ty nejsou nikdy
potřeba, protože na pořadí deklarací nezáleží.
Také se nepoužívá direktiva #include pro import textového souboru. Závislosti
(dependence) mezi programy jsou ošetřeny symbolicky spíše nežli textově. Tím se
odstraní bariéry mezi programy napsanými v jiných jazycích. Například výše
používaná třída Console by mohla být napsána v jiném jazyce. Jak je aplikace
spuštěna
Teď, když víme, jak vypadá jednoduchý program, je načase si ukázat, jak dochází
ke spuštění klasické .NET aplikace, napsané například v C#. Ačkoliv je jazyk C#
nový a vytvořený právě pro .NET, není to jediný jazyk, který můžeme pro vývoj
aplikací pod tuto platformu použít. Microsoft sám uvádí na trh další jazyky pro
.NET, a to Visual Basic a Visual C++, nehledě na úplně nový nástroj pro tvorbu
internetových stránek ASP.NET. Na Internetu lze také najít firmy, které pro
platformu .NET připravují verze jiných jazyků, jako například Perl. Na
stránkách Microsoftu je pak také možné se dočíst o připravované verzi jazyka
COBOL pro .NET. Všechny tyto jazyky budou svůj kód spouštět obdobným způsobem,
jaký si za okamžik popíšeme. Platforma .NET definuje tzv. společnou jazykovou
podmnožinu (CLS common language subset). Tato podmnožina se stará o hladkou
komunikaci mezi jazyky a knihovnami CLS. Jedná se o jakýsi "pseudoassembler",
který je dále zpracováván až za běhu. Pro vývojáře to znamená, že ačkoliv je C#
novým jazykem, má veškerý přístup ke všem propracovaným knihovnám, které jsou
používány ve Visual Basicu a ve Visual C++.
Proces nahrávání a spouštění aplikace operačním systémem a .NET runtime je
následovný:
Použijete překladač C# nebo jakýkoliv jiný CLS kompatibilní překladač pro vývoj
vašeho kódu.
Vaše zdrojové soubory kompilujete.
Kompilátor vytvoří IL (Intermediate Language, "prostřední" jazyk) a výsledek
přibalí do spustitelného souboru se standardní hlavičkou (PE).
Kompilátor také importuje funkci _CorExeMain ze standardního výkonného
prostředí .NET (zkráceně EE, execution environment).
Když tento soubor spustíte, operační systém se pokusí nahrát PE, jenž také
nahrává DLL knihovnu, která exportuje funkci _CorExeMain. Jde o knihovnu
MSCorEE.DLL.
Nahrávač operačního systému pak skočí na vstupní bod PE (dodaný kompilátorem).
Jedná se pouze o mezikrok, který předá kontrolu do _CorExeMain.
_CorExeMain začne vykonávat IL, který byl přibalen do PE.
Jelikož IL nemůže být vykonáván přímo, EE překládá IL pomoci JIT (just in
time) překladače do nativních CPU ve chvíli, kdy je IL vykonáván. Tento překlad
se děje pouze jednou, když je kód vykonáván poprvé.
Jelikož je tedy jakákoli .NET aplikace pouze tence zabalený IL, je relativně
jednoduché ji podrobit zpětnému překladu (reverse engineering). Stačí trocha
práce s utilitou ILDASM, a máme v čitelné formě náš kód přeložený do mezijazyka
IL. Dá se tedy říci, že .NET spustitelné soubory jsou v podstatě open source,
neboť existuje způsob, jak vygenerovat originální kód. Mnoho vývojářů bude nyní
tvrdit, že tento postup není možný u aplikací napsaných v C++. Ve skutečnosti
mají tak trochu pravdu: existují totiž dva základní druhy aplikací, které
můžeme s novým Visual Studiem vytvářet. Jsou to standardní aplikace, které jsou
kompilovány optimalizačním kompilátorem přímo do nativního kódu, a pak se také
jedná o tzv. "udržované" (managed) aplikace, které jsou překládány CLS
kompatibilním C++ kompilátorem. Navíc je v novém C++ nástroji mnoho nových
rysů, které by vydaly samy o sobě na další článek, jako například atributové
programování, nové knihovny ATL, možnost tvorby extended stored procedures a
mnoho dalších.

Druhy aplikací detailněji
V minulém dílu seriálu byla řeč o jednotlivých druzích projektů, které lze s
Visual Studiem.NET vytvářet. Pojďme se na některé z nich nyní podívat
podrobněji.
Web Service
Jednou z hlavních technologií blízkých jádru .NET platformy je Web Service.
Webové služby umožňují snadno integrovat již běžící interní aplikace a mohou
také přistupovat ke službám vystaveným jinými organizacemi. Kombinací webových
služeb mohou firmy např. sjednotit bankovní služby, elektronické platby účtů,
obchod s akciemi a pojišťovací služby do jednoho portálu pro správu financí.
WebService je malou komponentou aplikace, která skrývá například část obchodní
logiky. Tato logika může být velmi komplexní.
Když je projekt Web Service přeložen, může být spuštěn přes HTTP. Vstupní a
výstupní data jsou do služby předávána pomocí XML. Celou službu také můžeme
spouštět přímým předáním parametrů za URL. Pak nám .NET automaticky zabalí
výsledek do XML, které vrátí prohlížeči.
Když vyvoláme náš Web Service s parametrem "?SDL" na konci URL, server nám
poskytne zajímavou informaci: je to dokument, který popisuje danou službu.
Tento dokument specifikuje veřejné rozhraní služby, vstupní parametry a datové
typy, ale také výstupní datové typy. Důležité je, že tuto funkčnost nám
poskytuje samotné Visual Studio.NET automaticky, bez nutnosti psát jakýkoliv
kód podporující tuto sebedokumentující funkcionalitu.

Class library
Jak už název napovídá, v případě Class library se jedná o knihovny tříd. Ty
mají po překladu příponu DLL, jako standardní dynamické knihovny Windows. Avšak
když jsou spuštěny, běží zapouzdřeny v prostředí platformy .NET, což jim
umožňuje využívat její vlastnosti. Class library tak může být použita například
ve webové aplikaci, ale zrovna tak je možné ji použít v aplikaci napsané v C++
přeložené do nativního binárního kódu. Vstupní kód knihovny se automaticky
postará o překlad a interpretaci tříd uvnitř knihovny, čímž umožní hladké
používání knihovny z jakéhokoli prostředí.

Web application
Projekty vytvořené pomocí šablony Web application patří do úplně nové sféry
aplikací. Jedná se v podstatě o propojení ASP.NET stránek a webových služeb.
Pomocí tohoto komplexního řešení můžeme vybudovat například e-commerce portál.
Oproti klasické webové službě se jedná o aplikaci, která navíc disponuje
aktivním uživatelským rozhraním. Bez nějaké formy uživatelského rozhraní se
neobejde většina aplikací, snad jen systémové služby nepotřebují s uživatelem
komunikovat. V posledních letech většina programů prezentuje svoje informace
uživateli pomocí bohatého grafického rozhraní, které bývá u zdařilých produktů
propracované do nejmenších detailů. Nová platforma .NET a nové vývojové
prostředí poskytují možnosti vyvíjet dva základní druhy aplikací, tradiční a
webové. Pro vývoj uživatelského rozhraní nám pak nabízí dvě bohaté technologie
WinForms a WebForms.

WinForms
Systém WinForms je založen na standardním uživatelském rozhraní operačního
systému Windows. Poskytuje objektový model pro všechny prvky uživatelského
rozhraní. Jedná se o prostor jmen, kde jsou implementovány třídy zaobalující
funkčnost standardních prvků uživatelského rozhraní. Z těchto tříd je možné
dále dědit třídy vlastní, které zapouzdřují zvláštní funkčnost. Přetížená
(odvozená) třída může být samozřejmě implementována v jakémkoliv .NET jazyce.
Mimo snadné manipulace s formuláři pak komponenty WinForms a nové vývojové
prostředí umožňují snadnou integraci s databázovým spojením pomocí vizuálních
komponent. Mnohem zajímavější jsou ovšem formuláře vytvořené pomocí technologie
WebForms.

WebForms
Jak sám název technologie napovídá, tento přístup k vytváření uživatelského
prostředí je úzce spjat s webovými technologiemi. Ve stručnosti jedná se o
vytváření dialogů a uživatelského rozhraní pomocí HTML, právě pro webové
aplikace, které hodláte vytvářet s novým Visual Studiem.NET. Ani v tomto
případě se nejedná o technologii, která by byla omezena pouze na jazyk C#,
právě naopak. WebForms mohou zobrazovat informace pomocí volitelného
značkovacího (markup) jazyka (většinou však budeme volit HTML) přímo ve
specifickém prohlížeči a přitom pracovat podle aplikační logiky, která je ve
skutečnosti vykonávána na serveru. Samozřejmostí pak je, že mohou být
implementovány nejen v jazyce C#, ale i v jiných jazycích, jako třeba Visual
Basic nebo JScript.NET. WebForms také mohou využívat výhod platformy .NET
včetně mezijazykové dědičnosti, dynamického překladu, typové bezpečnosti, ale i
dalších výhod spravovaného .NET prostředí. Uživatelské rozhraní je pomocí
WebForms odděleno do dvou částí. Jednou z nich je vizuální komponenta, druhá
část pak zapouzdřuje logiku uživatelského rozhraní. Tento separující přístup je
jistě známý všem vývojářům, kteří pracovali pomocí RAD nástroje, jako je Visual
Basic nebo Visual C++, kde je koncept oddělení vizuální části a prezentační
logiky použit. Vizuální komponenta WebForms (označovaná stránka) je pak
uchovávána v souborech s příponou .aspx, které obsahují značkovací jazyk
vytvářející stránku. Tuto stránku můžeme vytvořit pomocí jakéhokoliv HTML
editoru a WebForms Server Controls, což jsou ovládací prvky, které se liší od
standardních ovládacích prvků Windows tím, že pracují přímo uvnitř .NET
prostředí. Logiku uživatelského rozhraní pak můžeme implementovat třeba v C#
nebo ve Visual Basicu a můžeme ji zahrnout taktéž do .aspx souboru nebo do
zvláštního souboru, kterému se říká "code-behind". Nová úskalí
Integrace HTML přímo do prostředí aplikace však přináší také nové výzvy pro
vývojáře. Např. může být velmi složité vygenerovat uživatelské rozhraní pomocí
jednoduchého HTML tak, aby se ve všech prohlížečích chovalo stejně. Navíc
klient a server většinou u tohoto druhu aplikací běží každý na jiném počítači a
vyměňují si pouze malá množství dat. Stránky také nejsou generovány a
vykonávány stavově, což znamená, že když server obdrží požadavek, zpracuje jej,
a ihned po odeslání výsledku zapomene kontext, ve kterém požadavek zpracovával.
Když tedy uživatel pošle požadavek na tu samou stránku, server zpracovává celou
akci od začátku znova. Dalším úskalím, které je potřeba překonávat, je
neznámost schopností klienta. Webové aplikace bývají přístupné mnoha
uživatelům, kteří používají jiné prohlížeče. Každý z těchto prohlížečů má jiné
schopnosti, a proto je složité vytvořit aplikaci, která poběží stejně za
každých podmínek. Čtení a zápis do datového zdroje tak mohou být v tomto
případě složité a náročné na systémové prostředky.
Překonání těchto problémů si může vyžádat značné úsilí. WebForms však také
pomáhají adresovat některé z těchto problémů například poskytnutím prostředí
pro vývoj aplikační logiky nezávisle na prohlížeči. Neomezují však zároveň
možnost využít specifických schopností určitého prohlížeče.
WebForms rovněž podporují událostmi řízený programovací model: ošetřování
událostí na straně serveru i těch, které pocházejí z klienta. Události klienta
jsou přeposílány na server, kde jsou zpracovávány automaticky. Jednou z dalších
důležitých vlastností WebForms je jejich schopnost snadné migrace na straně
serveru z počítače s jedním procesorem na několik počítačů vytvářejících
dohromady webovou farmu.

Vyhlídky C#
Většina lidí považuje řešení Microsoftu za příliš proprietární a z toho důvodu
jim nedává velkou šanci na přežití v dnešním světě otevřených technologií. Ve
skutečnosti však Microsoft spolu s dalšími společnostmi postoupil některé svoje
specifikace technologií ke standardizaci u orgranizace ECMA. Jedná se jak o
jazyk C#, tak o CLI (common language infrastructure, infrastrukturu společného
jazyka, která tvoří jádro .NET). Standardy programovacích jazyků jsou většinou
vytvářeny kvůli jednomu z následujících dvou důvodů: 1. Aby se zamezilo
potenciálním konfliktům mezi jednotlivými implementacemi překladačů. 2. Aby se
zobecnil jediný existující překladač, čímž se umožní vývoj dalších implementací
překladače tohoto jazyka. U jazyka C++ platí, že jeho standard byl vytvořen z
prvního důvodu. U jazyka C# naopak platí důvod druhý.
Zda budou opravdu tyto technologie standardizovány, uvidíme v blízké
budoucnosti. Pokud se tak stane, je pravděpodobné, že také budeme svědky, jak
se podpora platformy .NET rozšiřuje na další operační systémy, zrovna tak jako
jazyk C#. Proto stojí za to věnovat jim pozornost již v dnešní době.
1 0091 / pen









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.