Objektová kompozice

Objektová kompozice (anglicky object composition) je v informatice způsob, jak v objektově orientovaném programování kombinovat jednoduché (základní) objekty nebo typy dat do složitějších. Objektová kompozice (tj. složení, skladba) je důležitý nástroj pro vytváření pokročilých datových struktur, jako je například spojový seznam nebo binární strom. Tyto složené datové struktury jsou dále používány stejným způsobem jako základní objekty.[1]

Podrobnosti

Když jsou v programovacím jazyce vytvořeny objekty jako datové typy, mohou být často děleny na složené a nesložené datové typy. Složení může být považováno za vztah mezi typy: objektově složený typ (např. auto) „obsahuje“ objekt jednoduššího typu (např. kola).

Uvažujme o vztahu automobilu konkrétně: automobil je složen z objektů, jako je volant, sedadla, převodovka a motor. Tento „vztah“ může být stanoven v počítačovém programu jako složení vztahů. V reálném světě je samotná „podstata složení“ chápána jinak. Motor v automobilu může být nahrazen motorem z jiného automobilu, což znamená, že vztah je lepší popsat jako agregaci (viz níže) než složení. Obecně řečeno, jak plyne čas tak to, co vypadá jako kompozice, má tendenci se proměnit ve shluky ty mají tendenci se proměnit ve volnější sdružení.

Složení musí být odlišné od subtypování, což je proces přidání detailu k obecnému typu dat k vytvoření více konkrétních datových typů. Například automobily mohou být konkrétním typem vozidla: auto je vozidlo. Dělení nepopisuje vztah mezi různými objekty, ale místo toho říká, že „objekty jednoho typu, jsou zároveň objekty jiného typu“.

V programovacích jazycích, jsou kompozitní objekty obvykle vyjádřeny pomocí odkazů z jednoho objektu na jiný. V závislosti na jazyku, mohou být tyto odkazy známé jako atributy, pole, členy nebo vlastnosti, a výsledná kompozice jako kompozitní typ, uložený záznam, struktura, n-tice, nebo uživatelem definovaný typ (UDT). Pole jsou uvedeny jedinečným názvem, takže každé z nich může být odlišeno od ostatních. Nicméně z těchto odkazů nemusí nutně znamenat, že objekt je kompozice. Kompozici nazýváme pouze, pokud objekty nemají žádnou nezávislou existenci. Pro podrobnosti viz dále kapitola Agregace.

UML notace

UML notace pro kompozici (horní) a agregaci (dolní). Všimněte si, že příklady ukazují abstrahované datové modely, bez ohledu na skutečnost, že v reálném světě asociace „karburátor ⇒ auto“ znamená, že karburátor může být z auta vytažen a bude dále existovat, i když je auto zničeno.

V UML, existují dva způsoby modelování kompozice: kompozice a agregace. V UML má slovo kompozice užší význam než v běžném jazyce.

C++ kód níže ukazuje, jak by měl zdrojový kód vypadat.

// Kompozice
class Auto
{
private:

 // Auto  karburátor.
 // Karburátor je vytvořen, když je vytvořeno Auto,
 // Pokud zničíme (smažeme) auto, je zničen (smazán) i karburátor
 Karburátor karb;

};
// Agregace
třída Rybník
{
private:

 // Rybník není vlastníkem kachny,
 // má odkazy na jiné kachny které jsou někde jinde
 std::vector<Kachna*> kachny;
};

Kompozitní typy v C

Toto je příklad kompozice v C.

struct Person
{
 int age;
 char *name;
 enum {job_seeking, professional, non_professional, retired, student} employment;
};

Rekurzivní kompozice

Objekty mohou být složené rekurzivně pomocí rekurzivních typů, nebo odkazů.

Jedna implementace pro rekurzivní kompozici je taková, kde každý objekt má odkazy na ostatní stejného typu.

Reference

V tomto článku byl použit překlad textu z článku Object composition na anglické Wikipedii.

  1. Michelle Yaiser. Object-oriented programming concepts: Composition and aggregation [online]. Adobe [cit. 2015-03-11]. Dostupné online. (anglicky) 

Související články

  • C++ třídy
  • Kompozitní datový typ
  • Kompozice přes dědičnost
  • Delegace (programování)
  • Dědičnost
  • Has-a
  • Liskovův substituční princip
  • Déméteřin zákon
  • Virtuální dědičnost

Média použitá na této stránce

AggregationAndComposition.svg
Obrázek objektové kompozice (principu)