\


 Thursday, 07 October 2004
Dokážete najít všechny chyby v kódu?

Dokážete poznat všechny nesmysly v tomto kódu? Nejde o žádný reálný příklad, jen o letmé zachycení a nakupení střípků potměšilých nočních programátorských můr, jimiž je moje podvědomí neodbytně zaplavováno a mučeno po duševně drásající  refaktorizaci cizího kódu...;)

using System;
using System.Collections;
namespace DirtyProject.BusinessModel
{
    public class Order
    {
        private int m_id;
        private ArrayList m_orderItems;
        public Order(int id)
        {
            m_id = id;
            LoadOrSave(false);
            m_orderItems = new ArrayList();
        }
        public virtual void DeleteAndNotifyCustomer()
        {
            //Implementace
        }
        public virtual void LoadOrSave(bool save)
        {
            //implementace perzistence
        }
        //Položky objednávky
        public ArrayList OrderItems
        {
            get
            {
                return m_orderItems;
            }
        }
    }

    public class OrderItem
    {
        private Order m_order;
        private int m_orderItemsCount;
        private decimal m_orderItemsPrice;
       
        public OrderItem(Order parent)
        {
            if (parent == null)
                throw new ArgumentNullException();
           
            m_order = parent;
            m_orderItemsCount = 0;
            m_orderItemsPrice = 0;
        }
        public Order Parent
        {
            get
            {
                return m_order;               
            }
            set
            {
                m_order = value;   
            }
        }
        //Počet kusů zboží v objednávce
        public virtual int OrderItemsCount
        {
            get
            {
                return m_orderItemsCount;
            }
            set
            {
                m_orderItemsCount = value;;
            }
        }
        //Celková cena všech kusů zboží v položce objednávce
        public virtual decimal OrderItemsPrice
        {
            get
            {
                return m_orderItemsPrice;
            }
            set
            {
                m_orderItemsPrice = value;
            }
        }
        public virtual void LoadOrSave(bool save)
        {
            //implementace perzistence
        }
    }
}

 



Thursday, 07 October 2004 20:31:00 (Central Europe Standard Time, UTC+01:00)       
Comments [18]  Programátorské hádanky


 Wednesday, 06 October 2004
Pavel Koza je MVP - konečně !

Pavel Koza, člověk, který se zasloužil o popularizaci PDA zařízení s operačním systémem Windows Mobile na svém kultovním serveru CEYOU ještě v době, kdy většina z nás tato zařízení považovala jen za předražené hračky, se stal MVP v oblasti Mobile Devices. Víte sami, že příliš často nechválím, ale Pavel Koza byl pro mě bez jakýchkoli pochybností jediným kandidátem v Čechách splňujícím bez kompromisů všechny nároky MVP programu.

Gratuluju Pavle a díky za všechnu práci, kterou ve svém volném čase na CEYOU pro všechny PDA nadšence odvádíš.



Wednesday, 06 October 2004 08:45:00 (Central Europe Standard Time, UTC+01:00)       
Comments [1]  Mobilitky | Ostatní


 Monday, 04 October 2004
Metamorfózy a migrace návrhových vzorů

Je vzrušující pozorovat, jak na svém počátku amorfní a abstraktní vzor nabývá svébytného a ostře ohraničeného tvaru pri svém dospívání, když je adoptován různými technologiemi. Zasazením vzoru do jednoho vývojového prostředí a kontextu se může zdát, že je na univerzálnost svého použití aspirující smysl vzoru zastřen a překryt dominantním zaměřením a převládajícími výrazovými prostředky jedné technologie. Každý dobrý návrhový vzor se ale svojí konkretizací v jedné nebo i více technologiích nevyčerpává, ale je připraven vymanit se ze sevření každé technologie a při změně IT paradigmatu znovu nabídnout svoji plnou formativní potenci pro nové postupy, pravidla a vazby ve vývoji. Když se mění technologie, programovací jazyky nebo celé zažité programátorské návyky (strukturální versus objektové programování), tak esence kvalitního návrhového vzoru není dotčena a jeho abstraktní smysl začne být jen artikulován výrazovými prostředky žezlo přebírajícího paradigmatu a z něj vyplývajícího znalostního a pojmového horizontu. Dobrý návrhový vzor participuje na tvorbě struktur nového paradigmatu a současně je nově vznikajícími strukturami přetavován ve svou jinou, parciální a dočasnou formu.

Když nechcete, aby vaše znalosti beznadějně zastaraly za pár měsíců, nebazírujte na zvládnutí programovacích jazyků, vývojových prostředí nebo frameworků, ale stavte své znalosti na návrhových vzorech. .Net Framework nebo J2EE jsem se naučil tak, že jsem se za jednotlivými knihovnami nesnažil vidět deprimující změť tříd a metod, ale harmonii návrhových vzorů.

Jak se projevují migrace a proměny vzorů?

Vezměme si za příklad vzor Asynchronous Completion Token (ACT) popsaný v knize Patterns Oriented Software Architecture (autor Frank Buschmann a kolektiv). Tento vzor popisuje, jak dosáhneme efektivního a na zdroje počítače nenáročného zpracování odpovědí z více asynchronních požadavků. ACT je objekt (v obecném slova smyslu), který unikátně identifikuje každý asynchronní požadavek a slouží k výběru správného zpracovatele odpovědí. Participanti vzory jsou tři - iniciátor asynchronního požadavku, služba, která je volána a ACT pro korelaci požadavků a odpovědí.

V .NET je ACT vzor transformován do speciálního vzoru pro asynchronní volání, kdy je zavedena formální konvence, že asynchronní metody jsou prefixovány slovy Begin (začátek požadavku) a End (Konec požadavku), Každý delegát nabízí metody Begin a End, jejichž posledním parametrem je zase dle konvence jakýkoli objekt, který pak v systému hraje roli ACT. ACT neslouží ale k výběru primárního zpracovatele asynchronní odpovědi, protože ten je na začátku asynchronního volání determinován předposledním parametrem, jímž je delegát AsyncCallBack ukazující na metodu s kompatibilní signaturou. Předaný ACT ale může být klíčem k dynamickému určení sekundárního zpracovatele a/nebo je objektem pro přenos stavových informací.

.Net si tedy ACT vzor přizpůsobil k obrazu svému a vybral si jen některé jeho myšlenky.

ACT se také uplatňuje v SOA - v architektuře založené na službách, které si mezi sebou asynchronně vyměňují tisíce zpráv denně, potřebujeme prostředek pro korelaci zpráv-požadavků a návazných zpráv-odpovědí. V SOA je uplatňován návrhový vzor s názvem Correlation Identifier - v hlavičce zprávy je uložen jednoznačný identifikátor požadavku, který je v hlavičce odpovědi zaslán zpět odesílateli. Jsme v SOA a stále pracujeme se starým dobrým ACT vzorem, jen místo delegátů mluvíme o zprávách, dokumentech a hlavičkách s ACT informací.

Vzor Correlation identifier (a ACT) je dále rozpracováván ve specifikacích pro jednotlivé technologie. Když budeme mít SOA založenou na webových službách, setkáme se s normovaným ACT ve standardu ws:addressing, kde je stanovena a přijata konvence, že ACT musí odesílatel poslat v hlavičce nazvané MessageId a kdy je vyžadováno, aby hlavičku uvedl, a odesílatel je povinen hodnotu z MessageId poslat v hlavičce odpovědi s názvem RelatesTo.

Až skončí éra SOA, webových služeb, .Net Frameworku a přijde jiná, úžasnější, oslnivější a zase skoro dokonalá technologie, na které se bude hlavně dobře vydělávat,;) nepřežijí dílčí implementace ACT v těchto prostředích, ale můžeme si být skoro jisti, že vzor ACT jako bájný Fénix vstane omlazený z popela, změní svůj vnější vzhled, aby byl "in", ale jeho podstata zůstane beze změny, dokud budou existovat asynchronní volání.



Monday, 04 October 2004 20:54:00 (Central Europe Standard Time, UTC+01:00)       
Comments [3]  Analytické drobky


 Sunday, 03 October 2004
Trochu chlubení;) - po necelých 14 dnech jsem se dostal do Top 50 v TopListu.

Nedá mi to;). Před necelými 14 dny jsem konečně umístil na svůj blog počítadlo TopListu - a již od minulého týdne se pohybuji v "elitní" TOP 50 českých weblogů.

I když je módní tvrdit, že blog si člověk píše pro sebe a na čtenosti blogu vůbec nezáleží, já si to nemyslím - autistické zápisky smolené pro svoji vlastní potřebu přece nemusím dávat na internet, ale mohu je (a měl bych) ponechat jen na svém počítači. Falešná skromnost pro mě není žádná ctnost - když něco dělám, snažím se být nejlepší, protože jinak bych to přece nemusel dělat vůbec.;)

Jsem rád, že existuje početná skupinka lidí, kterou čtení tohoto blogu baví alespoň tak jako mě jeho psaní. Díky všem vám zahrnutým pod pojmem "unikátní IP".;)



Sunday, 03 October 2004 19:57:00 (Central Europe Standard Time, UTC+01:00)       
Comments [8]  Ostatní


 Friday, 01 October 2004
Malá anketa o business komponentách

Již dlouhou dobu se mluví o tom, že business frameworky a komponenty se stanou standardem při vývoji aplikací, již tradičně zlevní a zjednoduší jejich tvorbu (někteří cynici si myslí, že se jedná jen o další etapu v procesu geneze nového druhu cvičené opice z programátora ;)) a budou stejně populární jako vizuální komponenty v uživatelském rozhraní. Zatím se tak nestalo, ale zajímalo by mě, o jaké komponenty byste měli zájem. Všechny komponenty by byly samozřejmě doplněny o komplexní podporu v IDE (VS.NET, Eclipse atd.), byly by dodávány s průvodci pro nejběžnější úlohy a kvalitní dokumentací - jinými slovy, šlo by o komponenty s veškerým servisem, který znáte z UI komponent.

Protože v .TEXTu neudělám anketu:(, odpovídejte prosím v komentářích.

1) Komponenta pro generování kódu vrstvy pro přístup do databáze zvládající různé způsoby mapování objektů a jejich vztahů (agregace , asociace, dědičnost...). Pozor, nejedná se o netypový mapper, jakými měly být ve VS.NET Whidbey třeba Object Spaces, ale o "inteligentní" generátor typových metod databázové vrstvy, metod pro nahrání a uložení business objektů, storovaných procedur a DDL skriptů.

2) Komponenta pro kompletní evidenci historie business objektů. Logování změn všech nebo vybraných atributů objektu, volba mezi mělkou nebo hlubokou historií objektů, zapnutí podpory historie u třídy jedním konfiguračním klíčem i po nasazení projektu, výběr mezi mnoha formáty pro ukládání historie.

3) Komponenta pro vizuální definici jakéhokoli workflow nad objekty - generování kódu pro přechody mezi stavy, vizuální definice podmínek přechodu, komunikace mezi různými stavovými automaty, validace workflow, změna průběhu workflow by byla řešena za běhu aplikace výměnou jednoho definičního souboru.

4) Jiná komponenta. Napište prosím, jakou komponentu byste potřebovali.

Díky za odpovědi.



Friday, 01 October 2004 17:10:00 (Central Europe Standard Time, UTC+01:00)       
Comments [10]  Analytické drobky | Ostatní


 Thursday, 30 September 2004
Deset mých oblíbených aplikací na PDA

Na mém MDA II jsem si oblíbil hlavně tyto programy. Výčet není ani zdaleka úplný, protože aplikací používám mnohem víc, ale snad někomu z vás přijdou tyto tipy na zajímavé programy vhod.

  1. Total Commander CE - Pocket PC verze souborového manažera je stejně podařená jako její starší desktopový bratranec.
  2. ftxPBrowser - nadstavba nad internetovým prohlížečem Pocket IE s podporou záložek pro zobrazení více WWW stránek najednou (tabů). Více jsem o něm psal zde. Uvažuji ale, že si koupím profesionální prohlížeč NetFront, který mi kromě jiných vymožeností umožní mobilně přístupovat do internetového bankovnictví ČS.
  3. vxUtil - nepostradatelná utilitka pro síťová testování (Ping, TraceRoute, DNS Audit, Port scanner...)
  4. RepliGo - v desktopové verzi programu zkonvertujete například PDF, DOC, XLS, HTML dokumenty do formátu vhodného pro čtení v RepliGo čtečce na Pocket PC. RepliGo umí zobrazit dokumenty na šířku, využije pro zobrazení textu celou plochu displeje, pamatuje si stranku, kterou jsme v dokumentu naposledy prohlíželi a má další vychytávky, které z něj dělají kvalitní čtečku souborů na PDA.
  5. SharpVault - jednoduchý, ale praktický program na uchovávání přístupových kódů a dalších tajných informací pod jednim heslem.
  6. ICQ - K této aplikací asi není potřeba nic dodávat. PDA verze nejoblíbenějšího klienta pro instant messaging
  7. Spb Pocket Plus - sada užitečných drobností od mé oblíbené firmy Spb Software House. Jednoduchý, ale i na MDA II bezproblémový správce úloh, nevtíravý a přítom stále viditelný indikator stavu baterie v horní části displeje, rozšíření Pocket IE o podporu zobrazení více WWW stránek a hlavně skvělý Plug-In do Today obrazovky složený ze záložek, které můžete přidávat, přejmenovávat a především na ně umisťujete zástupce programů a zajímavé indikátory (stav baterie, velikost obsazené/volné paměti). Příslovečnou šlehačkou na dortu je plná podpora drag&drop přemisťování zástupců.
  8. Acrobat Reader - nepostradatelný program pro otevírání PDF souborů, které vám přišly třeba emailem, takže jste je nemohli na desktopu zkonvertovat do nativního formátu RepliGo.
  9. BetaPlayer - náhrada za dodávaný Windows Media Player, která zvládne i plynulé přehrávání filmů, na kterých se Windows Media Player trhá.
  10. Qusnetsoft NewsReader - plnohodnotný klient pro čtení zpráv z news (NNTP) serverů.


Thursday, 30 September 2004 20:58:00 (Central Europe Standard Time, UTC+01:00)       
Comments [6]  Mobilitky


 Monday, 27 September 2004
Dodatek k informacím o školení v OOP a UML

Protože se na školení o OOP a UML přihlásilo tolik účastníků, že máme nyní zcela zaplněny 3 kurzy a další zájemci se stále ozývají, chci upřesnit, jak to s kurzy já a školící středisko DIGI TRADE plánujeme:

  1. První kurz proběhne v dříve avizovaném termínu 3.11-5.11 2004 a s jeho účastníky by již měly být vyřízeny všechny formality.
  2. Druhý kurz se pravděpodobně uskuteční 15.12-17.12 2004 a všichni zájemci budou naším školícím střediskem s dostatečným předstihem informováni.
  3. Třetí kurz bude uspořádán na jaře 2005 a přesné termíny zveřejním opět na blogu.
  4. Zvláštním případem jsou firmy, které projevily zájem o in-house školení nebo si chtěly zarezervovat jeden či více termínů jen pro sebe. To není možné, protože nechceme ani nebudeme ulehčovat přežití na SW trhu naší přímé konkurenci. ;) Nijak ale neomezujeme počet účastníků z jedné firmy přihlášených na školení. Tohle je oficiální stanovisko společnosti DIGI TRADE, které se nezmění.

A hlavně díky všem přihlášeným za enormní zájem ;)



Monday, 27 September 2004 20:03:00 (Central Europe Standard Time, UTC+01:00)       
Comments [9]  Kurzy UML a OOP | UML


Mílé Živě, už nás neuč programovat ani zvracet

Milé nepoučitelné Živě,
protože nás stále oblažuješ seriálem o programování ve VB.Net, jehož autorem je pravděpodobně retardovaný jedinec rozšafně rozjímající nad pravidly strukturálního programování platnými snad někdy před 20 lety, a přitom nadpis seriálu nás ubezpečuje, že se týká VB.NET, který je, což pro tebe milé Živě bude asi nečekaným překvapením, jazykem plně objektovým, dovol mi se Tě zeptat, kdo prováděl korektury posledního dílu, ve kterém je takové množství nepřesnosti a chyb. Jeho plat za tento měsíc bych být Tebou věnoval nadaci pro šíření a zakořeňování vývojářských bludů a omylů.
Dovol mi alespoň zmínit některé nesmysly, které jsem nestrávil ani po třech rychle vypitých panácích Four Roses na obnovení své rozkymácené duševní rovnováhy.

Myslíš si opravdu laškující Živě, že se začátečník musí při výkladu konstrukce If Then Else dozvědět, jaké jsou hodnoty konstant true a false, aby byl vzápětí ubezpečen, že jejich použití se nedoporučuje?

Objasní mi tvůj odborný korektor smysl této kryptické věty.

"Praktická zasada je obykle taková, že konstrukce pro ošetřování chyb by měla zahrnovat co nejmenší počet příkazů, mají-li být vyjímky zpracovány co možná konkrétně a adresně v duchu pravidla "jedna chyba na jeden blok Try - Catch". Ladění kódu v bloku Try - Catch, ve kterém dochází k několika chybám současně může být velice nepohodlné a nepřehledné."

Chce tím snad autor říci, že konstrukce Try-Catch by měla obsahovat jen jednu sekci catch? Jestliže ano, pak bych rád věděl, odkud drahé Živě nabíráš pro své seriály tyto duševní trosky,  které si o programování četly naposledy v kroužku Mladých techniků otevřeném na škole pro mentálně opožděné vývojáře.

Snad byste v redakci mohli autora nějak šetrně a citlivě upozornit, aby se nerozzuřil, že již v .NET nežijeme ve světě ASCII znaků, ale že máme Unicode a doporučit mu, aby alespoň občas po očku nahlédl do MSDN a do specifikace jazyka, který vysvětluje, takže se příště zdrží všech žvástů o ASCII, řetězcích a relačních operátorech ve VB.NET.

Srovnejte seriál a dokumentaci k VB.NET.

"String. The operators return the result of comparing the two values using either a binary comparison or a text comparison. The comparison used is determined by the compilation environment and the Option Compare statement. A binary comparison determines if the numeric Unicode value of the characters, or each character in each string, is the same. A text comparison does a Unicode text comparison based on the current culture in use on the .NET Framework. When doing a string comparison, a null reference is equivalent to the string literal "". "

Občas slyším Živě, že jsi bulvárem. Nevím přesně, co znamená v IT světě bulvár a myslím, že je toto hodnocení často nepatřičné, zjednodušující a k Tobě nespravedlivé. Přesto se k této metafoře vrátím - bulvár (boulevard) se obrací alespoň na širokou, rozjívenou a frackovitou ulici, ale tímto seriálem se Živě podbízíš publiku, které neexistuje nebo bere seriál jako recesi, jíž jste se pobavili v redakci o Silvestru a potom jste ji zapomněli vyřadit z redakčního systému. Za výchovu další generace vývojářských neumětelů Ti nikdo Živě nepoděkuje. Proto Tě Žive prosím, ve svém zájmu a pro zachování svého již notně pošramoceného dobrého jména seriál ukonči a najdi si jiného autora, který nebude experimentovat s trpělivostí tvých čtenářů.



Monday, 27 September 2004 19:28:00 (Central Europe Standard Time, UTC+01:00)       
Comments [7]  Ostatní


Film Umučení Krista respektuje i transcenduje své téma

Ke shlédnutí filmu Umučení Krista jsem se dlouho odhodlával. Lákalo mě, že dle ohlasů si Mel Gibson dovolil překročit hranici, před kterou je ve filmovém ale i výtvarném umění násilí v Bibli estetizováno, upozaďováno a shrnováno pod banálně znějící větu "Kristus za nás trpěl a zemřel na kříži". Obával jsem se ale toho, že hollywoodský spektákl určený nejširšímu publiku neodolá pokušení vytlačit z filmu smysl Kristovy oběti a lascivně deskriptivním způsobem rekonstruuje jen fyzický aspekt Kristova utrpení.

Nestalo se tak. Ve filmu jsou emotivní a drastické scény utrpení Krista, kamera se někdy s okázalým zájmem vyžívá v zobrazení krutosti, ale hlavním motivem filmu zůstává pokoření Boha v lidských rukou, a krutost je vyvažována retrospektivními návraty k Ježíšovu působení před zatčením. Snad jediné, co by se dalo vytknout výběru scén milosti, které kontrastují s běsněním davu, je jejich prvoplánovitost usnadňující pochopení i člověku, který nezná Bibli. Počátek Křížové cesty lemovaný nadávajícím anonymním davem je stavěn do protikladu s dřívějším triumfálním přivítání Ježíše davem při vjezdu do Jeruzaléma. Smysl biblických metafor "cesta a příchod" ale nemůže vyčerpat tento doslovný výklad, protože Ježíš sám mluví o sobě jako o cestě a jeho příchod je chápán jako završení prefigurací ve Starém Zákoně.

Kontrast nejen mezi utrpenim a milostí je leitmotivem celého filmu. Barokní kontrast mezi světlem a tmou inspirovaný obrazy Caravaggia, kontrast mezi spokojeným a intrikujícím církevním establishmentem zosobněným farizeji a rodícím se společenstvím apoštolů, kteří se stanou "úhelnými kameny" Nového společenství křesťanů.

Vytknout by se mohlo filmu schématické zobrazení postav. Ale Bible sama podřizuje vykreslování postav i děj smyslu, který se jako všudypřítomná řeka spásy line pod nimi. Mně přijde film Umučení Krista jako zdařilé spojení dvou větví evropského vyprávění - mimetické, dějové a "realistické" zobrazování událostí ve filmu je smíšeno s s digresivními pasážemi, které mohou někomu připadat jako sadistické vyžívání se v utrpení, ale mně přišlo, že jejich záměrem bylo dostat dementními filmy otupělého diváka do stavu, kdy se stane účastníkem přímého přenosu popravy na Golgotě, která není báchorkou z dávných časů, ale i pro dnešní dobu přítomnou a věčnou obětí Krista.

Ano, film má i svá slabší místa. Je jím vymyšlené a nijak logikou tématu nezdůvodněné vyklovnutí oka jednomu lotrovi na kříži a procházení Satana mezi davem, což mi příliš připomínalo podobnou scénu ve Statečném srdci, nebo malý prostor, který byl ve filmu poskytnut tragédii Jidáše. Nadchlo mě ale, že se ve filmu mluví aramejsky.

Existují lepší zpracování Kristova utrpeni. Pro mě je jím hlavně Kazantzakisovo Posledni utrpení (kniha, film jsem neviděl), v němž je Kristus pokoušeným a osamělým člověkem, jehož utrpení na kříži je hlavně psychického rázu a který své Božství v rozporu s tradicí stvrzuje až závěrečným výkřikem "Bože můj, proč jsi mě opustil".

To ale nemění nic na tom, že Utrpení Krista je nadprůměrný film, jehož závěr propojí bez sentimentality a dekorativních církevních klišé všechny motivy filmu dohromady a navíc s využitím tradičních a ke kýči svádějících symbolů. Tmu v Kristově hrobce začne prozařovat světlo, jímž je Kristus - zmrtvýchvstalý Kristus, který se vztyčí a kamera zobrazí detail jeho ruky s otvorem po hřebu. Tak začínají dějiny spásy...



Monday, 27 September 2004 12:34:00 (Central Europe Standard Time, UTC+01:00)       
Comments [3]  Literární a jiné humanitní úlety


 Sunday, 26 September 2004
Logování událostí v mediátoru

V mediátoru, kterého jsem popisoval v jednom dřívějším spotu, potřebujeme při testování logovat všechny příchozí události, které jsou předdefinovaným a bezpečným způsobem distribuovány dalším objektům. Nejméně náročnou cestou na napsání, volenou většinou vývojáři, kteří se pravděpodobně do IT rekrutují z rekvalifikovaných potomků nejzarytějších stachanovců;), je logování každé události zvláštní metodou. Po registaci nových událostí do mediátora je vždy i změněna komponenta pro logování, takže o údržbě takového kódu si můžete nechat zdát jen mrazivé sny o opětovném plíživém nahrazování kvality kvantitou.*

Na údržbu nenáročné a univerzální řešení spočívá ve vytvoření preprocesoru (viz spot o mediátoru), který je vyvolán před distribucí událostí ostatním objektům a který parametry události vypíše přes objekt Trace z jmenného prostoru System.Diagnostics.

Základní myšlenky v preprocesoru.

1) Většina (ne li každý) objekt v business vrstvě má unikátní identifikátor s názvem Id. Preprocesor události vypíše typ objektu, který událost vyvolal a jeho unikátní Id, takže je snadné dohledat zdroj problematických událostí.

2) Objekty nesoucí parametry událostí dědí vždy z třídy EventArgs. Přes reflection vypíšeme rekurzívně hodnoty vlastností do úrovně nastavené ve vlastnosti EndDumpLevel.

using System;
using System.Diagnostics;
using System.Reflection;
namespace RStein.Utilities
{
    /// <summary>
    ///  Třída EventsLog pro logování událostí
    /// </summary>
    public class EventsLog
    {
       
        #region private constants
        private const int BEGIN_DUMP_LEVEL = 1;
        private const int DEFAULT_END_DUMP_LEVEL = 2;
        #endregion private constants
        #region private variables
        private int m_endLevel;
        #endregion private variables
        #region Constructors
        /// <summary>
        /// Konstruktor
        /// </summary>
        public EventsLog() : base()
        {
            m_endLevel = DEFAULT_END_DUMP_LEVEL;
        }
        #endregion Constructors
        #region Public properties
        /// <summary>
        /// Koncová úroveň rekurzivního výpisu vlastností objeudálosti
        /// </summary>
        public int EndDumpLevel
        {
            get
            {
                return m_endLevel;
               
            }
            set
            {
                if (value < 1)
                    throw new ArgumentOutOfRangeException("Value must be greater than 1");
                
                m_endLevel = value;   
            }
           
        }
        #endregion Public properties
        #region Public methods
       
        /// <summary>
        /// Metoda pro výpis informace o událostech
        /// </summary>
        /// <param name="sender">Zdroj události</param>
        /// <param name="e">Parametry události</param>
        public void ProcessEvent(object sender, EventArgs e)
        {   
            Debug.Assert((sender != null) && (e != null), "EventsLog - Invalid event data");
           
            if ((sender == null)||
                (e == null))
            {
                    return;
            }
               
           
                Trace.WriteLine(new string('-',25));
                dumpId(sender);
                dumpEventProperties(e);
           
        }
        #endregion Public methods
        #region Private methods
       
        //Zapsání Id a názvu objektu
        private void dumpId (object sender)
        {
           
            Type senderType = sender.GetType();
            PropertyInfo idInfo = senderType.GetProperty("Id");
            string id = String.Empty;
           
            if (idInfo != null)
                id = idInfo.GetValue(sender, null).ToString();
            Trace.WriteLine(String.Format("Přijata událost od objektu {0}, Id = {1}", senderType.ToString(), id));
        }
        //Vypsani vlastností objektu s parametry události
        private void dumpEventProperties(EventArgs e)
        {
           
            Type eventType = e.GetType();
            Trace.WriteLine(String.Format("Objekt události -  {0}", eventType.ToString()));
            PropertyInfo[] eventInfo = eventType.GetProperties();
            Trace.WriteLine("Výpis hodnot událostí");
            writeEventValues(eventInfo, BEGIN_DUMP_LEVEL, e);
        }
        //Metoda pro rekurzivní výpis hodnot vlatností
        private void writeEventValues(PropertyInfo[] eventInfo, int level, object o)
        {
            foreach (PropertyInfo info in eventInfo)
            {
               
               
                //Nezpracovávat indexované vlastnosti
                if (info.GetIndexParameters().Length != 0)
                    continue;
               
                object propValue = info.GetValue(o, null);
               
               
                if (propValue == null)
                    continue;
               
                Trace.Write(new String('\t', level));
                Trace.WriteLine(String.Format("Jméno - {0}, Hodnota = {1}", info.Name, propValue.ToString()));
               
                if (level < EndDumpLevel)
                    writeEventValues(propValue.GetType().GetProperties(), level + 1, propValue);
            }
        }
       
        #endregion Private methods
    }
}
 
 
*Pozorný čtenář z tohoto spotu dokáže vyčíst i mou politickou orientaci a nechuť k určitému druhu myšlení;)



Sunday, 26 September 2004 17:02:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  .NET Framework | Návrhové vzory