Generické programování
Základní myšlenkou, která se skrývá za pojmem generické programování, je rozdělení kódu programu na algoritmus a datové typy takovým způsobem, aby bylo možné zápis kódu algoritmu chápat jako obecný, bez ohledu nad jakými datovými typy pracuje. Konkrétní kód algoritmu se z něj stává dosazením datového typu.
U kompilovaných jazyků dochází k rozvinutí kódu v době překladu. Typickým příkladem jazyka, který podporuje tuto formu generického programování, je jazyk C++ a D. Mechanismem, který zde generické programování umožňuje, jsou takzvané šablony (templates).
Smysl genericity
[editovat | editovat zdroj]Generické programování má následující cíle:[1]
- Poskytnout programátorovi způsob, jak vyjádřit algoritmy s minimální závislostí na použitých datových strukturách.
- Poskytnout programátorovi způsob, jak vyjádřit datové struktury s minimální závislostí na algoritmech.
- Poskytnout programátorovi možnost implementovat algoritmy co nejobecněji, aniž by při přechodu ke konkrétním typům došlo ke ztrátě efektivity.
- V případě, že zcela obecná forma algoritmu je v některých speciálních případech neefektivní nebo není použitelná, dát programátorovi možnost tyto speciální případy implementovat zvlášť.
- V případě, že obecná datová struktura pro jisté speciální případy nevyhovuje, poskytnout programátorovi možnost implementovat tyto speciální případy zvlášť.
- V případě, že k řešení určitého problému existuje několik rovnocenných algoritmů, poskytnout programátorovi možnost implementovat je všechny a dát tak uživateli na vybranou podle dalších kritérií.
Možnosti implementace
[editovat | editovat zdroj]Bez genericity
[editovat | editovat zdroj]Bez genericity lze vhodně programovat zejména různé typy kontejnerů (seznamy, stromy, fronty, zásobníky a další). Programování generických funkcí není dost dobře proveditelné (ač není nemožné). Existují dvě základní možnosti:[1]
- Beztypové kontejnery založené především na polymorfizmu v důsledku dědění. Všechny datové typy, jejichž instance se do kontejnerů ukládají jsou odvozeny od téže třídy (typicky Object, v neobjektových jazycích jsou to ukazatele bez doménového typu). Uložením do beztypového kontejneru se ztrácí informace o uloženém typu, pak je nutno ji uchovávat někde mimo kontejner.
- Jednoúčelové kontejnery s typovou kontrolou, které umožňují ukládání hodnot jediného typu (nebo množiny objektových typů odvozených od stejného předka). Na druhou stranu ale tyto jednotlivé kontejnery v programu mohou obsahovat pouze jediný typ. Do kontejneru vytvořenému pro datový typ int nelze uložit double, ačkoliv se v podstatě neliší (je třeba udělat nový kontejner pro double).
Procesu ukládání primitivního typu do typu Object se říká boxing.
S genericitou
[editovat | editovat zdroj]Existují minimálně tři různé způsoby, jak genericitu implementovat:[1]
- Použijeme nástroj podobný preprocesoru jazyka C, v němž lze vytvářet makra s parametry. Kontejner nebo funkci naprogramujeme jako makro, v němž budou některé datové typy vyjádřeny parametry, jejichž hodnoty dosadíme před použitím.
- Zavedeme syntaktickou konstrukci, která oznámí překladači, že u hodnot vkládaných do kontejneru požadujeme silnější typovou kontrolu. To znamená, že dostaneme jedinou kontejnerovou třídu obsahující odkazy na typ Object (nebo na jiný objektový typ, který je společným předkem typů hodnot ukládaných do kontejneru), překladač však bude vědět, že určitá instance obsahuje hodnoty jednoho přesně určeného typu a podle toho s ním bude zacházet. Podobně můžeme zavést konstrukci, která vhodným způsobem zajistí typy parametrů předávaných funkci či metodě.
- V prostředích, kde se o běh programu stará běhový systém (virtuální stroj), může generickou konstrukci převzít tento běhový systém a instance podle okolností vytvářet za běhu. Správnost parametrů nebo ukládaných hodnot přitom může kontrolovat již překladač.
První dvě možnosti představují různá pojetí statické genericity, která se uplatňuje pouze v době překladu. Třetí možnost představuje dynamickou genericitu, kdy generické konstrukce existují i za běhu programu.
Odkazy
[editovat | editovat zdroj]Reference
[editovat | editovat zdroj]- ↑ a b c VIRIUS, Miroslav. Generické programování: cíle a možnosti implementace. In: Celostátní konference TVORBA SOFTWARU 2006. Ostrava: VŠB-TU Ostrava, Ekonomická fakulta, 2006. ISBN 80-248-1082-4.