TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 25. Otázka : Komponentní technologie - základní pojmy a principy, metody specifikace komponent. Obsah :
1. Základní pojmy 1.1 Komponenta Komponenta je opakovatelně použitelný stavební blok programu. Je to předem vytvořený a zapouzdřený kus aplikačního kódu, který lze kombinovat s ostatními komponentami a s ručně psaným programem ze účelem rychlého psaní programů. 1.2 Vizuální komponenta Typickými vizuálními komponentami jsou součásti grafického uživatelského rozhraní. Komponentou mohou být tlačítka, textová políčka, okna, apod. Vizuální komponenty zapouzdřují metody pro zobrazení komponenty a reakci na různé události (včetně událostí uživatelského rozhraní jako jsou kliknutí tlačítka, vstup focusu na komponentu, apod). 1.3 Nevizuální komponenta Nevizuální komponenta je zapouzdřenou část programu, která nemá svou reprezentaci s uživatelském rozhraní. To znamená, že komponenta nemá metody pro zobrazení. Příkladem může být komponenta pro časovače, FTP klienta nebo konektor pro připojení k databázi. 1.4 Struktura komponenty Komponenty jsou charakterizovány rozhraním, které zahrnuje následující prvky: Vlastnosti Události Operace Vlastnosti reprezentují z vnějšího pohledu mechanismus pro ukládání a získávání hodnot. Z pohledu implementace se může jednat o data uložené v proměnných (attributech), souborech, databázi nebo to mohou být hodnoty vypočtené nebo získané z jiných objektů. Události jsou metody vykonávané činnosti vyvolané různými podněty. U GUI to mohou být kliknutí myši, vstupy uživatele, odeslání dat, u nevizuálních komponent to mohou být uplynutí nastaveného času časovače, dokončení přenosu souboru, zpracování chyby vzniklé při provedení SQL dotazu na databázi. Operace jsou ostatní metody měnící stav komponenty nebo vykonávající ucelenou činnost komponenty. 1.5 Perzistence komponent Perzistence je schopnost komponenty uchovat svůj stav pro další vytvoření (inicializaci). Toho se dosahuje serializací komponenty a jejím uložením případně odesláním cílovému klientovi. Po opětovném načtení komponenty z tohoto souboru je komponenta přesně ve stavu, ve kterém byla ve chvíli serializace. Toto se využívá například při ukládání stavu komponent ve vývojovém prostředí, nebo při restartu server Tomcat. Správnou inicializační konfiguraci komponenty můžeme dosáhnout ještě programovým nastavením stavu komponenty, toto ale nelze využít k pozdějšímu uložení a obnovení stavu.
2. Integrace komponent do aplikací Pro zabudování komponenty do aplikace je potřeba znát dokumentaci příslušné komponenty. Tato dokumentace musí být strojově čitelná a platformově nezávislá, aby ji mohlo zpracovat vývojové prostředí. První možností je definování strukturovaného textového dokumentu, který bude popisovat příslušnou komponentu bude jejím deskriptorem. Tento způsob používá např. technologie COM nebo CORBA, kde je deskriptor tvořen speciálním jazykem IDL (Interface Definition Language), který definuje rozhraní. Další variantou je získání dokumentace analýzou vlastností, událostí a metod komponenty. Aby tato analýza byla možná, musí být pojmenování a strukturu jednotlivých prvků dodrženy určité konvence. Tento způsob používá komponentní technologie JavaBeans, kde např. pro vlastnost x musí být definovány dvě metody getx a setx sloužící k jejímu čtení a nastavení. Dalším vylepšením je zařazení těchto konvencí přímo do programovacího jazyka. Takto je to uděláno v jazyce C#. Pak je možné pomocí překladače získat potřebné metainformace o rozhraní komponenty bez nutnosti dodržovat nějaké konvence pro pojmenování. Navíc mohou být při překladu provedeny kontroly, které by jinak mohly být provedeny až při použití komponenty. 3. Technologie JavaBeans Technologie JavaBeans je komponentní architekturou pro aplikace vytvářené na platformě jazyka Java. Je založena na sadě pravidel umožňujících nastavovat a získávat hodnoty vlastností komponent, předávat události mezi jednotlivými objekty, vytvářet instance objektů a ukládat objekty pomocí serializace. Umožňuje rovněž reprezentovat popisné (meta-)informace o objektech. Komponenty JavaBeans se vytvářejí v souladu s jednotnou specifikací aplikačního programového rozhraní (JavaBeans API) a mohou pracovat v libovolném prostředí podporujícím jazyk Java. Typickou vlastností JavaBeans komponent je možnost s nimi pracovat v rámci vizuálních vývojových prostředí a nástrojů pro vytváření aplikací. Komponenty JavaBeans mohou také zprostředkovávat přemostění platformově závislých komponentních modelů jako jsou ActiveX, OpenDoc nebo LiveConnect. Tím lze dosáhnout přenositelnosti komponent mezi různými kontejnery, v rámci nichž tyto komponenty pracují - např. Netscape, Internet Explorer, Visual Basic, Microsoft Word nebo Lotus Notes. 3.1 Java Bean JavaBean je opakovatelně použitelná programová komponenta, se kterou lze vizuálně manipulovat (např. nastavovat atributy pomocí dialogu) ve vývojových prostředích. Těmito prostředími mohou být nástroje pro vývoj WWW stránek, vizuální prostředí pro tvorbu aplikací nebo také editor textů schopný zařadit JavaBean jako součást dokumentu. Typickou JavaBean je možné charakterizovat následujícími vlastnostmi: Introspekce možnost zvenčí analyzovat jak komponenta pracuje, jaké má rozhraní(metody) Přizpůsobivost možnost nastaveni vzhledu a chování komponenty při vývoji aplikací. Události prostředek pro komunikaci mezi komponentami Vlastnosti nastavitelné hodnoty určené pro přizpůsobení i pro programovou obsluhu komponenty Perzistence možnost uložit přizpůsobenou komponentu a později její stav obnovit
JavaBean je implementována jako obyčejná Java třída. 4. Technologie COM Technologie používaná pro vývoj aplikací pro Windows a Windows NT. Původně navržena pro vývoj aplikací na jednom počítači, rozšíření DCOM umožňuje pak vývoj aplikací s přístupem přes počítačovou síť ke komponentám na jiných počítačích. Další rošíření bylo COM+, které se stalo základem pro současnou architekturu.net. Tato architektura je založena na binárních komponentách s definovanou sadou rozhraní. Každá komponenta je uložena v nějakém binárním souboru, a to buď jako dynamicky linkovaná knihovna (DLL), nebo jako samostatná aplikace (EXE). V případě, že je COM komponenta v DLL souboru, tak je ji klientská aplikace zavede přímo do svého adresového prostoru a komunikuje s ní přímo (volá metody z rozhraní komponenty). V případě, že je volaná komponenta v EXE souboru, tak je situace o něco složitější. EXE soubor má svůj vlastní adresní prostor, do kterého klientská aplikace nemá přímo přístup. Proto k této komponentě klientská aplikace může přistupovat pomocí proxy objektu (zástupného objektu). Ten na straně aplikace zastupuje volanou komponentu. Od aplikace převezme argumenty volaní a název požadované operace, provede jejich serializaci (marshalling) a zajistí jejích přenos do adresního prostoru komponenty. Tam je přijme tzv. Stub, který zajistí deserializaci argumentu a zajistí volání příslušné operace s deserializovanými argumenty. Výsledek operace poté opět serializuje a odešle zpět proxy objektu. Proxy objekt přijatý výsledek operace deserializuje a vrátí aplikaci. Takto se komponenta jeví jako kdyby byla součástí aplikace. Tento princip poté funguje i v modelu DCOM, kde se serializované volání operací a výsledky operace mezi proxy s stubem přenášejí místo mezi dvěma adresními prostory v operační paměti přes počítačovou síť.
Díky jazyku MIDL (upravený jazyk IDL použitý v komponetní technologii CORBA) programátor nemusí proxy objekt a stub psát ručně, ale překladač je vytvoří na základě informací uložených v příslušných souborech definic rozhraní komponent (jsou vygenerovány hlavičkové soubory i implementace proxy a stubu). 4.1 Rozhraní komponenty Komponentní model COM je založen na využití rozhraní, pomocí nichž komponenta komunikuje se svým okolím. Na rozdíl od jiných modelů (CORBA, JavaBeans) je toto rozhraní definováno až na binární úrovni, takže umožňuje efektivní komunikaci s komponentami psanými v různých programovacích jazycích. Rozhraní COM je tvořeno pouze metodami, takže i přístup k datům je realizován výlučně voláním metod, což umožňuje zcela oddělit implementaci komponent od aplikací, které tyto komponenty využívají. Definice binární struktury rozhraní COM komponent vychází z mechanismu, který se například v jazyce C++ používá pro volání virtuálních metod. Toto volání pro nějaký konkrétní objekt probíhá tak, že se nejprve získá ukazatel na tabulku virtuálních metod, jenž je součástí instance objektu. Tato tabulka je vlastně pole ukazatelů na kódy konkrétních metod, takže známe-li pořadové číslo volané metody, vyzvedneme z tabulky adresu jejího kódu a metodu provedeme. Tento postup je znázorněn na následujícím příkladu. Předpokládejme, že máme objekt se dvěma virtuálními metodami. Tabulka virtuálních metod tedy bude mít dvě položky, obsahující ukazatele na kód těchto dvou metod. Velmi podstatnou vlastností takto zvolené struktury je to, že jsme schopni ji vytvořit i v dalších jazycích. COM. Právě k zajištění co nejvolnější vazby mezi komponentami a aplikací slouží specifikace 5. Závěr Komponenta je opakovatelně použitelný stavební blok programu. Je to předem vytvořený a zapouzdřený kus aplikačního kódu, který lze kombinovat s ostatními komponentami a s ručně psaným programem ze účelem rychlého psaní programů.
Komponenty jsou charakterizovány rozhraním, které zahrnuje následující prvky: Vlastnosti Události Operace Rozhraní komponenty je možné specifikovat v zásadě dvěmi způsoby. Prvním je zvláštní strukturovaný textový soubor, který popisuje rozhraní komponenty. Tento způsob je využíván v komponentních technologiích COM a CORBA. Druhým způsobem je získání znalostí o struktuře komponenty analýzou vlastností, událostí a operací komponenty. Zde je potřeba dodržovat definované konvence, např. pojmenování metod. Tento způsob využívá komponentní technologie JavaBeans.