Stavebnice se nejlépe skládá z komponent

1. 6. 1999

Sdílet

Komponenty, komponentové programování a komponentový software (tzv. "componentwa re") se staly jedním z fenoménů součas...

Komponenty, komponentové programování a komponentový software (tzv. „componentwa

re“) se staly jedním z fenoménů současné doby. Jaké výhody přináší použití

komponent při vývoji softwaru?

Trocha historie

Jedním z motorů zlepšování technologií pro vývoj softwaru je snaha o

znovupoužitelnost napsaného kódu. To byl také asi hlavní důvod vzniku

technologie komponent. V dobách velmi dávných začali programátoři používat

procedury a funkce umístěné v knihovnách. Ačkoliv to přineslo veliký pokrok,

programátorům to nestačilo. Přišla doba objektově orientovaného programování a

funkci knihoven nahradily třídy. Ty se v mnoha směrech již blíží koncepci

komponent, ale třídy byly vždy vázány na jeden konkrétní vývojový prostředek.

Ve světě Windows přišla myšlenka dynamicky připojovaných knihoven (DLL), které

byly méně závislé na použitém vývojovém prostředku a byly v binárním tvaru.

Nevýhodou knihoven DLL však byla jejich dostupnost pouze na Windows a také

skutečnost, že je nebylo vždy možné modifikovat bez nutnosti rekompilace

programu, který je využíval.

Přichází věk komponent

Komponenty jsou v tomto směru posledním vývojovým stupněm. Jedná se o takovou

část kódu v binární podobě, jejíž rozhraní je v přesně definovaném a

normalizovaném tvaru, takže je zcela nezávislá na použitém vývojovém prostředku.

Snaha využít již jednou hotový kód však není jedinou výhodou z použití

komponent. Ukazuje se, že komponenty jsou vhodným nástrojem pro transparentní

řešení distribuovaných úloh. Z hlediska implementace je totiž jedno, zda bude

daná komponenta spuštěna na lokálním nebo na vzdáleném systému. O vyvolání

komponenty a komunikaci s komponentami se nemusíte starat, ať už jste tvůrce či

uživatel o vše se totiž postará příslušná technologie.

Není všechno zlato

Vývoj s použitím komponent má nepochybně své výhody, ale je třeba počítat i s

určitými obtížemi.

Vážným problémem může být správa aplikace složené z komponent. Pokud je

aplikace „monolit“ v podobě EXE souboru, není problém jej snadno instalovat na

kterýkoliv počítač. Správa aplikace, která je rozložena do mnoha souborů DLL,

OCX apod. (jež je navíc obvykle nutné korektně zaregistrovat), je obvykle

náročnější.

Důležité je při vývoji aplikace správně navrhnout rozložení na jednotlivé

komponenty tj. určit, jak velkou funkcionalitu zapouzdřit do jedné komponenty,

aby se maximalizovala možnost znovupoužití. Ukazuje se, že tuto vlastnost

nejlépe splňují komponenty „střední velikosti“. Příliš malé komponenty nemají

vlastně smysl a příliš velké jsou zase málo flexibilní.

Je třeba si uvědomit, že při přístupu ke komponentě je nutné vykonat poměrně

velké množství kódu, který řeší předávání parametrů a vrácení výsledku v

porovnání s vyvoláním nějaké procedury v běžných vývojových prostředcích je

kódu mnohem více. Je proto nutné počítat s tím, že časté vyvolávání metod

nějaké komponenty bude značně brzdit zpracování (zejména pokud je komponenta

spuštěna jako samostatný proces). Při definování jednotlivých komponent

vyvíjeného systému je proto nutné myslet na to, aby komunikace mezi nimi byla

co nejmenší.

V literatuře o komponentovém programování je často popisován „programátorský

ráj“, kde na všechno je nějaká komponenta a vývoj aplikace spočívá jen v jejich

propojování.

Už dnes je možné si poměrně snadno přímo na Internetu zakoupit mnoho různých

komponent. Problém je ale v tom, že u takovýchto komponent není nijak

garantována kvalita a obvykle ani není k dispozici technická podpora. Tvůrci

aplikací proto nechtějí riskovat, že zakoupená komponenta (od které obvykle

nemají k dispozici ani zdrojový kód) se bude chovat za všech okolností

korektně, a proto obvykle preferují vlastní tvorbu. Je však možné, že vznikne

několik velkých dodavatelů komponent, kteří budou schopni zajistit technickou

podporu a garantovat (alespoň svou autoritou) kvalitu.

Obecné vlastnosti

Na komponentu se můžeme dívat podobně jako na objekt její funkcionalita je

přístupná prostřednictvím volání metod. Komponenty se popisují obvykle různými

mutacemi jazyka IDL (Interface Definition Language). V takovém popisu komponent

je možné najít jejich rozhraní (interface), jejich metody a parametry a

návratové hodnoty těchto metod. Vývojové prostředky obvykle generují příslušné

popisy komponent automaticky a obdobně také zpracovávají popisy od cizích

komponent.

Aby se klientská strana ani komponenta nemusely starat, jakým způsobem probíhá

komunikace mezi klientem a komponentou, vývojové prostředky (ve spolupráci s

komponentovou infrastrukturou) jsou schopny automaticky vygenerovat objekty,

které tuto komunikaci zajišťují v případě, že komponenta není připojena ve

stejném procesu.

Proces volání komponenty by se dal popsat následujícím způsobem: v případě, že

komponenta i klient běží ve stejném procesu, komunikují spolu přímo a

vyvolávání komponenty by se dalo přirovnat k vyvolávání běžných funkcí a metod.

Pokud běží komponenta i klient v samostatných procesech (anebo na samostatných

počítačích), jsou mezi ně vloženy objekty proxy a stub (podle terminologie

CORBA to jsou objekty stub a skeleton).

Proxy objekt běží v procesu klienta a nabízí stejné rozhraní, jaké poskytuje

daná komponenta. Klient může s tímto proxy objektem komunikovat přímo, jako by

to byla komponenta, kterou proxy objekt zastupuje. V případě, že klient vyvolá

některou z jeho metod, proxy objekt provede pouze tzv. „marshalling“ (převod

parametrů do nějaké standardní podoby) a začne komunikovat s příslušným stub

objektem.

Konkrétní způsob komunikace mezi objekty proxy a stub probíhá podle

komponentové technologie a možností příslušných systémů. Pro komunikaci mezi

lokálními procesy se využívá obvykle nějaká forma meziprocesové komunikace; pro

komunikaci mezi různými počítači se používá obvykle RPC (Remote Procedure Call

standardizovaný postup pro volání vzdálených procedur). Stub objekt, který běží

v procesu komponenty, převezme parametry od proxy objektu, provede jejich

unmarshalling (převod z nějaké standardizované podoby do formátu lokálního

systému) a přímo zavolá příslušnou metodu dané komponenty. Komponenta již může

být ze stub objektu vyvolána přímo, a ani přitom nemusí vědět, zda je

vyvolávána přímo, nebo nepřímo. Proces vracení výsledku je obdobný.

Druhy volání

Při využívání komponent rozlišujeme dva způsoby volání synchronní a

asynchronní. Pokud klientská strana přerušila zpracování po dobu, kdy čeká na

odpověď od komponenty, jde o zpracování synchronní. V případě, že klientská

strana pokračuje nadále ve své práci, jde o zpracování asynchronní. Obecný

trend je rozšiřování asynchronního režimu práce.

Při tvorbě komponent je také důležité rozhodnout, zda bude komponenta schopna

paralelního zpracování více požadavků. Paralelní zpracování může zrychlit

průchodnost systému, ale je daleko obtížnější na realizaci. Je nutné zajistit,

aby jednotlivé zpracovávané požadavky nezpůsobovaly kolize uvnitř komponenty.

Na komponentové technologie úzce navazují transakční servery. Ty nabízejí

hostitelské prostředí pro komponenty, kterým poskytují jisté nadstandardní

služby. Podle konkrétní implementace serveru a komponent nabízejí servery lepší

administraci, možnost nastavování bezpečnostních pravidel pro komponenty apod.

Mezi hlavní funkce ale patří řízení transakcí nad komponentami. S tím také

souvisí tvorba „stavových“ (stateful) komponent, které mohou být „předávány“

podle potřeby mezi různým klienty, což šetří systémové prostředky. Častou

službou je také sdílení databázových připojení, které opět šetří systémové

prostředky a zrychluje přístup k datům.

Komponenty (D)COM

Komponentový model COM (Component Object Model) od firmy Microsoft je dnes asi

nejužívanějším standardem. Model se dokázal komerčně prosadit a dnes existuje

již ohromné množství aplikací, které jsou na této technologii vystavěny. Model

COM Microsoft dříve označoval termínem OLE, a tímto způsobem je v některých

zdrojích označován dodnes.

Ačkoliv je technologie COM koncipována jako nezávislá na vývojovém prostředku,

některé vlastnosti jsou zjevně ušity na míru Visual Basicu. Tomuto nástroji

vyhovoval nejvíce model zvaný OLE Automation (dnes jen Automation). V OLE

Automation musí mít komponenta interface IDispatch a v něm metodu Invoke.

Metody komponenty se vyvolávají prostřednictvím metody Invoke, jejímž

parametrem je jednak číslo volané metody, jednak její parametry (ve velmi

nepřívětivém formátu). Číslo volané metody je samozřejmě možné zjistit jinou

metodou. Tvorba těchto komponent v jiných nástrojích, než je Visual Basic, je

velmi nepříjemná, a z tohoto důvodu Microsoft od tohoto modelu pomalu ustupuje.

Microsoft posléze přišel s rozšířením technologie COM o distribuované

zpracování, které nazval DCOM (Distributed COM). Jelikož už technologie COM a

DCOM prakticky srostly dohromady, ono „D“ na počátku se někdy neuvádí. Poslední

novinkou v této technologické řadě je technologie COM+, která bude uvedena s

novými Windows 2000.

Technologie COM byly původně koncipovány pro platformy 32bitových Windows.

Omezená verze je k dispozici také na Windows CE.

Později začal Microsoft usilovat o implementaci této technologie i na jiných

platformách. V současné době existuje implementace COM na počítačích Macintosh

a některých Unixech. Je však třeba říci, že tyto implementace nefungují zcela

uspokojivě, a pokud chcete aplikaci distribuovat mezi více platforem, je asi

vhodnější použít jinou komponentovou technologii.

Veškeré komponenty a rozhraní jsou označeny „globálně unikátním

identifikátorem“ (GUID), což je 16B číslo. To je automaticky vygenerováno při

vytváření komponenty ze sériového čísla síťové karty, času a několika náhodných

čísel (pravděpodobnost, že na světě vzniknou dva objekty se stejným GUID je

zanedbatelně malá). Jelikož vyvolávání komponent pod těmito identifikátory by

přinášelo jisté problémy, má každý objekt také běžné jméno.

Na rozdíl od jiných architektur může komponenta COM nabízet více rozhraní tedy

více sad metod, které nabízí klientským aplikacím.

Informace o rozhraních a komponentách jsou v technologii COM uchovávány v tzv.

„typových knihovnách“ (type libraries) v binární podobě. Pomocí dodávaných

nástrojů jsou však převoditelné zpět do textové podoby v jazyce Microsoft IDL.

Tyto typové knihovny mohou být samostatné soubory, ale mohou být také součástí

souborů dll, ocx nebo exe.

Jelikož je na proces instancování komponent v paměti vhodné aplikovat objektový

přístup, byla pro tyto účely zavedena tzv. Class Factory. Komponenta může být

klientskou stranou využívána trojím způsobem. Může běžet s klientem ve stejném

procesu (in-process), v samostatném procesu (out-process) anebo na vzdáleném

počítači (remote process). Implementace komponent, které poběží v samostatném

procesu anebo na vzdáleném počítači, je obtížnější, neboť v takovém případě

není možné snadno předávat parametry a návratové hodnoty. Další problémy

souvisejí s tím, že v případě distribuovaných aplikací může být na každém

počítači jiný způsob kódování numerických datových typů a ostatně i znakových

datových typů.

Možností je celá řada

Standard COM také přinesl možnost „složených dokumentů“. Technologie COM

zajišťuje manipulaci se souborem, do kterého se ukládají data z více

perzistentních COM objektů. V praxi je tento mechanismus implementován

prakticky ve všech kancelářských aplikacích (běžících na platformě Windows),

které potřebují do jednoho dokumentu uložit text s obrázky, grafy, tabulkami,

zvukem a v podstatě čímkoliv dalším.

Výhodou technologie COM je, že definuje poměrně speciální typy komponent, které

mají předepsané určité chování. Příkladem mohou být prvky ActiveX, které slouží

jako uživatelské prvky v různých oknech. Jako další lze uvést tzv. Automation

objekty (komponenty, použitelné ve Visual Basicu přes rozhraní IDispatch).

Mnoho aplikací, např. Microsoft Management Console nebo Visual InterDev,

definuje požadavky na komponenty, které bude tato aplikace využívat jako

průvodce (wizardy).

Microsoft dodává také Microsoft Transaction Server, což je klasický transakční

server pro platformu Windows. Zajímavý je také Microsoft Message Queue Server,

který zajišťuje bezpečné (tj. bezeztrátové) předávání zpráv mezi částmi

systému, které nejsou trvale spojeny anebo jsou spojeny nespolehlivými spoji

(např. Internetem). Infrastruktura MSMQ zajišťuje výběr vhodné dostupné linky

(k dispozici je též optimalizace dle nákladů).

Architekturu COM podporují snad všechny vývojové prostředky pro platformu

Windows, tedy nástroje od Microsoftu, Inprise, Sybase a dalších firem.

Pro tvůrce informačních systémů je pak důležité, že implementace komponentové

architektury COM je (včetně transakčního serveru) k dispozici zdarma ve všech

32bitových Windows.

COM+

S novými Windows 2000 bude také uvedena nová verze technologie COM+, která

rozšíří standard COM o nové prvky.

COM+ rozšíří komponenty o možnost využití atributů a událostí. Využití atributů

sice nepřináší v podstatě nic nového, ale jejich využití může být přirozenější.

COM+ také nabídne infrastrukturu pro šíření zpráv (událostí) objektům, které o

to požádají. Události bude možné šířit synchronně i asynchronně.

COM+ se zaměří rovněž na rozšíření služeb a součástí architektury se stane

Microsoft Transaction Server a Microsoft Message Queue Server. Důležitou

službou je mj. rozkládání zátěže (load balancing). Mezi klienty a servery bude

v COM+ možné vložit nový prvek, „router“. Ten bude sledovat dobu odezvy

jednotlivých serverů a na základě těchto údajů směrovat požadavky nových

klientů. Další novinkou bude podpora „In-Memory Database“ tedy databáze

umístěné přímo v paměti. Microsoft slibuje plně transakční databázi, ke které

bude možné přistupovat přes ADO/ /OLE DB.

CORBA

Hlavní současný konkurent modelu COM, architektura CORBA (Common Object Request

Broker Architecture), je přímo koncipována pro vývoj distribuovaných aplikací.

Byla vyvinuta mnoha velkými softwarovými společnostmi, které jsou členy

sdružení OMG. V současnosti je CORBA k dispozici ve specifikaci 2.2.

Architekturu CORBA tvoří (kromě již známé komponenty, klienta a pomocných proxy

a stub objektů) také poměrně mnoho dalších prvků. Je to především ORB (Object

Request Broker), který zajišťuje vyhledávání volané komponenty v distribuovaném

systému a obstarává přenos požadavků, parametrů a výsledků. Vlastní komunikaci

mezi ORB zajišťuje protokol GIOP (General Inter-ORB Protocol). Mutace

protokolu, která využívá TCP/IP, je nazývána IIOP (Internet Inter-ORB Protocol).

CORBA je jako jediná z komponentových architektur opravdu nezávislá na

platformě je implementována na platformách Windows, Macintosh a Unix, v Javě a

možná ještě na dalších platformách. Tuto technologii je také možné vcelku

uspokojivě implementovat v neobjektových jazycích.

Problém však je, že výsledkem práce OMG je „pouze“ specifikace architektury

CORBA, nikoliv však konkrétní implementace. Tato specifikace popisuje různé

věci s různou mírou přesnosti. Proto se jednotlivé implementace této

architektury od různých výrobců mírně liší a nejsou mezi sebou zcela

kompatibilní.

CORBA nabízí poměrně velké množství objektově orientovaných služeb, jež jsou

definovány ve zvláštních standardech. Jsou to např. „Naming Service“, který

zajišťuje jmenné služby, „Life Cycle Service“, který řídí vytváření a rušení

objektů, „Persistent Object Service“, který se zabývá ukládáním dat

perzistentních objektů, „Transaction Service“, který je určen pro řízení

transakcí, atd.

CORBA je přímo navržena pro distribuované využití pro volání lokálních

komponent je poněkud těžkopádná (nicméně i to je možné). Při distribuovaném

zpracování nabízí CORBA infrastrukturu pro automatické vyhledání volaného

objektu v distribuovaném systému. Klient se tedy nemusí starat o to, kde zrovna

která komponenta běží.



9 1653 / pahn



Komponentový boj

Mezi silné stránky technologie COM patří snadná instalace, správa a doplňkové

služby. Silnou stránkou architektury CORBA je naproti tomu široká paleta

nativních implementací pro mnoho platforem. Komponenty Enterprise JavaBeans

umožňují využít jednu implementaci na všech platformách.

Jelikož jsou si jednotlivé komponentové architektury značně podobné, mnoho

vývojových prostředků bude v budoucnu umožňovat generování více typů komponent

z jednoho zdrojového kódu. Proto lze předpokládat, že z pohledu tvůrců se budou

rozdíly jednotlivých architektur smývat a distribuované zpracování se bude

stávat stále transparentnější. Na druhé straně Microsoft usilovně pracuje na

zabudování určitých unikátních prvků do své architektury, a tímto způsobem chce

vývojářům nabízet přístup ke speciálním možnostem.



Enterprise JavaBeans

Specifikaci Enterprise JavaBeans přivedlo na svět sdružení vedené firmou Sun

Microsystems. Technologie je založena na platformě Java. Konkrétní implementace

serverových komponent je tedy platformově nezávislá a takto implementované

komponenty mohou být umístěny kamkoliv, kde pracuje Java.

Celá specifikace je poměrně nová, byla zveřejněna přibližně před rokem. Od té

doby je tato architektura zkoušena teprve na několika pilotních projektech a

prototypech. Firma Sun Microsystems oficiálně nestaví tuto architekturu jako

konkurenci vůči technologii CORBA, ale spíše jako její doplněk.

Architektura Enterprise JavaBeans 1.0 je stavěna na JDK 1.1. Příští specifikace

už bude údajně stavěna na standardu Java 2.

EJB využívá různých standardů Javy: Pro vyvolávání metod je používána třída RMI

(Remote Metod Invokation). Pro práci s transakcemi je zase využíván standard

Java Transaction API (JTA). Architektura EJB také logicky navazuje na

komponenty JavaBeans, které se vesměs používají na implementaci prvků

uživatelského rozhraní. Firma Sun Microsystems také pracuje na referenční

implementaci technologie Enterprise JavaBeans, kterou bude používat mimo jiné

pro testy kompatibility komponent.

Architektura Enterprise JavaBeans pracuje se třemi základními pojmy klient,

server a kontejner (container). Kontejner je entita, kterou hostí jednotlivé

servery. Klienti nekomunikují přímo se servery, ale komunikují s nimi

prostřednictvím kontejnerů.

V EJB rozeznáváme dva typy komponent (beanů) „Session Beans“ a „Entity Beans“.

„Session Bean“ je vytvářen na serveru klientem a pro klienta provádí různé

operace. Tyto komponenty mohou být stavové, mohou být zařazeny do transakcí,

ale v případě havárie systému nejsou obnovitelné.

„Entity Bean“ je komponenta, která reprezentuje nějaká perzistentní data, jež

jsou uchovávána v nějakém datovém zdroji (např. databázi). Jednotlivé instance

„Entity Bean“ jsou identifikovány primárním klíčem. Tyto komponenty mohou být

také zařazeny do transakcí a mohou být v případě havárie systému obnoveny.

Architektura Enterprise JavaBeans nabízí také skupinu služeb, kterou poskytuje

komponentám. Jsou to služby spojené s životním cyklem objektů (vytváření a

uvolňování), bezpečností, transakcemi, perzistencí a správou stavu.

Velkým kamenem úrazu pro celou technologii je, že Java zatím příliš nepronikla

do enterprise systémů. Architektura EJB je zatím v porovnání s technologiemi

CORBA a DCOM používána nejméně. Zatím je podporována např. v nástrojích firem

Sybase, Inprise a Oracle.