Generické programování: Porovnání verzí

Smazaný obsah Přidaný obsah
Aibot (diskuse | příspěvky)
pridano hafo informaci, obavam se ale aby to nebylo copyvio, zkusim kontaktovat autora
Řádek 2:
 
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++]]. Mechanismem, který zde generické programování umožňuje, jsou takzvané ''šablony (templates)''.
 
== Smysl genericity ==
Generické programování má následující cíle:<ref name="virius1">{{Citace sborníku
| příjmení = Virius
| jméno = Miroslav
| autor =
| odkaz na autora = Miroslav Virius
| titul = Generické programování: cíle a možnosti implementace
| odkaz na titul =
| příjmení sestavitele =
| jméno sestavitele =
| sestavitel =
| sborník = Celostátní konference TVORBA SOFTWARU 2006
| odkaz na sborník =
| vydavatel = VŠB-TU Ostrava, Ekonomická fakulta
| místo = Ostrava
| rok vydání = 2006
| isbn = 80-248-1082-4
| url =
| kapitola =
| strany =
| jazyk =
}}</ref>
 
* 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 ==
 
=== Bez genericity ===
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:<ref name="virius1" />
* '''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 ===
Existují minimálně tři různé způsoby, jak genericitu implementovat:<ref name="virius1" />
* Použijeme nástroj podobný preprocesoru jazyka C, v němž lze vytvářet makra s parametry. Kontejner nebo funkci naprogramujeme jako makro, pro 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.
 
== Reference ==
<references />
 
{{Pahýl - software}}