Dnes: 16. ledna 2018    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    SŘBD
    (Systém řízení báze dat)

    Programový systém umožňující vytváření, údržbu a použití báze dat. Podle komplexnosti je možné SŘBD rozdělit na nižší (např. PC Fand), střední (FoxPro) a vyspělé (Oracle 9i).

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Tipy a triky pro Caché XIX. - Využití uživatelské projekce


    [Tipy - triky] - minulém díle jsme se seznámili s balíčkem %UnitTesting a ukázali jsme si na praktickém příkladě, jak s tímto balíčkem pracovat. Asi Vás v průběhu čtení napadlo, zdali by nebylo možno tvorbu testovacích tříd nějak automatizovat. Je to možné, a dokonce to není nic složitého. Navíc, jako bonus, se naučíme vytvářet uživatelské projekce. Pokud jste zatím s projekcemi nepracovali, pak vězte, že je to mechanismu, který Caché mj. používá při tvorbě proxy tříd zatupujících Caché třídy v prostředí hostitelských technologií jako jsou C++ a Java či EJB. To ovšem není zdaleka jediné možné použití projekcí. A my si jedno takové netradiční použití ukážeme.



    Jak Caché projekce funguje: chceme-li aplikovat na naši třídu jednu nebo více projekcí, jednoduše v rámci těla třídy přidáme deklaraci PROJECTION. Kód obsažený ve třídě implementující projekci (ano, projekce jsou obyčejné třídy) se vykonává v rámci každé kompilace třídy obsahující danou projekci, a to na závěr kompilačního procesu, tedy poté co se vytvoří runtime kód a definice tabulek (u persistentních tříd). Z toho plyne, že projekce nemění kompilovanou třídu, ale může dělat cokoliv jiného, například generovat soubory či jiné třídy.

    Projekci vytvoříme jednoduchým odděděním od bázové třídy %Studio.AbstractProjection. Projekce nabízí k implementování dvě statické metody:

    • CreateProjection
    • RemoveProjection

    První metoda se vykoná po ukončení kompilace třídy, druhá pak před kompilací (přesněji, před vygenerováním runtime kódu) nebo při smazání definice třídy. A nyní jednoduchý příklad: budeme implementovat pro jednoduchost pouze metodu CreateProjection. V těle metody využijeme třídy v balíčku %Dictionary pro procházení definicí kompilované třídy, a ke každé spustitelné metodě vytvoříme deklaraci testovací metody v testovací třídě. Kód je poměrně kompaktní a tak zde uvedeme celou definici třídy projekce.

     
    Class tt.projection.UnitTest Extends %Projection.AbstractProjection
    {
    
    Parameter EXPORTFOLDER As STRING;
    
    /// This method is called by the Class Compiler whenever an associated 
    /// class has finished compiling. classname contains the name of 
    /// the associated class while parameters contains an array of the 
    /// projection parameters subscripted by parameter name. The modified
    /// for an incremental compile will contain a comma separated list of the methods that were
    /// modified and it will be blank for a full compile
    
    /// Any errors reported by this method are reported by the Class Compiler but
    /// do not effect class compilation in any way.
    ClassMethod CreateProjection(
    	classname As %String,
    	ByRef parameters As %String,
    	modified As %String) As %Status
    {
    	#dim tMeth as %Dictionary.MethodDefinition
    	// projdi definici tridy a vytvor novou tridu (pouze pokud neexistuje) a prazdne testovaci metody (pouze pokud neexistuji)
    	s len=$l(classname,".")
    	s utclassname=classname_".UnitTest"
    	
    	if ##class(%Dictionary.ClassDefinition).%ExistsId(utclassname) {
    		s tUTClassDef=##class(%Dictionary.ClassDefinition).%OpenId(utclassname)
    		s msg="Modifikuji testovaci tridu "_utclassname
    	} else {
    		s msg="Vytvarim testovaci tridu "_utclassname
    		s tUTClassDef=##class(%Dictionary.ClassDefinition).%New()
    		s tUTClassDef.Name=utclassname
    		s tUTClassDef.Super="%UnitTest.TestCase"
    		s tSC=tUTClassDef.%Save()
    		i $$$ISERR(tSC) w $System.Status.GetErrorText(tSC)
    	}
    	w !,"*******************************************************"
    	w !,msg
    	w !,"*******************************************************"
    	
    	// projdi metody... - pouze verejne
    	s tClassDef=##class(%Dictionary.ClassDefinition).%OpenId(classname)
    	s m="" f {
    		s tMeth=tClassDef.Methods.GetNext(.m) quit:m=""
    		if tMeth.Internal!(tMeth.Private) continue
    		s tUTMethName(0)="Test"_tMeth.Name_"OK"
    		s tUTMethName(1)="Test"_tMeth.Name_"NOK"
    		f i=0:1:1 {
    			if '##class(%Dictionary.MethodDefinition).%ExistsId(utclassname_"||"_tUTMethName(i)) {
    				s tUTMeth=##class(%Dictionary.MethodDefinition).%New()
    				s tUTMeth.Name=tUTMethName(i)
    				s tUTMeth.ClassMethod=0
    				s tUTMeth.parent=tUTClassDef
    				d tUTMeth.Implementation.WriteLine("	// TODO: dopsat parametery atd...")
    				d tUTMeth.Implementation.WriteLine("	// do ..Assert")
    				d tUTMeth.Implementation.WriteLine("	quit")				
    				s tSC=tUTMeth.%Save()
    				i $$$ISERR(tSC) w $System.Status.GetErrorText(tSC)
    			}
    		}
    	}
    	
    	// posleze vyexportuj do urceneho adresare
    	s exportfile=$s($e(parameters("EXPORTFOLDER"),*)="\":parameters("EXPORTFOLDER"),1:parameters("EXPORTFOLDER")_"\")_utclassname_".xml"
    	d $System.OBJ.Export(utclassname_".cls",exportfile)
    	w !,"*******************************************************"
    	QUIT $$$OK
    }
    
    }

    Nyní již stačí jen přidat definici námi vytvořené projekce do třídy tt.Tip18 z minulého dílu. To provedeme jednoduše, přidáním deklarace

    Projection UT As tt.projection.UnitTest(EXPORTFOLDER = "c:\temp"); Všimněte si, že naše projekce zavádí parametr EXPORTFOLDER, do kterého budeme exportovat testovací třídy.

    A nyní již stačí jen třídu tt.Tip18 zkompilovat:

     
    Compilation started on 03/02/2010 13:25:18 with qualifiers 'ckbu'
    Compiling class tt.Tip18 
    Compiling routine tt.Tip18.1
    *******************************************************
    Modifikuji testovaci tridu tt.Tip18.UnitTest
    *******************************************************
    Exporting to XML started on 03/02/2010 13:25:18
    Exporting class: tt.Tip18.UnitTest
    Export finished successfully.
    
    *******************************************************
    Compilation finished successfully in 0.093s.

    Výše uvedený text je výpisem okna Output Studia při kompilaci.

    Malý kvíz na závěr: Používá ZEN framework projekce či nikoliv?

    V příštím díle se budeme věnovat práci s třídou %Installer.

    Související články:
    Tipy a triky pro Caché XXII. - Nová implementace dynamického SQL (15.11.2010)
    Tipy a triky pro Caché XXI. - Dynamické odbavení vlastností a metod tříd (08.11.2010)
    Tipy a triky pro Caché XX. - Práce s třídou %Installer (01.11.2010)
    Tipy a triky pro Caché XVIII. - Testování kódu (11.10.2010)
    Tipy a triky pro Caché XVII. – try - catch (04.10.2010)
    Tipy a triky pro Caché XVI. – kdy a proč používat třídu System.Eents? (02.10.2006)
    Tipy a triky pro Caché XV. – jak na chybové stavy? (31.07.2006)
    Tipy a triky pro Caché XIV. – jak na grafiku s XML transformací? (13.07.2006)
    Tipy a triky pro Caché XIII. – jak na izolaci objektů v CSP? (06.04.2006)
    Tipy a triky pro Caché XII. – jak na Caché Server Rules? (09.03.2006)
    Tipy a triky pro Caché XI. – definování virtuálních CSP serverů (09.02.2006)
    Tipy a triky pro Caché X. – vlastní vyhledávání (23.01.2006)
    Tipy a triky pro Caché IX. – komunikace mezi procesy podruhé (16.01.2006)
    Tipy a triky pro Caché VIII. – komunikace mezi procesy poprvé (09.01.2006)
    Tipy a triky pro Caché VII. – Java Server Pages a Caché (02.01.2006)
    Tipy a triky pro Caché VI. – psaní kódu v .NET pomocí COM třídy Factory (14.11.2005)
    Tipy a triky pro Caché V. – jak na ladění CSP stránek? (05.10.2005)
    Tipy a triky pro Caché IV. – jak na neznámý počet parametrů? (19.08.2005)
    Tipy a triky pro Caché III. – casting objektů (19.07.2005)
    Tipy a triky pro Caché II. – dotazy bez SQL (18.05.2005)
    Tipy a triky pro Caché I. - izolace (05.05.2005)

    ( Celý článek! | Autor: Daniel Kutáč | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1546 hl.)
    Do 1 000,- Kč 
     (1065 hl.)
    Do 10 000,- Kč 
     (997 hl.)
    Do 25 000,- Kč 
     (1375 hl.)
    Do 50 000,- Kč 
     (1015 hl.)
    Do 75 000,- Kč 
     (1177 hl.)
    Více než 75 000,- Kč 
     (1015 hl.)

    Celkem hlasovalo: 8190


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Leden  >>
    PoÚtStČtSoNe
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena