***************************** Autor: Rado Kostelnik Datum: 21-02-2002 ***************************** Navrh pristupu k atributom objektov z modelu sveta ================================================== kvoli rozsirovatelnosti a cistejsej implementacii je treba upravit sposob, aky do rozhodovania hraca vstupuju hodnoty premennych z modelu sveta, ktore su v sucasnej verzii implementovane pomocou tried C*Term. V terajsom stave (prototyp v.2.03), je definovana sada termov, ktorych hodnota ziskava volanim triedy C*Query s menom termu. Tento sposob sice funguje, ale jeho nevyhoda je v tom, ze hodnota atributov sa vypocitava v triedach C*Term a nie v triedach modelu sveta. Novy model pristupu k atributom ma za ciel rozsirenie jazyka termov tak, aby sa zvysila jeho pouzitelnost a modifikovatelnost. Predpoklada, ze zdrojom udajov pre hodnoty atributov budu samotne triedy z modelu sveta. Sucasne sa zvysi jeho pouzitelnost, pretoze z jednoduchych termov reprezentovanych jednym stringom sa bude k atributom pristupovat ako k atributom objektov pomocou bodkovej notacie (napr. ball.distance). Navrh ===== Vytvori sa abstraktna trieda CDispatch, ktora bude mat metodu getAttribute, ktorej parametrom bude vyraz, ktory reprezentuje atribut, ktoreho hodnota sa ma ziskat. Navratovou hodnotou bude string obsahujuci hodnotu atributu. Ak dany objekt nema pozadovany atribut, vrati prazdny retazec, pripadne moze vyhlasit chybu. Ak vyraz nie je jednoduchy, tj. objekt.atribut, ale objekt1.objekt2.atribut, prip. dlhsi, vrchny objekt interne ziska smernik na objekt2 a pomocou interface CDispatch vypyta hodnotu atributu. class CDispatch { public: virtual string getAttribute(string expr) {...}; static string getNextTerm(string expr) {...}; }; class CBall : public CDispatch { string getAttribute(string name) {...}; }; Popis metod: ============ getAttribute() - vracia hodnotu atributu expr podla postupu uvedeneho vyssie getNextTerm() - staticka funkcia triedy CDispatch, ktora z vyrazu vrati nasledujuci term - tj. dalsi term pred bodkou Vsetky triedy, ktore zdedia CDispatch musia interne implementovat getAttribute, pretoze CDispatch je len interface. Globalny moniker ================ Aby bolo mozne niekde zacat s vyhodnocovanim, musi existovat globalny moniker pre termy, tj. trieda, ktora na zakladne termu vrati zaciatocny objekt v terme. Objekty, ktore budu na prvom mieste v terme budu z mnoziny globalnych objektov (ball, me, goal) a trieda monikera vrati CDispatch interface na tieto objekty.