Category Archives: Uncategorized

Spring scope

Rozsahy platnosti (scope) Java bean jsou už ve Springu dlouho, od verze 2.0. Až donedávna mi ale nedošlo o jak silný nástroj se jedná. Pro ty, kteří nejsou s konceptem rozsahu platnosti obeznámeni, uvedu krátké shrnutí, podrobnější detaily se dočtete zde.

Už od první verze Springu, si člověk u každého beanu mohl zvolit, jestli chce aby se choval jako sigleton (jedináček) nebo aby bean factory pokaždé vracela novou instanci (prototype). Spring 2 zavedl další rozsahy, mezi jinými i scope session a request. Co to znamená? U webové aplikace, můžeme Springu říci, aby vracel jednu a tu samou instanci v rámci HTTP session nebo requestu. Nejlépe to půjde vysvětlit na příkladě. Mějme následující kontroler.



01 public class AddToCartController implements Controller {
02   private Cart cart;
03   public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resthrows Exception {
04     String itemName = ServletRequestUtils.getRequiredStringParameter(req, "itemName");
05     cart.addItem(itemName);
06     return new ModelAndView("redirect:viewCart.spg");
07   }
08   public Cart getCart() {
09     return cart;
10   }
11   public void setCart(Cart cart) {
12     this.cart = cart;
13   }
14 }

Vidíme, že tu jednoduše přidáváme položku do nákupního košíku. Ale počkat, co to je za nesmysl, vždyť ten kód vypadá, jako by naše aplikace mohla mít jenom jeden košík, společný pro všechny zákazníky! A to je právě to kouzlo rozsahů platnosti ve Springu, aplikaci mohu psát tak, jako by měla jenom jednoho uživatele. Aby to fungovalo, musím v konfiguračním souboru Springu říci, že má pro každou session vytvořit novou instanci.

<bean id="cart" 
	class="net.krecan.javacrumbs.stshop.SimpleCart" 
	scope="session">
	<aop:scoped-proxy proxy-target-class="false"/>
</bean>
<bean name="/addToCart.spg" 
	class="net.krecan.javacrumbs.stshop.AddToCartController">
	<property name="cart" ref="cart"/>
</bean>

Všimněte si prosím, kousku konfigurace <aop:scoped-proxy proxy-target-class="false"/>. Ten je tam z toho důvodu, že kontroler do kterého injektujeme je normální sigleton. To znamená, že k jeho inicializaci a nastavení všech závislostí dochází jenom jednou. Z toho plyne, že by se nám s kontrolerem napevno spojil právě jeden nákupní košík. Uvedený tag zajistí, že se do kontroleru vloží proxy objekt, který deleguje všechnu svoji činnost na instanci košíku vytaženou z HTTP session.

Na první pohled na tom není nic převratného, už jsem o tom dokonce i jednou psal. Tenkrát mi ale nedošly všechny důsledky, které podobná funkcionalita přináší. Mohu bez problémů psát webové aplikace tak, jako by s nimi pracoval jenom jeden uživatel. Nemusím si všude předávat pomocí parametrů id uživatele. Pokud to uznám za vhodné, mohu nákupní košík vložit přímo do business vrstvy, která s ním pracuje. Ano, je to hodně nezvyklé a může to mást programátory, kteří jsou zvyklí na klasické bezstavové J2EE programování. Když jsem to poprvé použil, tak se mi to hodně nelíbilo. Z kontroleru jsem chtěl volat jakýsi CartService, který by všechno zařídil. Pak mi ale došlo, že to, na co jsem zvyklý, je v podstatě procedurální programování. CartService obsahuje procedury, kterým předávám takovou chytřejší strukturu Cart. V objektovém programování se nákupní košík o sebe musí umět postarat sám. V uvedeném příkladě to tak je. Dokonce když chci, tak Cart může obsahovat referenci na DAO, která uloží změny do databáze. Koukněte se prosím na příklad ještě jednou, obdobně by vypadal listener ve standalone aplikaci. Co myslíte, jsem úplně mimo, nebo je to ten správný krok k návratu k objektovému programování?

Zdrojové kódy jsou ke stažení pomocí SVN na adrese https://java-crumbs.svn.sourceforge.net/svnroot/java-crumbs/spring-terracotta-shop/

Znalosti a zkušenosti

Design není hotov dokud není dokončen poslední test.

Tento příspěvek volně reaguje na Dagiho Mikro a makro znalosti. Já se na celou věc dívám z trochu jiného úhlu. Podle mě jde hlavně o rozdíl mezi znalostí a zkušeností. Znalosti jsou laciná věc. Stačí zajít do školy, projít si pár článku na internetu a nebo nedej bože přečíst knihu. Pokud máte funkční paměť nejen v počítači ale i v hlavě, tak znalosti nabudete velice snadno. A to jak nízkoúrovňové mikro znalosti, tak i vznešené makro znalosti.

Například zrovna teď čtu zajímavou knihu, Code Craft. Je mimo jiné o tom jak by se správně mělo programovat, jak správně psát komentáře, pojmenovávat metody, dělit kód na třídy, moduly atp. Je jednoduché si takovou knihu přečíst. Ale až teprve zkušenosti nám ji ale dovolí pochopit a docenit. A co je hlavní, až teprve zkušenosti nám umožní si uvědomit, že ty jednoduché samozřejmosti, které se v knihách dočítáme, nejsou vůbec tak samozřejmé a už vůbec ne jednoduché. Všichni vědí, že by měli psát malé třídy s jednoznačnou funkčností, všichni vědí že nemají psát špagetoidní kód, všichni vědí že by měli rozdělit svůj kód na dobře oddělené vrstvy. Ale až těžce nabytá zkušenost nás donutí se o to alespoň snažit.

Jsou to zkušenosti co se počítá. Můžu si přečíst kolik knih chci o tom jak se mají správně dělat softwarové projekty. Dokud to ale nezažiji na vlastní kůži, mají tyto znalosti malou váhu (bojím se že nulovou). Zkušenosti mají také jednu obrovskou výhodu. Málo stárnou. Když mám zažito jak psát software, jaká pravidla dodržovat a čeho se vyvarovat, je mi více méně jedno jakou technologii používám. Detaily si dokáži nastudovat.

Neplatí ale stoprocentně, že lidé se zkušenostmi musí nutně dělat architekty. Je samozřejmě žádoucí, aby design (architekturu) dělali zkušení lidé. Bez zkušeností dobrou architekturu nenavrhnete. A špatnou architekturu nespasí ani ti sebelepší programátoři. Já se ale například snažím udržovat si i ty mikro znalosti a držet se spíše na pozici programátora. Prostě mě spíš baví psát programy v Javě než ve Wordu, sedět spíš u počítače než na schůzích. Jistě, až jednou nebudu stíhat, nebo budu mít pocit, že už jsem se konečně naučil pořádně programovat, budu rád za to, že jsem za ta léta nasbíral i nějaké zkušenosti. Začnu se poohlížet po práci, kde už se nebudu muset zabývat detaily a mít mikro znalosti. Do té doby se ale budu snažit dělat se to jediné co jakž takž umím a sbírat cenné zkušenosti.

Jak jsem nepřešel na Linux

Na svůj domácí počítač jsem si nainstaloval Ubuntu 7.0. Dříve jsem experimentoval s Kubuntu, ale teď už mi připadá, že se pro koncového uživatele rozdíly mezi KDE a Gnome stírají. Zároveň mi Ubuntu připadá více propracované než Kubuntu, proto jsem ho zvolil.

Po instalaci mě nejvíc překvapilo, že téměř vše funguje tak jak má. Tiskárna tiskne, WI-FI na notebooku funguje, reproduktory hrají a stěrače stírají. V podstatě funguje všechno co k práci doma potřebuji. Fungují mi zprávy po internetu, jede Skype, samozřejmě funguje i Java, Eclipse a OpenOffice. Navíc instalace všeho je díky balíčkovacímu systému neuvěřitelně snadná. Zkrátka a dobře Ubuntu 7.10 je první distribuce, kterou bez problému zvládne používat i taková lama jako jsem já. Samozřejmě došlo i k pár problémům, všechny ale byly způsobeny mojí hloupostí:

  1. Při instalaci jsem použil špatně vypálené CD. Takže instalace spadla v půlce na tom, že nemůže číst z CD. Vzhledem k tomu, že už byla Linuxová část disku smazána, nefungoval zavaděč Grub a počítač nešlo nastartovat jinak než z živého CD Linuxu. Dobře mířený příkaz lilo -M to vyřešil.
  2. Nefungovala mi Webkamera. Nakonec jsem přišel na to, že se na ni snažím přistupovat pod uživatelem, který na to nemá právo.
  3. Linux mi odmítal namapovat NTFS partition. Hledáním na internetu jsem přišel na to, že to je tím, že mám hibernovány Windows a Linux odmítá namapovat disk, aby tam něco nepoškodil.
  4. Nepodařilo se mi přepnout zvukový výstup na USB sluchátka.

Takže teď mám nainstalovný Linux se vším co potřebuji. Nicméně jsem se i přes to rozhodl zůstat na Windows. Důvod je jednoduchý, jsem líný učit se a zvykat si na nové věci. Pořád ještě jsou mezi Windows a Linuxem rozdíly a já jsem celý život dělal na Windows. Moje práce je na nich efektivnější. Když dělám na Linuxu, pořád si s ním hraji, zkouším ho nastavit tak aby byl co nejpodobnější Windows a nedělám to co bych potřeboval (proto jsem už dlouho nic nenapsal na blog). Když dělám s Windows, tak mě nic nerozptyluje.