JaGrLib:  KUCHARKA

Obecné zásady:


Piece, Plug, Channel:

Piece je zakladni "stavebni kamen", ze ktereho se sklada "stavebnice" = algoritmus. Je to jakasi "krabicka" ("black-box"), ktera implementuje predepsane protokoly (interface v Jave) a az v druhem planu (prip. zcela nedulezita) je konkretni metoda jejich realizace.

Kazdy Piece definuje jakesi "stycne body" se svym okolim - Plugs (zasuvky). Kazdy Plug rika, ktery protejsek (opet formalne typu Piece) se na tomto miste muze pripojit (a zda smi pripadne tento Plug zustat nezapojen). Konkretni propojeni je realizovano tridou Channel: na kazde strane ma jeden Piece (vlastne jeden jeho Plug), a tedy jeden protokol (interface v Jave). Pres Channel se tedy da komunikovat oboustranne: leva strana vola dany protokol prave strany a naopak..

Plug je v ramci sveho Piece odkazovani pomoci "klice" - znakoveho retezce. Stejny klic se pouziva ke konkretnimu propojeni (Channel). Kazdy Plug ma nekolik atributu:


Template, TemplateRegistry:

Konkretni konfigurace zasuvek (Plugs) nejakeho Piece muze byt reprezentovana ve forme objektu Template. Je to jakysi "vzor", katalogizace Piece z hlediska kompatibility (spise formalni = syntakticke, nez semanticke).

Jeden konkretni Piece muze splnovat nekolik ruznych Template, tj. muze hrat nekolik ruznych "roli" (byt zamenitelny podle ruznych vzoru). Jednotlive Template hraji roli ekvivalenci (ve smyslu kompatibility) na tride vsech Piece.

Template vsak slouzi i jako castecna usporadani na tride vsech Piece. Je-li napr. Template T1 podmnozinou Template T2, znamena to, ze vsechny Piece vyhovujici T2, jsou soucasne pouzitelne na miste T1.

Vsechny instance Template jsou v JaGrLib registrovany v globalni tride TemplateRegistry. V soucasnosti jsou implementovany pouze pristupove metody pres "jmeno" a "kategorii" (viz nize.), pozdeji by mely byt k dispozici tez ruzne unifikace a hledani kompatibilnich Template (ve smyslu inkluze). Atributy instanci Template:


PieceRegistry:

Vsichni konkretni potomci tridy Piece jsou v systemu JaGrLib registrovani v globalni tride PieceRegistry. Konkretni Piece je zde spojen se vsemi sablonami (Template), ktere implementuje. Pridavani zaznamu do PieceRegistry je povinnosti kazdeho potomka Piece (viz nize).


Jak napsat potomka Piece:

Jednotlive kroky pri vytvareni potomka tridy Piece mohou vypadat takto (priklady jsou ze skutecne implementace LineBresenham):

  1. rozmyslet si protokoly (interface), ktere musi dany objekt implementovat, a deklarovat tridu s vhodnym jmenem jako potomka Piece:
     
    public class LineBresenham extends Piece implements LineRender {
      ...
    }

     
  2. deklarovat standardni konstruktor, v nem pripojit vsechny potrebne zasuvky (Plugs):
     
    public LineBresenham () {
      ...
      newInputPlug(INPUT,IFACE+"LineRender");
      newOutputPlug(OUTPUT,IFACE+"BitMask");
    }

     
  3. naprogramovat vlastni funkce daneho objektu - implementovat vsechny potrebne protokoly (interface). Pritom pro odkazovani na napojene Piece pouzivat funkce getInterface(), napr.:
     
    public void drawLine ( int x1, int y1, int x2, int y2 )
    throws BadInterfaceException {
      BitMask out = (BitMask)getInterface(OUTPUT,IFACE+"BitMask");
      ...
    }

     
  4. otestovat funkci objektu (viz nize) - pri tom napojit vlastni Piece na jine objekty pomoci funkci Piece.connect().
     
  5. napsat identifikacni stringy objektu:
    a v konstruktoru zavolat super(NAME,DESCRIPTION,CATEGORY);
     
  6. implementovat tovarnu na instance tohoto objektu: metoda newPiece(), napr.:
     
    public Piece newPiece () {
      return new LineBresenham();
    }

     
  7. vytvorit prislusne sablony (Template) a registrovat objekt v PieceRegistry:
    Priklad:
     
    private final static String TEMPLATE_NAME = "LineRenderToBitMask";
    private final static String TEMPLATE_CATEGORY = CAT_2D + CAT_DRAW + "line";
    private static boolean isRegistered = false;
    {
      if ( !isRegistered ) {
      isRegistered = true;
      Template t = new Template(TEMPLATE_NAME,null,TEMPLATE_CATEGORY);
      t.newInputPlug(INPUT,IFACE+"LineRender");
      t.newOutputPlug(OUTPUT,IFACE+"BitMask");
      PieceRegistry.register(new LineBresenham(),t,null);
      }
    }

     


Testování - hlavní program:

Zatim je nutne vytvorit fungujici "skladacku" rucne - viz napr. Main.java.

  1. zavolat PieceRegistry.restore(null), tim se precte registracni databaze vsech existujicich potomku Piece.
  2. vytvorit instance vsech krabicek (Piece), ktere se budou pouzivat.
  3. spojit graf algoritmu pomoci volani funkce Piece.connect().
  4. rucne iniciovat testovany vypocet.
  5. pokud je treba prubezne sledovat graficke vystupy, lze pouzit RasterImage.getBufferedImage() (viz Main.java).
  6. pokud je treba ulozit vystupni grafiku na disk, lze pouzit JPEGImageEncoder (viz Main.java).
  7. zavolat PieceRegistry.save(null) a TemplateRegistry.save(null) - tim se na disk ulozi aktualizovane verze registracnich databazi (pro Piece i Template).


[JaGrLib home-page]  [News, credits]  [CGG at MFF UK]  [KSVI Web server]

Copyright (c) 2000-2003 Josef Pelikán, last change: 17.10.2003