next up previous contents index
Next: Ostatní důležité rysy Up: LogTalk: popis a ukázky Previous: Události a monitory   Obsah   Index

Reprezentace vztahů mezi objekty

Normálně jsou vztahy mezi objekty implementovány s použitím slotů obsahujících odkazy na příbuzné objekty. Toto je příčinou různých problémů, včetně duplikace informace mezi zúčastněnými objekty, rozšiřování znalostí vztahů, a potřebu znát všechny vztahy objektu, atd. Jiným řešením je nahlížet na vztah jako na plně uzavřený objekt, uchovávající všechny významné informace [30,31].

Vysvětleme to na jednoduchém příkladu. Představme si, že máme zásobník slotů, reprezentovaný třídou Stack. Bloky jsou reprezentovány jako instance třídy Block. Stack deklaruje dva sloty jako vrchol a podporu souvisejících objektů. Blok deklaruje slot, aby obsahoval koordinaci místa a zprávu pro posun bloků. Nyní mějme na zásobníku dva bloky, A a B ( A je na vrcholu). Pokud pošleme B zprávu posunu, stejně se bude muset posunout i A. Přes toto, B vůbec o A neví (ani by neměl). Elegantním řešením je, aby instance třídy Stack vystupovali jako monitory událostí pohybu spřízněných objektů. V tomto případě, instance Stacku poté, co byl upozorněn, že B se posunul, musí zaslat zprávu posun bloku A, aby zabezpečil prostorový vztah. Takto tedy, pokaždé když nějaký objekt je zúčastněn ve vztahu, kde má dojít ke změně, relace může být automaticky upozorněna, aby byla schopna zajistit nezbytné akce k zachování konzistence.

Pro reprezentaci vztahů mezi objekty definuje Logtalku dvě třídy: Relation a ConstrRelation. První je užívána pro vztahy bez důsledků pro vnitřní stavy zúčastněných objektů. To znamená že kdykoliv bereme v úvahu nějaký vztah, nezajímají nás vnitřní stavy zúčastněných objektů. Druhá třída, ConstrRelation, umožňuje reprezentaci a správu vztahů vynucením vnitřních stavů zúčastněných objektů. Tak jako v příkladě, relace informuje systém o událostech o kterých si přeje být informován. To budou přesně ty, které mohou měnit stav a hrozí ohrožení konzistence. Metody before() a after() ve třídě ConstrRelation implementují algoritmus který šíří změny do všech ohrožených skupin objektů. Tento algoritmus [24,32] kontrolou změn předchází cyklení. V krátkosti: pro každou relaci souvisejících objektů obsahující změněný objekt jsou zaslány nezbytné zprávy jiným skupinám objektům. Všimněte si rekurzivní vlastnosti tohoto algoritmu.


next up previous contents index
Next: Ostatní důležité rysy Up: LogTalk: popis a ukázky Previous: Události a monitory   Obsah   Index
Tomáš Kubíček 2002-05-19