úterý 28. srpna 2007

NetBeans Platform 1. - Úvod

O co půjde?

Již podle názvu je jasné, že jsem se rozhodl psát o samotných NetBeans jako o platformě. V současné době se věnuji vývoji aplikace postavené právě na tomto "podvozku", a proto s tím souvisí i má snaha získat co nejvíce informací a zkušeností s touto platformou.

Předem bych rád upozornil, že nejsem žádný specialista v oblasti RCP aplikací, a proto se spíše budu zabývat menšími oblastmi při vývoji.

Často se mi stávalo, že jsem se v některé z pasáží natolik zasekl, že mi trvalo i několik dní, než jsem přišel na správné řešení. Jelikož jsem člověk, který rád pomáhá druhým, rozhodl jsem se, že touto formou pomohu některým lidem při jejich potížích.

Sám se budu snažit o zpětnou vazbu a pokud někdo bude znát lepší způsob implementace dané věci, budu rád, když ji poskytne ostatním.

Co byste si měli přečíst...

Jak už to tak bývá, tak i zde je třeba někde začít. Jistým předpokladem je znalost Javy, základní znalost swingu a znalost používání NetBeans jako vývojového nástroje.
Pokud všechny tyto znalosti mám, mohu se pustit do vývoje. Osobně jsem začal krátkými tutoriály na www.netbeans.org/, poté by měla být na řade kniha Rich Client Programming: Plugging into the NetBeans Platform.
Následuje Geertjan's Weblog, který popisuje jednotlivé postupy a nabízí srozumitelnější výklad než samotný javadoc.

Další zdroje se dají samozřejme nalézt pomocí googlu či na stránkách netbeans.org. Já se zaměřím spíše na základní popis.

NetBeans RCP

NetBeans IDE

Jako základní API jsem si zvolil NetBeans 6.0 M10. I když se jedná pouze o milestone, domnívám se, že se až tolik změn v API konat nebude. Proto všechny příklady budou předpokládát, že máte tuto verzi, či verzi vyšší, nainstalovánu.
Jelikož je spousta komponent přímo svázána (děděno z komponent Swingu ) se swingem, nebudu se příliš zaobírat jejich funkčností a budu předpokládat základní znalost těchto komponent.


Nakonec bych ještě jednou rád podotkl, že ne všechna řešení jsou v souladu se spravným použitím. Dost často se může stát, že bude existovat novější, efektivnější či odlišný způsob řešení daného problému. Proto mě prosím nekamenujte za tyto postupy, ale raději se pokuste přispět svými nápady v diskuzi.

NetBeans IDE

pátek 10. srpna 2007

Aplikace nezávislá na databázovém systému

V poslední době se dost rozrůstá názor, že aplikace by měly být psány tak, aby byly co nejvíce nezávislé na použitém DBMS. Osobně tento názor zastávám i já.

Důvodů je několik:

  • aplikace se může natolik rozsrůst, že stávající DBMS může být nevyhovující

  • vývoj v oblasti databází jde stále vpřed a s tím souvisí i změny v SQL jazyku

  • samotný model struktury dat by měl být definován v aplikaci, kde by měl být odstíněn od nějakého SQL

  • zdroje mohou být různé (databáze, soubory, vzdálená volání, ...)

  • aplikace může být vyvíjena bez použití databáze, která může přijít v pozdější fázi



Jak už to tak bývá, tak úspěch projektu je závislý od prvotní analýzy. Nechtějme tedy vše řešit hned od počátku. Jistě je bezpečnější si nechat otevřená zadní vrátka pro dané změny, které by mohly mít fatální následky.

Kompromis

Bohužel, nežijeme v ideálním světě, kde by vše bylo nalinkované tak, jak bychom si přáli. Uvedu jeden příklad, který mě přesvědčil o tom, že vytvořit aplikaci, která by byla skutečně nezávislá na DBMS je nemožné.
Pro načítání dat z jiných zdrojů, jsem použil Timer metody z EJB3, které mají tu vlastnost, že jsem schopný vytvořit si vlastní plánování plnění. Na persistenci jsem použil JPA. Když jsem zjistil, že JPA má možnost přiřadit listener na danou entitu, hned jsem si tuto vlastnost spojil s tím, že nebudu muset psát žádné triggery a hezky půjdu touto cestou.
To jsem si ovšem neuvědomil, že při dávkovém zpracování je JPA a EntityManager natolik náročný způsob, že jsem byl nucen přejít na nízkoúrovňové JDBC. Výhodou samozřejmě bylo extrémní zrychlení, ale nevýhodou, že daný Listener je v podstatě k ničemu. Ve finále jsem byl nucen napsat trigger a tím utnout možnost, že aplikační logika se postará o vše potřebné.


Vše není tak černé

I když jsem opustil snadnou přenostitelnost, stále mi zůstává možnost psát tu aplikaci tak, aby byl doménový model to hlavní a já byl co nejvíce odstíněn od DBMS. Přece jen, toho dávkového spracování zase není tolik, aby se to nedalo kdykoli změnit.
Používám 2 základní zdroje: MySQL a Oracle. Při klasickém přístupu jsou si obě databáze velice podobné. Je zde ovšem několik rozdílů, které jsou dost zásadní. Opět uvedu příklad, který toto vystihuje:
Chci nějaký základní reportovací nástroj, který bude pracovat tak, že uživatel napíše SQL dotaz, systém ho zpracuje a vrátí tabulku. Tabulku, která bude obsahovat možnost stránkování. A zde je ten problém, stránkování. U MySQL bych šel klasicky, přes: SELECT .... LIMIT x,y. Bohužel Oracle nic takového jako LIMIT nemá. Co teď? Parsovat SQL dotaz podle použitého DBMS? Ano. Ale s tím, že někdo něco takového již napsal. Samotný EntityManager obsahuje metody "setMaxResults(int arg)" a "setFirstResult(int arg)". Takže o jednu starost méně :)

Občas mi to přijde jako věčný boj. Každý druhý (v PHP) si píše vlastní databázové layery, tvrdí jak vše funguje, ale jen do doby, než přijde první požadavek, který nebyl očekáván podle specifikace používaného frameworku.

Doufám, že jednou bude svět natolik ideální, že skutečná nezávislost bude brána jako stadard pro psaní aplikací pro DBMS.