Má - Has-a

V návrhu databáze , objektově orientovaném programování a designu (viz architektura objektově orientovaného programu ), has-a ( has_a nebo has a ) je kompoziční vztah, kde jeden objekt (často nazývaný vytvořený objekt nebo součást / součást / člen) " patří "(je součástí nebo členem ) jiného objektu (nazývaného složený typ) a chová se podle pravidel vlastnictví. Jednoduše řečeno, has-a relace v objektu se nazývá členské pole objektu. Více vztahů has-a se spojí a vytvoří posedovou hierarchii.

To je třeba porovnat se vztahem is-a ( is_a nebo je a ), který představuje taxonomickou hierarchii ( podtyp ).

Rozhodnutí, zda nejlogičtější vztah pro objekt a jeho podřízeného není vždy jasně má-a nebo je-a . Zmatek nad takovými rozhodnutími si vyžádal vytvoření těchto metalingvistických výrazů. Dobrým příkladem vztahu has-a jsou kontejnery v C ++ STL .

Abychom to shrnuli, máme

  • hypernym - hyponymum (supertyp-podtyp) vztahy mezi typy (třídami) definující taxonomickou hierarchii, kde
    • pro vztah dědičnosti : hyponymum (podtyp, podtřída) má vztah typu ( je-a ) se svým hypernym (supertyp, nadtřída);
  • holonym - meronymové (celek / entita / kontejner-část / složka / člen) vztahy mezi typy (třídami) definující přivlastňovací hierarchii, kde
  • relace koncept-objekt (typ-token) mezi typy (třídy) a objekty (instance), kde
    • token (objekt) má instanci vztahu se svým typem (třídou).

Příklady

Model entita-vztah

V databázích jsou vztahy has-a obvykle zastoupeny v modelu entita-vztah . Jak vidíte na obrázku vpravo, účet může mít více znaků. To ukazuje, že účet má vztah „má“ s charakterem.

Diagram tříd UML

Diagram tříd UML
Zneužití složení a agregace

V objektově orientovaném programování lze tento vztah reprezentovat diagramem Unified Modeling Language Class diagram . Tento vztah má také název kompozice. Jak je patrné z diagramu tříd vpravo, auto „má“ karburátor nebo je auto „složeno z“ karburátoru. Pokud je diamant zbarven černě, znamená to složení , tj. Předmět na straně nejbližší k diamantu je tvořen nebo obsahuje druhý předmět. Zatímco bílý diamant znamená agregaci , což znamená, že objekt nejblíže k diamantu může mít nebo vlastnit druhý objekt.

C ++

Dalším způsobem, jak rozlišovat mezi kompozicí a agregací při modelování reálného světa, je zvážit relativní životnost obsaženého objektu. Například pokud objekt Car obsahuje objekt Chassis, podvozek se s největší pravděpodobností během životnosti automobilu nevymění. Bude mít stejnou životnost jako samotné auto; takže vztah je složením . Na druhou stranu, pokud objekt Car obsahuje sadu pneumatik, mohou se tyto pneumatiky několikrát opotřebovat a vyměnit. Nebo pokud se vůz stane nepoužitelným, mohou být některé pneumatiky zachráněny a přiřazeny k jinému vozu. V každém případě mají objekty pneumatik jinou životnost než objekt automobilu; proto je vztah agregací .

Pokud by někdo vytvořil softwarovou třídu C ++ k implementaci vztahů popsaných výše, objekt Car by obsahoval kompletní objekt Chassis v datovém členu. Tento objekt šasi by byl vytvořen v konstruktoru třídy Car (nebo by byl definován jako datový typ datového člena a jeho vlastnosti přiřazené v konstruktoru.) A protože by šlo o zcela obsažený datový člen třídy Car, šasi objekt by již neexistoval, pokud by měl být odstraněn objekt třídy Car.

Na druhou stranu, datové členy třídy Car, které odkazují na objekty Tire, by s největší pravděpodobností byly ukazatele C ++. Objekty pneumatik mohou být vytvořeny a externě odstraněny nebo dokonce přiřazeny datovým členům jiného objektu Car. Objekty pneumatik by měly samostatnou životnost oddělenou od doby, kdy byl objekt Car odstraněn.

Viz také

Poznámky