Dynamické odbavenie vlastností a metód tried

cache.jpg V tej­to čas­ti náš­ho se­riá­lu sa oboz­ná­mi­me s veľ­mi uži­toč­nou schop­nos­ťou tried Cac­hé, kto­rá je k dis­po­zí­cii už dl­hší čas, ale až v po­sled­ných ver­ziách sa dos­tá­va viac do po­pre­dia, a to v sú­vis­los­ti s dy­na­mic­kým SQL a ZEN fra­mewor­kom. Ide o dy­na­mic­ké od­ba­ve­nie (vy­hod­no­te­nie) vlas­tnos­tí a me­tód, po an­glic­ky dy­na­mic dis­patch, iný­mi slo­va­mi, o ošet­re­nie vo­la­nia vlas­tnos­tí a me­tód, kto­ré trie­da ne­má de­fi­no­va­né a nie sú sú­čas­ťou jej me­taú­da­jov.

Všet­ci za­is­te vie­te, že ak sa po­kú­si­te pris­tú­piť za be­hu prog­ra­mu k neexis­tu­jú­cej vlas­tnos­ti trie­dy ale­bo vo­lať neexis­tu­jú­cu me­tó­du, prog­ram vám vrá­ti vý­nim­ku. To je pred­vo­le­né sprá­va­nie Cac­hé. Za­is­te si však vie­te pred­sta­viť si­tuácie, keď to­to sprá­va­nie nie je žia­du­ce a vám by sa, nao­pak, ho­di­lo, aby trie­da ne­ja­kým spô­so­bom za­rea­go­va­la bez to­ho, aby ste mu­se­li prog­ra­mo­vať spra­co­va­nie vý­ni­miek. Pred­stav­te si nap­rík­lad si­tuáciu, keď má­te po­treb­né dve ap­li­ká­cie ale­bo aj jed­nu viacvrstvo­vú, nap­rík­lad webo­vú ap­li­ká­ciu. Na jed­nej stra­ne ho­ci u webo­vé­ho klien­ta nie­čo uro­bí­te a po­tre­bu­je­te pre­niesť dá­ta na stra­nu dru­hú – na server. Väč­ši­nou ide o štruk­tú­ro­va­né dá­ta, a te­da k nim zos­tro­jí­me trie­du, kto­rá da­nú štruk­tú­ru opí­še. No a to­to bu­de­te chcieť ro­biť nie pre jed­nu webo­vú strán­ku, ale pre de­siat­ky či stov­ky ap­li­kač­ných strá­nok (ob­ra­zo­viek). Is­te sa vám ne­bu­de veľ­mi chcieť za­kaž­dým de­fi­no­vať se­pa­rát­nu štruk­tú­ru (ob­jekt). A prá­ve v tom­to oka­mi­hu pric­hád­za neo­ce­ni­teľ­ný po­moc­ník – dy­na­mic­ké od­ba­ve­nie. Mies­to mno­hých špe­cia­li­zo­va­ných tried, slú­žia­cich ako oby­čaj­ný kon­taj­ner na pre­nos dát z rôz­nych ob­ra­zo­viek, si uro­bí­te jed­nu je­di­nú trie­du a tej im­ple­men­tu­je­te kód, kto­rý bu­de ria­diť dy­na­mic­ké od­ba­ve­nie jej vlas­tnos­tí. Tí z vás, kto­rí po­uží­va­jú ZEN fra­mework v nov­ších ver­ziách Cac­hé, prí­pad­ne ma­li mož­nosť sa oboz­ná­miť s no­vou ver­ziou Deep­See, moh­li na­ra­ziť na ma­sív­ne vy­uží­va­nie trie­dy % ZEN.proxyOb­ject. To je kon­krét­na im­ple­men­tá­cia dy­na­mic­ké­ho od­ba­ve­nia v praxi. Po­mo­cou tej­to trie­dy mô­že­te veľ­mi ele­gan­tne pre­ná­šať ob­jek­ty ja­zy­ka Ja­vas­cript ako ar­gu­men­ty ze­no­vých me­tód (me­tód s kľú­čo­vým slo­vom Zen­Met­hod). Ja­vas­cript to­tiž umož­ňu­je de­fi­no­vať dy­na­mic­ké ob­jek­ty, kto­rých de­fi­ní­cie vzni­ka­jú za be­hu klien­ta (preh­lia­da­ča) a tie­to dy­na­mic­ké ob­jek­ty mô­že Cac­hé na stra­ne server­a spra­co­vať prá­ve vďa­ka im­ple­men­tá­cii dy­na­mic­ké­ho od­ba­ve­nia.

API na dy­na­mic­ké od­ba­ve­nie ob­sa­hu­je nas­le­du­jú­ce me­tó­dy:
• %Dis­pat­chMet­hod(Met­hod As %String, Args...)
• %Dis­patchClas­sMet­hod(Class As %String, Met­hod As %String, Args...)
• %Dis­pat­chGet­Pro­per­ty(Pro­per­ty As %String)
• %Dis­pat­chSet­Pro­per­ty(Pro­per­ty As %String, Va­lue)
• %Dis­pat­chSet­Mul­ti­dim­Pro­per­ty(Pro­per­ty As %String, Va­lue, Subs...)

Náz­vy me­tód ur­ču­jú ich po­uži­tie, je te­da na vás prog­ra­má­to­roch, čo bu­dú jed­not­li­vé me­tó­dy vy­ko­ná­vať. Viem si ľah­ko pred­sta­viť, že tak­to mô­že­te zos­ta­viť ob­jekt, kto­ré­ho in­štan­cie bu­dú uk­la­da­né nie v da­ta­bá­ze, ale v texto­vých sú­bo­roch na dis­ku, prí­pad­ne mô­že­te ľah­ko nad ľu­bo­voľ­nou glo­bá­lo­vou štruk­tú­rou de­fi­no­vať ob­jekt.

A te­raz jed­na ma­lá, tri­viál­ne jed­no­duc­há ukáž­ka: Maj­me re­gis­tro­va­nú trie­du a tej im­ple­men­tuj­te me­tó­du % On­New () tak, že jej ar­gu­men­tom bu­de zoz­nam pá­rov ná­zov: hod­no­ta, od­de­le­ných dvoj­bod­kou. Po­mo­cou dy­na­mic­ké­ho od­ba­ve­nia mô­že­me jed­no­duc­ho po in­štan­co­va­ní trie­dy pra­co­vať s od­ov­zda­ný­mi pár­mi ako s vlas­tnos­ťa­mi a ich hod­no­ta­mi. Tú­to konštruk­ciu mô­že­me ľah­ko po­užiť ako zá­klad ko­mu­ni­kač­né­ho pro­to­ko­lu med­zi na­ši­mi ap­li­ká­cia­mi ale­bo na­šou a cud­zí­mi ap­li­ká­cia­mi. Nap­rík­lad oba­le­ním webo­vý­mi služ­ba­mi zís­ka­me jed­no­duc­hé a uni­ver­zál­ne ob­jek­to­vé ko­mu­ni­kač­né roz­hra­nie.

  Class tt. Tip21 Extends  %Re­gis­te­re­dOb­ject
  {
  pro­per­ty Va­lue­Na­me­PairsList as %String  [ Pri­va­te, Mu­ti­Di­men­sio­nal  ];
□Met­hod %Dis­pat­chGet­Pro­per­ty  (Pro­per­ty As  %String )
      {
             try    {
                      set    va­lue= ..Va­lue­Na­me­PairsList (Pro­per­ty)
             }   catch    (ex)   {
                     set     va­lue=““
                       // ne­bo může­me jed­no­du­še vrá­tit run­ti­me chy­bu po­mo­cí
                       // throw
             }
            quit va­lue 
      }

   ///   Pre­da­me sez­nam pa­ru  jme­no:hod­no­ta <BR>
   ///   <examp­le>
   ///   USER>s  x=##class (tt.Tip21)  . %New (“jme­no:Jo­sef:pra­me­ni:No­vot­ny“)
   ///   USER>w x.jme­no
   ///   USER>Jo­sef
   ///   </examp­le>
□Met­hod %On­New (init­va­lue As %Cac­heS­tring) As %Sta­tus [ Pri­va­te, Pro­ce­du­reB­lock = 1, Server­Onl­y = 1]
   {
              S i=1
              S len=$1 (init­va­lue, “:“)
              For   {
                       Quit: i>len 
                       s prop=$p (init­va­lue, “:“, i)   s  i=i+1
                       s val=$p (init­va­lue, “:“, i)   s  i=i+1 
                       s ..Va­lue­Na­me­PairsList (prop)=val
              }
             Quit $$$OK
     }
}

Ukáž­ko­vý vý­stup:

SYM>s x=##class(tt.Tip21).%New("jme­no:pe­pa:prij­me­ni:no­vak")
SYM>w x.jme­no
pe­pa
SYM>w x.prij­me­ni
no­vak

Ak bu­de­te chcieť vi­dieť prak­tic­kú im­ple­men­tá­ciu % ZEN.proxyOb­ject, po­ob­ze­raj­te sa v Ze­no­vej ko­mu­ni­te na Goog­le, pred ne­ja­kým ča­som som tam umies­tnil ma­lú ap­li­ká­ciu, kto­rá do­ká­že zob­ra­zo­vať pro­jek­ty Cac­hé ale­bo sku­pi­ny tried po­mo­cou no­tá­cie UML. V jed­nej z tried pro­jek­tu je trie­da proxyOb­jekt vy­uži­tá na od­ov­zdá­va­nie in­for­má­cií z po­uží­va­teľ­skej ob­ra­zov­ky na spra­co­va­nie na server Cac­hé.

Od­kaz na UML: http://groups.goog­le.com/group/inter­sys­tems-zen/web/app-uml-class-di­ag­ram-for-cac­he-en­semb­le?hl=en

V bu­dú­cej čas­ti sa bu­de­me ve­no­vať no­vej im­ple­men­tá­cii dy­na­mic­ké­ho SQL.

Ďal­šie čas­ti >>

Zdroj: Infoware 5/2011



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

No­vá im­ple­men­tá­cia dy­na­mic­ké­ho SQL
Kedysi dávno sme sa venovali tvorbe dopytov s použitím ručne písaného kódu bez jazyka SQL. V tejto časti si, naopak, ukážeme, akým spôsobom sa v Caché vyvíjali dopyty, a oboznámime sa s najnovšou implementáciou dynamických dopytov SQL. čítať »
 
Dy­na­mic­ké od­ba­ve­nie vlas­tnos­tí a me­tód tried
V tejto časti nášho seriálu sa oboznámime s veľmi užitočnou schopnosťou tried Caché, ktorá je k dispozícii už dlhší čas, ale až v posledných verziách sa dostáva viac do popredia čítať »
 
Prá­ca s trie­dou %In­staller
V tomto pokračovaní seriálu vám ukážeme použitie ešte stále pomerne čerstvej novinky, určenej na používateľskú úpravu inštalácie Caché. čítať »
 
Vy­uži­tie po­uží­va­teľ­skej pro­jek­cie na Unit Tes­ting
V predchádzajúcej časti sme sa oboznámili s balíčkom % UnitTesting a ukázali sme na praktickom príklade, ako s ním pracovať. Asi vám v priebehu čítania napadlo, či by nebolo možné tvorbu testovacích tried nejako automatizovať. čítať »
 
Tes­to­va­nie kó­du po­mo­cou Unit Tes­ting nás­tro­ja Cac­hé
Koľkí z nás vývojárov môžu na otázku, či testujú svoj kód, odpovedať úprimne: áno? čítať »
 
Try – catch ošet­re­nie chýb a pre­po­je­nie do sys­té­mo­vé­ho pro­to­ko­lu chýb
Na početné otázky priaznivcov programovania s vysokovýkonnou objektovou databázou InterSystems Caché vám prinášame niekoľko aktuálnych tipov a trikov. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter