Visitor DP

Svrha

Zbog čega Visitor DP?

Svoju primenu VisitorDP nalazi kao rešenje problema koji se često javlja u OO sistemima, a koji se odnosi na programiranje mehanizma koji će za zadatu hijerarhiju klasa i rekurzivnu strukturu podataku (koja sadrži elemente ove hijerarhije) omogućiti prolazak kroz sve elemente rekurzivne strukture podataka i nad pojedinim elementima izvršiti operacije specifične za taj element.

Kratak opis problema

Kompajler vrši uobičajeno transformaciju programa u neku internu strukturu podataka.(najčešće sintaksno stablo).

Kreiranje sintaksnog stabla je tek početak prevođenja programa.

Svi ovi problemi imaju jednu zajedničku crtu: kompajler prolazi kroz sve delove stabla i uradi nešto nad njima.

Ideja1 (intuitivni prilaz problemu ): Neka je Cvor osnovna klasa koja reprezentuje čvor sintaksnog stabla. Ideja je deklarisati metod u klasi Cvor , koji obavlja željenu operaciju na čvoru u stablu, a onda u svim podklasama se može redefinisati ovaj metod da obavi operaciju koja odgovara konkretnom čvoru.

Mane ideje 1:

Ideja2 = VISITOR DP

Dijagram prikaz

Mehanizam ideje 2:

Kreirati apstraktnu klasu koja definiše generalni izgled "posetioca".


public abstract class Visitor{
   public void Obrada(Cvor c);
   public void Obrada(Izraz i);
. . .
}

I , naravno, svakoj klasi u hijerarhiji dodati metod koji omogućava "posetiocu" da "poseti" dati element i prosledi mu sve potrebne informacije:


public void Visit(Visitor v) {
  v.Obrada(this); }

Na primer, ako se želi odštampati sintaksno stablo i ako promenljiva root sadrži koren stabla onda se preduzima:

Visitor v = new Stampati();
root.Visit(v);

gde implementacija "posetioca" za štampanje sintaksnog stabla:

public class Stampati extends Visitor {
  public void Obrada(Izraz i) {
  i.expr.Visit(this);
  System.out.println(";"); }


public void Obrada(AditivniIzraz i) {
  System.out.print("(");
i.left.Visit(this);
System.out.print(" + ");
i.right.Visit(this);
System.out.print(")"); }
...

}

Prednosti primene Visitor DP-a

  1. kompletan kod koji definiše operacije nad pojedinačnim elementima definisan je na jednom mestu (Stampati).
  2. mogućnost jednostavnih modifikacija(u smislu dodavanja novih operacija)
    Npr. ako postoji potreba za operacijom koja radi sve kao i Stampatii, samo što npr. kod dodeljivanja ne štampa "=" nego "->", dovoljno je definisati podklasu klase Stampati i u njoj redefinisati metod Obrada(VisitorOznacavanja). Ali, kod Visitor-a, nekada nije dovoljno definisati novu operaciju samo dodavanjem novog posetioca, već je za dodavanje nove operacije nužno promeniti više klasa (npr. ako je funkcionalnost takva da je raspoređena u više klasa, onda se menja svaka od klasa).
  3. poseta različitih hijerarhija klasa je osobina Visitor-a da može da "poseti" objekte koji nemaju zajedničku roditeljsku klasu (što, na primer, nije svojstvo Iterator DP).
  4. grupisanjem srodnih, a razdvajanjem različitih operacija, moguĆe je da se svaka struktura podtaka, specifična za algoritam sakrije u posetiocu. Jer, srodno ponašanje se grupiše u posetiocu, umesto da se raspoređuje u klase koje definišu strukturu podataka. Različiti skupovi ponašanja bivaju razdvojeni u sopstvene klase posetilaca, čime se pojednostavljuju klase koje definišu elemente, kao i algoritmi definisani u visitor-ima.
  5. tokom "posete" elemenata strukture objekata, Visitor akumulira izvesna stanja. Ako li se ne koristi Visitor, onda bi operacije akumuliranja stanja obavljale globalne promenljive, ili bi se kao dodatni argument operacijama koje vrše obilazak, predavalo stanje.

Mana Visitor Dp-a

Visitor DP nije naročito pogodan u situacijama kada se hijerarhija klasa koje čine elemente strukture podataka često menja u toku razvoja programa.

Npr. kada bi morala da se doda neka klasa u Cvor hijerarhiji, npr.BitwiseIzraz, tada bi bilo nužno promeniti svaku klasu u Visitor hijerarhiji i definisati metod Obrada(BitwiseIzraz i) u svakoj od tih klasa.

Primeri korišćenja Visitor DP-a

 

Bliski DP

Interpretator DP
Visitor DP se može iskoristiti radi obavljanja interpretacije.

Composite DP
U sistemu koji koristi Composite DP može da se upotrebi Visitor DP da bi se obavile operacije nad pojedinačnim komponentama.

 


← Singleton DP Uvod Iterator DP →