Zapouzdření (programování): Porovnání verzí

Smazaný obsah Přidaný obsah
Robot: Opravuji 1 zdrojů and označuji 0 zdrojů jako nefunkční #IABot (v2.0beta15)
m Robot: -zastaralá značka HTML; kosmetické úpravy
Řádek 1:
'''Zapouzdření''' může být vysvětleno jako zabalení dat a metod do jedné komponenty. Funkce zapouzdření jsou dostupné skrze třídy ve většině objektově orientovaných programovacích jazyků. Zapouzdření rovněž umožňuje ukrytí atributů a metod v objektu pomocí stavby nepropustné zdi, která brání kód proti nechtěným změnám.
 
V programovacích jazycích je '''zapouzdření''' přirovnáváno k jednomu z dvou pojmů a někdy i jejich kombinací,<ref>Michael Lee Scott, ''Programming language pragmatics'', Edition 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1, p. 481: "Encapsulation mechanisms enable the programme<sup></sup>r to group data and the subroutines that operate on them together in one place, and to hide irrelevant details from the users of an abstraction."</ref><ref name="Dale">Nell B. Dale, Chip Weems, ''Programming and problem solving with Java'', Edition 2, Jones & Bartlett Publishers, 2007, ISBN 0-7637-3402-0, p. 396</ref> tedy:
* Nástroj programovacího jazyka, který je určen pro znepřístupnění jistých komponent [[Instance třídy|objektů]].<ref>[[John C. Mitchell]], ''Concepts in programming languages'', Cambridge University Press, 2003, ISBN 0-521-78098-5, p.522</ref><ref name=Pierce>{{cite book|last=Pierce|first=Benjamin|authorlink=Benjamin C. Pierce|title=[[Types and Programming Languages]]|publisher=MIT Press|year=2002|isbn=0-262-16209-1}} p. 266</ref>
* Konstrukce jazyka, která váže data s [[Metoda (objektově orientované programování)|metodami]], které pracují nad danými daty.<ref>Wm. Paul Rogers, [http://www.javaworld.com/javaworld/jw-05-2001/jw-0518-encapsulation.html?page=9 ''Encapsulation is not information hiding''], JavaWorld.com, 05/18/01</ref><ref>Thomas M. Connolly, Carolyn E. Begg, ''Database systems: a practical approach to design, implementation, and management'', Edition 4, Pearson Education, 2005, ISBN 0-321-21025-5, Chapter 25, "Introduction to Object DMBS", section "Object-oriented concepts", p. 814</ref>
Řádek 12:
Ukrytí jakýkoliv interních informací objektu chrání jeho integritu proti uživatelům tak, aby je nebylo možné nastavit do invalidního či nekonzistentního stavu. Předpokládaná výhoda zapouzdření je ve zmenšení složitosti systému a tedy ve zvýšení robustnosti.
 
Jako skoro všude a vždy zde existuje cesta, jak zapouzdření obejít - obvykle skrz [[Reflexe (programování)|reflexní]] API ([[Ruby (programovací jazyk)|Ruby]], [[Java (programovací jazyk)|Java]], [[C Sharp|C#]] a další), někdy ale i skrz mechanismy mandlování (Python) či skrz speciální klíčová slova jako <code>friend</code> v C++.
 
Následuje ukázka v jazyce [[C Sharp|C#]], která ukazuje, jakým způsobem se dá zakázat přístup k datovým polím pomocí využití klíčového slova <code>private</code>:
<sourcesyntaxhighlight lang="csharp">
class Program {
public class Ucet {
Řádek 30:
/* Metoda Main může zjistit zůstatek na účtě skrz veřejnou (public)
metodu "ZjistitZustatek", kterou poskytuje samotná třída "Ucet",
ale současně nemůže manipulovat přímo s hodnotou "zustatek" */
}
}
</syntaxhighlight>
</source>
 
Následuje ukázka v jazyce [[Java (programovací jazyk)|Java]]:
<sourcesyntaxhighlight lang="java">
public class Zamestnanec {
private BigDecimal mzda = new BigDecimal(50000.00);
Řádek 50:
}
}
</syntaxhighlight>
</source>
 
Následuje ukázka v jazyce [[PHP]]:
<sourcesyntaxhighlight lang="php">
class Ucet
{
Řádek 124:
// Kód zabraňuje rovněž vybírání více, než máme v daném účtě
$mujUcet->vybrat(600.00); // Vyhodí výjimku
</syntaxhighlight>
</source>
 
Zapouzdření je rovněž možné využívat ve starších jazycích, které nejsou objektově orientované. Například v [[C (programovací jazyk)|C]] – struktura může být deklarována ve veřejně přístupné části (hlavičkový soubor) pro množinu funkcí, které operují nad danými daty, které obsahují členské proměnné, které nejsou přístupné klientům skrz hlavičku:
<sourcesyntaxhighlight lang="csharp">
// Hlavička "api.h"
struct Entity; // Neprůhledná struktura, která má ukryté členské proměnné
// Hlavičkové funkce, které operují nad strukturou Entity a jejími členy
extern struct Entity * open_entity(int id);
extern int process_entity(struct Entity *info);
extern void close_entity(struct Entity *info);
</syntaxhighlight>
</source>
 
Klient pak volá hlavičkové funkce k alokování, provádění operací a dealokování struktur typu „Entity“. Obsah tohoto typu je znám a přístupný pouze implementovaným hlavičkovým funkcím. Klienti nemohou k tomuto obsahu přímo přistoupit. Následuje zdrojový kód pro funkce, které definují vlastní obsah již zmíněné struktury:
<sourcesyntaxhighlight lang="csharp">
// Implementace "api.c"
Řádek 159:
void close_entity(struct Entity *info)
{ ... }
</syntaxhighlight>
</source>
 
== Historický význam ==
Řádek 175:
 
== Externí odkazy ==
[https://web.archive.org/web/20150325234946/http://www.soapatterns.org/service_encapsulation.php SOA Patterns.org]
 
[[Kategorie:Objektově orientované programování]]