<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KoziołekWeb &#187; Inżynieria Oprogramowania</title>
	<atom:link href="http://koziolekweb.pl/category/inzynieria-oprogramowania/feed/" rel="self" type="application/rss+xml" />
	<link>http://koziolekweb.pl</link>
	<description>Sięgam tam gdzie wzrok nie sięga, a tam NullPointerException</description>
	<lastBuildDate>Tue, 22 May 2012 11:25:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<image>\n<url>http://koziolekweb.pl/icon.png</url>\n<title>KoziołekWeb</title>\n<link>http://koziolekweb.pl</link>\n<width></width>\n<height></height>\n</image>\n		<item>
		<title>Kraj ludzi uczciwych (inaczej)</title>
		<link>http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/</link>
		<comments>http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/#comments</comments>
		<pubDate>Tue, 22 May 2012 11:25:34 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Antywzorce]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Polska]]></category>
		<category><![CDATA[Społeczeństwo]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2563</guid>
		<description><![CDATA[      
      Polska to dziwna kraina jak mawiał Zulu-Gula. 200 lat wszelakich zaborów, okupacji i zamordyzmów spowodowało wykształcenie się wśród obywateli tej krainy niesamowitej umiejętności obchodzenia. Obchodzimy prawo, obchodzimy umowy, obchodzimy psie gówno na chodniku. Oczywiście nikt nie pomyśli, że można by tak uczciwie bez obchodzenia względnie posprzątać po pupilu. Lepiej jest narzekać, że musimy obchodzić. Taka [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Polska to dziwna kraina jak mawiał Zulu-Gula. 200 lat wszelakich zaborów, okupacji i zamordyzmów spowodowało wykształcenie się wśród obywateli tej krainy niesamowitej umiejętności obchodzenia. Obchodzimy prawo, obchodzimy umowy, obchodzimy psie gówno na chodniku. Oczywiście nikt nie pomyśli, że można by tak uczciwie bez obchodzenia względnie posprzątać po pupilu. Lepiej jest narzekać, że musimy obchodzić.<br />
Taka postawa spowodowała wyewoluowanie kolejnej, którą roboczo nazywam &#8220;wszyscy kradnom!!!!1111oneoneone&#8221;. Szczególnie jest ona widoczna w rozmowach prowadzonych na wszelkich forach i portalach. Ogólnie rzecz ujmując dla przeciętnego Polaka jeżeli ktoś ma więcej, ma lepszy samochód większe mieszkanie czy lepiej zarabia to musi kraść. Jeżeli dołożymy do tego naturalne w krajach rozwijających się mechanizmy związane z niezbyt silną konkurencją na rynku np. wyższe niż na zachodzie ceny to można dojść do wniosku, że przeciętny Polak to paranoik.</p>
<p>Postawa paranoiczna objawia się szczególną wrażliwością na oszustwa i krętactwo. W myśl zasady skoro ja kombinuję to oni też. Na dłuższą metę taka postawa powoduje tylko spadek wzajemnego zaufania wśród ludzi, zaufania do firm i państwa.<br />
Istnieją jednak pozytywne aspekty takiego stanu. Polacy są w czołówce swoistych &#8220;security nazi&#8221;. Zwracają uwagę na bezpieczeństwo swoje i swojej rodziny, nie ulegają podszeptom speców od PRu (inaczej &#8211; mają wyższy próg odporności na reklamę) oraz potrafią wywęszyć próby oszustwa. Do tego dochodzi talent do wymyślania &#8220;metod obejścia systemu&#8221;. Czasami robią to aż za nadto skutecznie. </p>
<p>Dzisiejszy hit to system płatności elektronicznej Sofort. Pisze o tym i <a href="http://niebezpiecznik.pl/post/zakupy-przez-internet-za-darmo-powazne-bledy-w-systemie-platnosci-sofort/">niebezpiecznik</a> i <a href="http://corporate-misfire.blogspot.com/2012/05/jak-za-darmo-dostac-buty-w-deichmanie.html">blogerzy jednego posta</a> (sorry za nazwę, ale to jest naprawdę pierwszy post na tym blogu, pomijając zwyczajowe &#8220;o czym blog&#8221;). Generalnie problem polega na tym, że firma prosi klienta o podanie loginu, hasła i hasła jednorazowego z SMSa w celu dokonania płatności. Za pomocą tych danych loguje się na konto (Selenium willkomen) i wykonuje przelew. </p>
<p>System działa z powodzeniem w wielu krajach i nie było chyba jakiejś większej wpadki. W Polsce &#8211; Kraju Ludzi Uczciwych Inaczej pierwszą rzeczą było wykombinowanie &#8220;jak okraść&#8221;, a następnie piętnowanie &#8220;korzystających idiotów&#8221;. Choć system nie jest doskonały to jednak nigdzie na świecie nie spotkałby się z taką reakcją. Takie podejście świadczy tylko o poziomie wzajemnego zaufania pomiędzy Polakami. Bez poprawy tego poziomu nie ma co marzyć o normalnym państwie. </p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/&amp;title=Kraj+ludzi+uczciwych+%28inaczej%29" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Del.icio.us" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/&amp;title=Kraj+ludzi+uczciwych+%28inaczej%29" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do digg" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Technorati" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/&amp;title=Kraj+ludzi+uczciwych+%28inaczej%29" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Stumble Upon" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/&amp;title=Kraj+ludzi+uczciwych+%28inaczej%29" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do Google Bookmarks" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/&amp;t=Kraj+ludzi+uczciwych+%28inaczej%29" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do FaceBook" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/&amp;title=Kraj+ludzi+uczciwych+%28inaczej%29" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Kraj ludzi uczciwych (inaczej)' do wykop.pl" alt="dodaj 'Kraj ludzi uczciwych (inaczej)' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/22/kraj-ludzi-uczciwych-inaczej/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prosty schemat bazy danych</title>
		<link>http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/</link>
		<comments>http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/#comments</comments>
		<pubDate>Mon, 21 May 2012 19:40:00 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Bazy Danych]]></category>
		<category><![CDATA[Szkolenia]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2560</guid>
		<description><![CDATA[      
      Przy okazji zmiany płatnika ZUS pojawił się problem przekazania różnych moich projektów ludziom z zespołu. O ile większość rzeczy można przekazać od ręki to niestety niektóre wymagają dodatkowego szkolenia. Jako, że szkolenie na żywym kodzie nie jest najlepszym pomysłem ponieważ próg wejścia jest wtedy stosunkowo wysoki to trzeba przygotować oddzielne szkolenie &#8220;za rączkę i krok [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Przy okazji zmiany płatnika ZUS pojawił się problem przekazania różnych moich projektów ludziom z zespołu. O ile większość rzeczy można przekazać od ręki to niestety niektóre wymagają dodatkowego szkolenia. Jako, że szkolenie na żywym kodzie nie jest najlepszym pomysłem ponieważ próg wejścia jest wtedy stosunkowo wysoki to trzeba przygotować oddzielne szkolenie &#8220;za rączkę i krok po kroku&#8221;. W takim przypadku najlepiej jest przygotować jakiś prosty projekt i na nim prowadzić szkolenie.<br />
Problemem jest jednak baza danych. Dokładnie jakiś ogarnięty schemat bazy danych by móc pokazać różne możliwości danej technologii.</p>
<p>Przekopując się przez wujka Google&#8217;a trafiłem na bardzo ciekawe <a href="http://www.databaseanswers.org/data_models/">repozytorium schematów</a>. Niestety nie udostępnia ono gotowych DDLi i skryptów wypełniających. Szkoda. Generalnie trzeba trochę poklikać i popisać by uzyskać jakiś rozsądny schemat.</p>
<p>A może wy znacie jakieś gotowe schematy, które można wykorzystać do szkoleń?</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/&amp;title=Prosty+schemat+bazy+danych" title="dodaj 'Prosty schemat bazy danych' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Prosty schemat bazy danych' do Del.icio.us" alt="dodaj 'Prosty schemat bazy danych' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/&amp;title=Prosty+schemat+bazy+danych" title="dodaj 'Prosty schemat bazy danych' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Prosty schemat bazy danych' do digg" alt="dodaj 'Prosty schemat bazy danych' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/" title="dodaj 'Prosty schemat bazy danych' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Prosty schemat bazy danych' do Technorati" alt="dodaj 'Prosty schemat bazy danych' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/&amp;title=Prosty+schemat+bazy+danych" title="dodaj 'Prosty schemat bazy danych' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Prosty schemat bazy danych' do Stumble Upon" alt="dodaj 'Prosty schemat bazy danych' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/&amp;title=Prosty+schemat+bazy+danych" title="dodaj 'Prosty schemat bazy danych' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Prosty schemat bazy danych' do Google Bookmarks" alt="dodaj 'Prosty schemat bazy danych' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/&amp;t=Prosty+schemat+bazy+danych" title="dodaj 'Prosty schemat bazy danych' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Prosty schemat bazy danych' do FaceBook" alt="dodaj 'Prosty schemat bazy danych' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/&amp;title=Prosty+schemat+bazy+danych" title="dodaj 'Prosty schemat bazy danych' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Prosty schemat bazy danych' do wykop.pl" alt="dodaj 'Prosty schemat bazy danych' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/21/prosty-schemat-bazy-danych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rozwiązanie zagadki projektowej numer 2</title>
		<link>http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/</link>
		<comments>http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/#comments</comments>
		<pubDate>Fri, 18 May 2012 19:33:23 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2552</guid>
		<description><![CDATA[      
      W tej zagadce należało rozpatrzyć dwie kwestie. Synchroniczność i asynchroniczność Mając pewną długą operację zazwyczaj musimy zdecydować czy ma być ona wykonana synchronicznie czy asynchronicznie. Oba podejścia są dobre. Wybór zależy zatem od konkretnego przypadku. Ogólnie jeżeli nie mamy jakiś obostrzeń to wybór metody asynchronicznej jest co do zasady odpowiedni. Metoda synchroniczna powinna zostać wybrana [...]]]></description>
			<content:encoded><![CDATA[      
      <p>W tej <a href="http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/">zagadce</a> należało rozpatrzyć dwie kwestie.</p>
<h4>Synchroniczność i asynchroniczność</h4>
<p>Mając pewną długą operację zazwyczaj musimy zdecydować czy ma być ona wykonana synchronicznie czy asynchronicznie. Oba podejścia są dobre. Wybór zależy zatem od konkretnego przypadku. Ogólnie jeżeli nie mamy jakiś obostrzeń to wybór metody asynchronicznej jest co do zasady odpowiedni. Metoda synchroniczna powinna zostać wybrana jeżeli w trakcie trwania danej operacji inne działania mogą wpłynąć na jej wynik. Względnie w przypadku aplikacji webowych jeżeli kolejne żądania mogą spowodować nieprawidłowe działanie aplikacji.<br />
Przykładowo dobrym miejscem na wykonanie akcji synchronicznej jest zdalna aktualizacja sterowników routera albo definicji raportu Jasper Reports. Czyli tam gdzie nie będziemy wstanie zagwarantować iż żądanie wysłane w trakcie operacji skończy się sukcesem.</p>
<h4>Ten sam JVM czy inny</h4>
<p>Jest to znacznie ciekawszy problem. Generalnie wszystko zależy od tego czy nasza operacja może doprowadzić do sytuacji w której JVM nie będzie mógł kontynuować pracy. Takich przypadków jest kilka.</p>
<h5>Brak pamięci</h5>
<p>Coraz rzadsza przypadłość. W czasach Javy 32bitowej i limitu niecałych 2GB na proces opłacało się wyrzucić ciężkie i pamięciożerne zadania do osobnego JVM. W razie wystąpienia wyjątku główny proces był nienaruszony. Dziś brak RAM dla JVM nie jest już problemem. Jak trzeba to się instaluje. Jak mało to się odpala coherence i współdzieli RAM pomiędzy maszynami.</p>
<h5>Przepełnienie stosu wywołań i nieskończone pętle</h5>
<p>W ogólności sytuacje gdzie zadanie idzie w przysłowiowe maliny. W takim wypadku siłowe ubicie procesu za pomocą SIGKILL jest zdecydowanie łatwiejsze niż próby ubicia wątku na działającym serwerze. </p>
<h5>Nadużywanie GC w czasie działania</h5>
<p>Sytuacja w której po zakończeniu pracy uruchamiany jest GC i radośnie sprząta&#8230; minutę, dwie&#8230; albo i więcej. Czasami tak bywa. Niestety uruchomienie GC może zablokować serwer&#8230; a to boli.</p>
<h4>Synchroniczność wywołania zewnętrznego JVM</h4>
<p>Mówiąc po polsku oczekiwanie na zakończenie uruchomionego procesu JVM. Zasady takie jak wymieniłem wyżej. Z tą różnicą, że opłaca się to robić tylko przy małej ilości użytkowników ponieważ osoby, które wyślą żądanie w trakcie działania procesu, ale nie wiedzą o jego uruchomieniu nie powinny spotykać się zbyt często z komunikatem w stylu &#8220;przerwa konserwacyjna&#8221;.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Del.icio.us" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do digg" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Technorati" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Stumble Upon" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Google Bookmarks" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;t=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do FaceBook" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do wykop.pl" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zagadka projektowa 2</title>
		<link>http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/</link>
		<comments>http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/#comments</comments>
		<pubDate>Mon, 07 May 2012 20:17:04 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2520</guid>
		<description><![CDATA[      
      Kolejna zagadka najpierw jednak rozwiązanie poprzedniej zagadki. Który listener lepszy Oba są dobrym rozwiązaniem. Wybór powinien nastąpić w wyniku analizy polegającej na odpowiedzi na pytanie: Kto powinien decydować o tym, że dane zdarzenie zakończyło się sukcesem albo porażką? Jeżeli decyzję powinien podjąć klient to lepszym jest listener z listingu 1. Jeżeli to my decydujemy to [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Kolejna zagadka najpierw jednak rozwiązanie <a href="http://koziolekweb.pl/2012/05/05/zagadka-projektowa/">poprzedniej zagadki</a>.</p>
<h4>Który listener lepszy</h4>
<p>Oba są dobrym rozwiązaniem. Wybór powinien nastąpić w wyniku analizy polegającej na odpowiedzi na pytanie:</p>
<blockquote><p>Kto powinien decydować o tym, że dane zdarzenie zakończyło się sukcesem albo porażką?</p></blockquote>
<p>Jeżeli decyzję powinien podjąć klient to lepszym jest listener z listingu 1. Jeżeli to my decydujemy to oczywiście rozwiązanie z listingu 2.<br />
Istnieją jednak dwa wyjątki. Pierwszy to duże zróżnicowanie protokołów (zdarzeń powodujących wywołanie listenera) w tym przypadku lepszym rozwiązaniem jest druga wersja listenera. Działa ona wtedy jak adapter. Jeżeli jednak protokół jest jeden i jest dobrze zdefiniowany to pierwszy z listenerów jest wystarczający. Jego użycie upraszcza nasz kod.<br />
Drugi wyjątek to sytuacja w której nie interesuje nas treść zdarzenia, ale tylko fakt jego zaistnienia. Jest to typowa sytuacja dla listenerów o których mówił Daniel w swoim komentarzu &#8211; loggerów, ale też np. listenerów audytowych czy listenerów związanych z bezpieczeństwem. </p>
<h4>Zagadka właściwa</h4>
<p>Dzisiejsza zagadka jest trochę trudniejsza. Mamy do wykonania pewne długotrwale zadanie. Wiemy, że będzie ono wykonywało się bardzo długo w stosunku do oczekiwań użytkownika. Pytanie brzmi:</p>
<blockquote><p>Poniższa lista zawiera kilka modeli wykonania zadania. Czym będziesz kierować się przy wyborze konkretnego modelu?</p>
<ul>
<li>Wywołanie synchroniczne EBJ albo usługi działającej w ramach tego samego procesu JVM wraz ze zmianą konfiguracji aplikacji webowej tak by nie groził błąd HTTP 408 request timeout.</li>
<li>Wywołanie synchroniczne usługi działającej w ramach innego procesu JVM.</li>
<li>Wywołanie asynchroniczne EJB albo usługi działającej w ramach tego samego procesu JVM.</li>
<li>Wywołanie asynchroniczne usługi działającej w ramach innego procesu JVM.</li>
</ul>
</blockquote>
<p>Od razu mówię, ze wszystkie punkty mają sens. Twoim zadaniem jest wskazanie przykładowych sytuacji, w których zastosowanie poszczególnych rozwiązań jest najlepsze.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Zagadka projektowa 2' do Del.icio.us" alt="dodaj 'Zagadka projektowa 2' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Zagadka projektowa 2' do digg" alt="dodaj 'Zagadka projektowa 2' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/" title="dodaj 'Zagadka projektowa 2' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Zagadka projektowa 2' do Technorati" alt="dodaj 'Zagadka projektowa 2' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Zagadka projektowa 2' do Stumble Upon" alt="dodaj 'Zagadka projektowa 2' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Zagadka projektowa 2' do Google Bookmarks" alt="dodaj 'Zagadka projektowa 2' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;t=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Zagadka projektowa 2' do FaceBook" alt="dodaj 'Zagadka projektowa 2' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Zagadka projektowa 2' do wykop.pl" alt="dodaj 'Zagadka projektowa 2' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zagadka projektowa</title>
		<link>http://koziolekweb.pl/2012/05/05/zagadka-projektowa/</link>
		<comments>http://koziolekweb.pl/2012/05/05/zagadka-projektowa/#comments</comments>
		<pubDate>Sat, 05 May 2012 20:50:13 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2512</guid>
		<description><![CDATA[      
      Dziś będzie &#8220;lajcik&#8221;. Mam dla was zagadkę projektową. Załóżmy, że mamy zaprojektować klasę służącą do komunikacji z pewną usługą. Przy czym usługa ta odpowiada na zadane pytania w taki sposób, że odpowiedź może interesować wiele obiektów w ramach aplikacji. Przykładem może być tu proste wciśnięcie przycisku do którego możemy przypisać wiele listenerów. Generalnie zatem mówiąc [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Dziś będzie &#8220;lajcik&#8221;. Mam dla was zagadkę projektową. Załóżmy, że mamy zaprojektować klasę służącą do komunikacji z pewną usługą. Przy czym usługa ta odpowiada na zadane pytania w taki sposób, że odpowiedź może interesować wiele obiektów w ramach aplikacji. Przykładem może być tu proste wciśnięcie przycisku do którego możemy przypisać wiele listenerów. Generalnie zatem mówiąc mamy do czynienia ze <a href="http://pl.wikipedia.org/wiki/Obserwator_(wzorzec_projektowy)" target="_blank" title="From Wikipedia the definition of: Obserwator_(wzorzec_projektowy)" class="wikiterm" >wzorcem obserwatora</a><sup class="wikiicon" ><em>W</em></sup>. Jest on przydatny w wielu sytuacjach. Zadać by się mogło nawet niezbyt oczywistych. Na wzorcu tym można budować interfejsy <a href="http://en.wikipedia.org/wiki/Service_provider_interface">SPI</a>, ale też wykorzystać go do rozluźnienia powiązań pomiędzy obiektami. W tym ostatnim przypadku można zastąpić tradycyjne wiązanie jeden do jednego wiązaniem jeden do wielu dzięki czemu można z łatwością wpinać się w różne miejsca aplikacji bez potrzeby jej modyfikowania.</p>
<p>Przykładowo tradycyjna aplikacja wykorzystująca formularze CUD (Create, Uprade, Delete) ma zazwyczaj podpięty jeden obiekt DAO, który realizuje poszczególne operacje. Co jednak gdy chcemy informować różne usługi o zmianach zachodzących w obiekcie? Chociażby zapisywać logi do celów audytowych czy statystycznych? Oczywiście można wprowadzać zmiany. Ba! Można do tego użyć programowania aspektowego i wstawiać aspekty w runtime&#8230; można&#8230; można też od początku stosować kolekcje usług i później dodawać/usuwać pojedyncze elementy. </p>
<p>Jednak nie o tym chciałem, choć temat ciekawy.</p>
<p>Mamy sobie do zaimplementowania listener dla pewnej usługi. Wywołanie usługi może zakończyć się na dwa sposoby sukcesem albo porażką (LOL odkrywcze). Teraz zagadka. </p>
<p>Na poniższych listingach przedstawiono dwa interfejsy listenera pewnej usługi. Pytanie brzmi, który z nich jest lepszym rozwiązaniem i w jakiej sytuacji:</p>
<p class="listing">Listing 1. Listener &#8220;jednometodowy&#8221;</p>
<pre class="java" name="code">interface ServiceListener{
    public void onEvent(Event e);
}</pre>
<p>Klasa <samp>Event</samp> zawiera odpowiedź usługi w czystej postaci (strumień, String, prymityw).</p>
<p class="listing">Listing 2. Listener &#8220;wielemetodowy&#8221;</p>
<pre class="java" name="code">interface ServiceListener{
    public void onSuccess(Response r);

    public void onError(Error e);
}</pre>
<p>Klasy <samp>Response</samp> i <samp>Error</samp> zawierają odpowiedź w czystej postaci, ale są wstępnie filtrowane tak by rozróżnić sukcesy i porażki.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Zagadka projektowa' do Del.icio.us" alt="dodaj 'Zagadka projektowa' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Zagadka projektowa' do digg" alt="dodaj 'Zagadka projektowa' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/" title="dodaj 'Zagadka projektowa' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Zagadka projektowa' do Technorati" alt="dodaj 'Zagadka projektowa' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Zagadka projektowa' do Stumble Upon" alt="dodaj 'Zagadka projektowa' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Zagadka projektowa' do Google Bookmarks" alt="dodaj 'Zagadka projektowa' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;t=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Zagadka projektowa' do FaceBook" alt="dodaj 'Zagadka projektowa' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Zagadka projektowa' do wykop.pl" alt="dodaj 'Zagadka projektowa' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/05/zagadka-projektowa/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nie obfuskuj kodu&#8230; nigdy</title>
		<link>http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/</link>
		<comments>http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 20:26:59 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Antywzorce]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaME]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2496</guid>
		<description><![CDATA[      
      Po raz kolejny na 4p pojawił się temat &#8220;jaki obfuskator&#8221;. I po raz kolejny odpowiedź brzmi &#8220;najlepiej żaden&#8221;. Generalnie współczesne obfuskatory potrafią robić kilka rzeczy poza samym zaciemnianiem nazw. Te są przydatne: Usuwanie nieużywanego kodu. Usuwanie informacji dla debuggera. Upraszczanie niektórych wyrażeń (shriking). Optymalizacja kodu m.n. wykorzystania zmiennych lokalnych. W efekcie możemy dostać kod mniejszy [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Po raz kolejny na 4p pojawił się temat &#8220;jaki obfuskator&#8221;. I po raz kolejny odpowiedź brzmi &#8220;najlepiej żaden&#8221;.</p>
<p>Generalnie współczesne obfuskatory potrafią robić kilka rzeczy poza samym zaciemnianiem nazw. Te są przydatne:</p>
<ul>
<li>Usuwanie nieużywanego kodu.</li>
<li>Usuwanie informacji dla debuggera.</li>
<li>Upraszczanie niektórych wyrażeń (shriking).</li>
<li>Optymalizacja kodu m.n. wykorzystania zmiennych lokalnych.</li>
</ul>
<p>W efekcie możemy dostać kod mniejszy i trochę wydajniejszy, ale będziemy musieli za to zapłacić bardzo wysoką cenę. Jest nią możliwość utrzymania kodu. Skoro kod wyjściowy zostanie potraktowany refaktoryzacją Zmiana nazwy to w efekcie gdy otrzymany od klienta stacktrace stanie się ciekawą łamigłówką pt. &#8220;Co to za klasa się wyjebała&#8221;.<br />
Kolejną wadą jest utrata możliwości powtórnego użycia kodu. Obfuskowany jar, który zawiera zestaw metod narzędziowych&#8230; a ty siedzisz i piszesz wszytko od nowa <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Na koniec należy też dodać utratę powiązania pomiędzy kodem, a dokumentacją. Wdrożenie nowego człowieka w projekt będzie bolesne&#8230; szczególnie jak mu się trafi obfuskowany stacktrace.</p>
<p>Zalety? Tak są. Obfuskatorów należy używać jeżeli piszemy na platformę JME albo Java Card i mamy ograniczenia co do ilości wyprodukowanego kodu. W takim wypadku warto użyć obfuskatora. Kolejną jest użycie obfuskatora z wyłączonym modułem zmiany nazw  w celu optymalizacji kodu. Zazwyczaj jest to upraszczanie wyrażeń (np. dodawania Stringów) lepsze wykorzystanie zmiennych lokalnych, usuwanie informacji dla debuggera czy martwego kodu. Czasami niewielkie zyski w tym zakresie są jak najbardziej pożądane. Przykładowo jeżeli uda nam się zmniejszyć wielkość paczki pobieranej przez klienta o 10% to dla 100MB jara wynik 10MB mniej na pobranie jest już znaczący zarówno dla naszych dysków jak i łączy.</p>
<p>Ale najważniejsze. Nie używajcie obfiskatorów. Najlepiej nigdy.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Del.icio.us" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do digg" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Technorati" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Stumble Upon" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Google Bookmarks" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;t=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do FaceBook" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do wykop.pl" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Quo vadis GOTO</title>
		<link>http://koziolekweb.pl/2012/04/29/quo-vadis-goto/</link>
		<comments>http://koziolekweb.pl/2012/04/29/quo-vadis-goto/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 21:39:40 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[COBOL]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2491</guid>
		<description><![CDATA[      
      Na ostatnim DevCrowd Sebastian Pietrowski poruszył kwestię związaną z być i nie być instrukcji GOTO. Jak wiadomo w Javie zarezerwowano słowo goto, ale nie jest ono zaimplementowane. Kwestią sporną pozostaje czy ta instrukcja jest sensowna w języku obiektowym czy też nie. W zamian za nią pedrowaty wskazał, że nadal można używać instrukcji break i continue. [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Na ostatnim <a href="http://koziolekweb.pl/2012/04/17/i-po-devcrowd/">DevCrowd</a> <a href="http://pietrowski.info/">Sebastian Pietrowski</a> poruszył kwestię związaną z być i nie być instrukcji GOTO. </p>
<p>Jak wiadomo w Javie zarezerwowano słowo <samp>goto</samp>, ale nie jest ono zaimplementowane. Kwestią sporną pozostaje czy ta instrukcja jest sensowna w języku obiektowym czy też nie. W zamian za nią <a href="https://twitter.com/#!/pedrowaty">pedrowaty</a> wskazał, że nadal można używać instrukcji <samp>break</samp> i <samp>continue</samp>. Co więcej powiem wam, że można tych instrukcji używać w taki sam sposób jak używano słowa kluczowego <samp>goto</samp>.</p>
<p class="listing">Listing 1. użycie <samp>break</samp> jak <samp>goto</samp>
<pre class="java" name="code">public class SimpleGoTo {
	public static void main(String[] args) {
		int i = 0;
		int j = 0;

		REPEAT: {
			while (i < 10) {
				i++;
				System.out.println(i + "/" + j);
				if (j > 5) {
					break REPEAT;
				}
				j++;
			}
			System.out.println(i + "///" + j);
		}
	}
}</pre>
<p>Jak się pobawicie to dojdziecie do wniosku, że można używać namiastki <samp>goto</samp> w postaci <samp>break LABEL</samp>. To był przykład z pętlą teraz trochę bardziej mieszający w głowie, czyli <samp>break LABEL</samp> z <samp>if</samp>em:</p>
<p class="listing">Listing 2. użycie <samp>break</samp> z <samp>if</samp>
<pre class="java" name="code">public class SimpleGoTo {
	public static void main(String[] args) {
		int i = 0;
		int j = 0;
		REPEAT: {
			MAGIC: {
				while (i < 10) {
					i++;
					System.out.println(i + "/" + j);
					if (j > 5) {
						break MAGIC;
					}
					j++;
				}
			}
			if (i + j > 10){
				break REPEAT;
			}
			System.out.println(i + "///" + j);
		}
	}
}</pre>
<p>Zatem można stwierdzić, że dopóki pozostajemy w danym zakresie (bloku kodu ograniczonym <samp>{</samp> i <samp>}</samp>) to możemy używać namiastki <samp>goto<samp>. Do czego można tego użyć?</p>
<p>W swojej karierze spotkałem się tylko raz z użyciem takiej konstrukcji. Mianowicie w ten sposób można kontrolować przepływ sterowania w programie jeżeli migrujemy z kodu pre-strukturalnego. Dzięki temu można w miarę łatwo przenieść zasadę działania oryginalnego programu, a dopiero później zastosować refaktoryzacje mające na celu zmianę struktury kodu. </p>
<p>Tergo typu konstrukcji nie stosujemy w nowo utworzonym kodzie. Dlaczego? Ponieważ jak ostatni raz tego użyli to meteoryt walnął w Ziemię i powstała nauka zwana Paleontologią. A na serio&#8230; trudność utrzymania takiego kodu jest bardzo duża. Wprowadzanie zmian ciężkie, a awaryjność wysoka. Poza tym taki kod nie ma sensu w przypadku programowania obiektowego. </p>
<p>idę spać.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/&amp;title=Quo+vadis+GOTO" title="dodaj 'Quo vadis GOTO' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Quo vadis GOTO' do Del.icio.us" alt="dodaj 'Quo vadis GOTO' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/&amp;title=Quo+vadis+GOTO" title="dodaj 'Quo vadis GOTO' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Quo vadis GOTO' do digg" alt="dodaj 'Quo vadis GOTO' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/" title="dodaj 'Quo vadis GOTO' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Quo vadis GOTO' do Technorati" alt="dodaj 'Quo vadis GOTO' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/&amp;title=Quo+vadis+GOTO" title="dodaj 'Quo vadis GOTO' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Quo vadis GOTO' do Stumble Upon" alt="dodaj 'Quo vadis GOTO' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/&amp;title=Quo+vadis+GOTO" title="dodaj 'Quo vadis GOTO' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Quo vadis GOTO' do Google Bookmarks" alt="dodaj 'Quo vadis GOTO' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/&amp;t=Quo+vadis+GOTO" title="dodaj 'Quo vadis GOTO' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Quo vadis GOTO' do FaceBook" alt="dodaj 'Quo vadis GOTO' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/04/29/quo-vadis-goto/&amp;title=Quo+vadis+GOTO" title="dodaj 'Quo vadis GOTO' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Quo vadis GOTO' do wykop.pl" alt="dodaj 'Quo vadis GOTO' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/04/29/quo-vadis-goto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Własny archetyp ważna rzecz</title>
		<link>http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/</link>
		<comments>http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 20:00:54 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2483</guid>
		<description><![CDATA[      
      Jeżeli często używasz jakiegoś stosu technologicznego warto zamienić konfigurację mavena na archetyp. Najprościej można to osiągnąć za pomocą wywołania mvn archetype:create-from-project. Postaram się przez najbliższych kilka dni przygotować i udostępnić archetyp zawierający: Vaadin JSR-303 JPA2 Shiro Guice Całość przetestowana za pomocą testng. Dodaj do]]></description>
			<content:encoded><![CDATA[      
      <p>Jeżeli często używasz jakiegoś stosu technologicznego warto zamienić konfigurację mavena na archetyp. Najprościej można to osiągnąć za pomocą wywołania <samp>mvn archetype:create-from-project</samp>.</p>
<p>Postaram się przez najbliższych kilka dni przygotować i udostępnić archetyp zawierający:</p>
<ul>
<li>Vaadin</li>
<li>JSR-303</li>
<li>JPA2</li>
<li>Shiro</li>
<li>Guice</li>
</ul>
<p>Całość przetestowana za pomocą testng.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/&amp;title=W%C5%82asny+archetyp+wa%C5%BCna+rzecz" title="dodaj 'Własny archetyp ważna rzecz' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Własny archetyp ważna rzecz' do Del.icio.us" alt="dodaj 'Własny archetyp ważna rzecz' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/&amp;title=W%C5%82asny+archetyp+wa%C5%BCna+rzecz" title="dodaj 'Własny archetyp ważna rzecz' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Własny archetyp ważna rzecz' do digg" alt="dodaj 'Własny archetyp ważna rzecz' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/" title="dodaj 'Własny archetyp ważna rzecz' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Własny archetyp ważna rzecz' do Technorati" alt="dodaj 'Własny archetyp ważna rzecz' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/&amp;title=W%C5%82asny+archetyp+wa%C5%BCna+rzecz" title="dodaj 'Własny archetyp ważna rzecz' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Własny archetyp ważna rzecz' do Stumble Upon" alt="dodaj 'Własny archetyp ważna rzecz' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/&amp;title=W%C5%82asny+archetyp+wa%C5%BCna+rzecz" title="dodaj 'Własny archetyp ważna rzecz' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Własny archetyp ważna rzecz' do Google Bookmarks" alt="dodaj 'Własny archetyp ważna rzecz' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/&amp;t=W%C5%82asny+archetyp+wa%C5%BCna+rzecz" title="dodaj 'Własny archetyp ważna rzecz' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Własny archetyp ważna rzecz' do FaceBook" alt="dodaj 'Własny archetyp ważna rzecz' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/&amp;title=W%C5%82asny+archetyp+wa%C5%BCna+rzecz" title="dodaj 'Własny archetyp ważna rzecz' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Własny archetyp ważna rzecz' do wykop.pl" alt="dodaj 'Własny archetyp ważna rzecz' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/04/27/wlasny-archetyp-wazna-rzecz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>USOS na Javie &#8211; przemyślenia po&#8230;</title>
		<link>http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/</link>
		<comments>http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 19:50:49 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Guice]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[USOS]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2477</guid>
		<description><![CDATA[      
      Dziś na wydziale MiMUW odbyła się konferencja &#8220;USOS w Javie&#8221;. Wziąłem w niej udział z dwóch powodów. Po pierwsze jako, że zmieniam pracę to muszę jakoś opędzić urlop. Po drugie byłem ciekawy co spece od USOS chcą osiągnąć i jakie mają pomysły. Poglądowo W spotkaniu chodziło o przedstawienie osobom odpowiedzialnym za USOS pewnego stosu technologicznego, [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Dziś na wydziale MiMUW odbyła się konferencja <a href="http://usos.edu.pl/varia/JavaUSOS/">&#8220;USOS w Javie&#8221;</a>. Wziąłem w niej udział z dwóch powodów. Po pierwsze jako, że zmieniam pracę to muszę jakoś opędzić urlop. Po drugie byłem ciekawy co spece od USOS chcą osiągnąć i jakie mają pomysły.</p>
<h4>Poglądowo</h4>
<p>W spotkaniu chodziło o przedstawienie osobom odpowiedzialnym za USOS pewnego stosu technologicznego, na którym należało by oprzeć nowy moduł systemu. </p>
<h5>Czym jest USOS?</h5>
<p><a href="http://usos.edu.pl/">USOS</a> jest to mówiąc w dużym skrócie mieszanka <a href="http://pl.wikipedia.org/wiki/Planowanie_zasobów_przedsiębiorstwa" target="_blank" title="From Wikipedia the definition of: Planowanie zasobów przedsiębiorstwa" class="wikiterm" >ERP</a><sup class="wikiicon" ><em>W</em></sup> i <a href="http://pl.wikipedia.org/wiki/Zarządzanie_relacjami_z_klientami" target="_blank" title="From Wikipedia the definition of: Zarządzanie relacjami z klientami" class="wikiterm" >CRM</a><sup class="wikiicon" ><em>W</em></sup> oraz narzędzi specyficznych dla zarządzania uczelnią. Składa się on z kilku modułów. Na konferencji skupiliśmy się na trzech z nich USOS, USOS-web i USOS-UL.<br />
Pierwszy to &#8220;USOS właściwy&#8221;, czyli baza danych wraz z interfejsem biznesowym do zarządzania uczelnią. Całość postawiona na Oracle + Oracle Forms. Duże to jak cholera (ponad 300 formularzy) i coraz trudniejsze w utrzymaniu.<br />
Drugi to interfejs web, przez który studenci mogą sobie zobaczyć np. plan zajęć czy pobrać materiały. Tu króluje php i mysql. Z głównym systemem integracja polega na cyklicznej synchronizacji baz danych. Oznacza to, że USOS-web może nie mieć aktualnych danych. Podobnie danych może nie mieć USOS główny.<br />
Trzeci element to moduł na który klną wszyscy studenci. Jest on odpowiedzialny za rejestrację na lektoraty i WF. Dwa razy do roku mamy tu DDoS </p>
<h4>Pomysły</h4>
<p>Generalnie idea jest taka by napisać wszystko z wykorzystaniem Springa i jego modułów do biznesu, a GWT/Vaadin/JS jako warstwy widoku. W ogólnym ujęciu serwer aplikacji wystawiał by zestaw usług opartych o REST oraz pozwalał na ich uruchamianie via aplikacja web.<br />
W toku dyskusji został podniesiony problem aplikacja web kontra aplikacja desktopowa. Jednak Jacek Laskowski elegancko spacyfikował towarzystwo stwierdzając, że każda aplikacja oparta o wołanie usług po http to aplikacja web. Zgadzam się z nim w pełni, a jedyne co można tu dodać to rozróżnienie na klienta www i klienta desktopowego.</p>
<h4>Debata</h4>
<p>Generalnie przyszło nam zmierzyć się z dość trudnym tematem&#8230; interfejsu użyszkodnika. Większość czasu poświęciliśmy na próby odpowiedzenia czy UI ma być w GWT czy w Vaadin. Moim zdaniem była to ciekawa, ale nie wnosząca nic do tematu pogawędka. Niepokoi mnie to, że praktycznie nie poruszono tematów związanych z backendem. Przyjęto, że używamy Springa i koniec. Wtrącenie na temat EJB zostało ucięte już na samym początku. Szkoda.</p>
<h4>Moja propozycja</h4>
<p>Podsumowując całość mam taką propozycję.</p>
<p>Po pierwsze skupić się na napisaniu dobrego backendu. Wykorzystać do tego Springa i to nie ze względu na kontener IoC, ale ze względu na dużą ilość modułów pozwalających na integrację z potrzebnymi nam technologiami. Beany springowe powinny być dostępne tylko i wyłącznie jako usługi oparte o REST. Całość należy wdrożyć na <a href="http://openejb.apache.org/apache-tomee.html">TomEE</a>, czyli specjalnej wersji Tomcata, która jest zgodna z webprofilem JEE6. Dlaczego tak? Ponieważ z jednej strony mamy lekkiego Tomcata, który w zupełności wystarczy do uruchomienia aplikacji w Springu. Ma on też możliwość clustrowania, a że całość będzie bezstanowym wołaniem usług to można będzie w razie konieczności zestawić cluster dynamicznie dostosowujący swoją wielkość do obciążenia. Z drugiej strony TomEE posiada wszystko co powinien mieć typowy serwer aplikacji zatem jeżeli będziemy chcieli uruchomić na nim jakieś usługi EE to też nie będzie problemu. Tu ważna rzeczy. Obecnie trwają już prace nad przejściem z Oracle Reports na BIRT.<br />
Jak wspomniałem Springa wybieramy ze względu na moduły. Kontener IoC jest tu drugorzędnym problemem i jeżeli miałbym się kierować tylko i wyłącznie nim jako kryterium wyboru to bym wybrał Guice. Jest prostsze. Tu interesują nas moduły </p>
<ul>
<li>Security &#8211; wiadomo</li>
<li>CXF integration- czyli obsługa webservice po REST z wykorzystaniem Apache CXF.</li>
<li>batch &#8211; narzędzia do przetwarzania wsadowego.</li>
<li>Dynamic modules &#8211; jako platformę OSGi</li>
</ul>
<p>Co dalej&#8230; Jacek rzucił pięknym tekstem:</p>
<blockquote><p>Aplikacja webowa jako referencyjna implementacja klienta REST</p></blockquote>
<p>Zgodnie z tym podejściem inny zespół powinien otrzymać API aplikacji USOS i rozpocząć deweloperkę klienta web opartego o wołanie usług. Aplikacja web oraz główna aplikacja powinny zostać całkowicie od siebie odseparowane. Ma to dwa duże plusy. Po pierwsze pozwala wyrzucić poza core-aplikację wszystko co związane z obsługą sesji HTTP. Dzięki temu upraszczamy znacząco implementację. Po drugie aplikacja ma spójny interfejs REST-only dzięki czemu deweloperzy nie muszą martwić się &#8220;czy ruszy na kliencie&#8221;. Po prostu wystawiają usługę z jasno zdefiniowanym interfejsem. Samą aplikację web napisałbym z zwykorzystaniem Vaadin ponieważ jest to proste i łatwe w użyciu narzędzie.</p>
<p>Na dokładkę dodałbym trochę dupereli typu zbudowanie środowiska deweloperskiego wykorzystującego serwer CI, raportowanie jakości kodu, jakieś automatyczne wyszukiwanie problemów. Zarówno statycznych (findbug) jak i dynamiczne (patrz praca Patrycji Wegrzynowicz). Pewno coś jeszcze by się znalazło. </p>
<p>Nie poruszam tu problemu bazy danych, ponieważ na chwilę obecną i tak system musi korzystać z już istniejącej bazy, a w przyszłości może wydarzyć się jeszcze wiele różnych rzeczy, które mogą wpłynąć na wybór w tym zakresie.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/&amp;title=USOS+na+Javie+%26%238211%3B+przemy%C5%9Blenia+po%26%238230%3B" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Del.icio.us" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/&amp;title=USOS+na+Javie+%26%238211%3B+przemy%C5%9Blenia+po%26%238230%3B" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do digg" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Technorati" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/&amp;title=USOS+na+Javie+%26%238211%3B+przemy%C5%9Blenia+po%26%238230%3B" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Stumble Upon" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/&amp;title=USOS+na+Javie+%26%238211%3B+przemy%C5%9Blenia+po%26%238230%3B" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Google Bookmarks" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/&amp;t=USOS+na+Javie+%26%238211%3B+przemy%C5%9Blenia+po%26%238230%3B" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do FaceBook" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/&amp;title=USOS+na+Javie+%26%238211%3B+przemy%C5%9Blenia+po%26%238230%3B" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do wykop.pl" alt="dodaj 'USOS na Javie &#8211; przemyślenia po&#8230;' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/04/25/usos-na-javie-przemyslenia-po/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JSR-303, a spadki</title>
		<link>http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/</link>
		<comments>http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 13:30:14 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSR-303]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2447</guid>
		<description><![CDATA[      
      Specyfikacje JSR mają w większości &#8220;problem COBOLa&#8221; polegający mniej więcej na tym, że dobry pomysł chce się zamknąć w naukowo-techniczny dokument. Tak też jest w przypadku JSR-303. Tu jednak zabawa polega na delegowaniu pewnych zachowań do specyfikacji javy, co może skończyć się całkiem widowiskowym failem. W czym rzecz. Mamy sobie pewien model danych, a w [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Specyfikacje JSR mają w większości &#8220;problem COBOLa&#8221; polegający mniej więcej na tym, że dobry pomysł chce się zamknąć w naukowo-techniczny dokument. Tak też jest w przypadku JSR-303. Tu jednak zabawa polega na delegowaniu pewnych zachowań do specyfikacji javy, co może skończyć się całkiem widowiskowym failem. W czym rzecz.</p>
<p>Mamy sobie pewien model danych, a w nim klasę <samp>SomeClass</samp>:</p>
<p class="listing">Listing 1. Klasa <samp>SomeClass</samp></p>
<pre class="java" name="code">public class SomeClass {

	@NotNull
	private final Integer someInt;

	public SomeClass(Integer someInt) {
		this.someInt = someInt;
	}

	public Integer getSomeInt() {
		return someInt;
	}

}</pre>
<p>Ma ona jedno pole, które niesie ze sobą jakąś tam informację biznesową. Bez wnikania w szczegóły pole nie może być <samp>null</samp>. Możemy zatem założyć, że taki test:</p>
<p class="listing">Listing 2. Test <samp>SomeClass</samp></p>
<pre class="java" name="code">public class SomeClassTest {

	private Validator validator;

	@BeforeClass
	protected void setUp() {
		validator = Validation.buildDefaultValidatorFactory().getValidator();
	}

	@Test
	public void simpleValidationForClass() {
		assertThat(validator.validate(new SomeClass(1))).isEmpty();
		assertThat(validator.validate(new SomeClass(null))).isNotEmpty();
	}

}</pre>
<p>Jest ok. </p>
<p>W toku prac nad kodem dochodzimy do miejsca, w którym musimy wprowadzić nową podklasę klasy <samp>SomeClass</samp>, która zachowuje się tak samo, ale jej pole może przyjmować tylko wartość <samp>null</samp>. Musimy zatem przesłonić pole albo metodę w klasie <samp>SubSomeClass</samp>. Ja wybrałem bardziej intuicyjny element &#8211; pole.</p>
<p class="listing">Listing 3. Klasa <samp>SubSomeClass</samp></p>
<pre class="java" name="code">public class SubSomeClass extends SomeClass {

	@Null
	private final Integer someInt;

	public SubSomeClass(Integer someInt) {
		super(someInt);
		this.someInt = someInt;
	}

	@Override
	public Integer getSomeInt() {
		return someInt;
	}
}
</pre>
<p>Test, który powinien przejść w takim wypadku wygląda tak:</p>
<p class="listing">Listing 4. Test <samp>SubSomeClass</samp></p>
<pre class="java" name="code">public class SubSomeClassTest {
	private Validator validator;

	@BeforeClass
	protected void setUp() {
		validator = Validation.buildDefaultValidatorFactory().getValidator();
	}

	@Test
	public void simpleValidationForSubClass() {
		assertThat(validator.validate(new SubSomeClass(null))).isEmpty();
		assertThat(validator.validate(new SubSomeClass(1))).isNotEmpty();
	}
}</pre>
<p>&#8230; jednak z pewnego powodu test nie przechodzi.</p>
<h4>JSR-303 u notariusza</h4>
<p>Dziedziczenie jak wiadomo jest najlepszą, obiektową metodą na wzbogacenie się. Dziedzicząc jednak z klasy robimy to w prost co oznacza, że wzbogacamy się o wszystkie elementy klasy z której dziedziczymy jak i odpowiadamy za wszelkie długi (technologiczne), które dana klasa zaciągnęła. Tak to wygląda w przypadku klas.<br />
JSR-303 ma tu jednak pewne pole do manewru ponieważ posługując się refleksją może spróbować innych sposobów zarządzania technologicznym &#8220;spadkiem&#8221;.</p>
<ul>
<li>Może odrzucić spadek w całości o nie ma sensu ponieważ nie będzie wtedy weryfikował nieprzesłoniętych pól nadklasy.</li>
<li>Może przyjąć spadek &#8220;z dobrodziejstwem inwentarza&#8221;, czyli w przypadku gdy w nadklasie jest już pole o takiej samej nazwie to nie uruchamia jego walidacji.</li>
</ul>
<p>Niestety twórcy specyfikacji poszli po linii najmniejszego oporu delegując zachowanie do &#8220;zasad widoczności w specyfikacji języka&#8221;. Efekt możecie podziwiać wyżej.</p>
<h4>Jak sobie z tym poradzić?</h4>
<p>Najprościej jest wnieść walidację na poziom całej klasy poprzez własny walidator, ale na dłuższą metę to też nie zadziała. W Walidatorze i tak będziemy musieli sprawdzać typ obiektu. Drugą metodą jest rozbudowa hierarchii w taki sposób by klasa <samp>SomeClass</samp> stała się klasą abstrakcyjną, a pola umieścić w klasach z niej dziedziczących. Już lepiej choć nadal niedobrze, bo mamy dublujący się kod. Jest jeszcze mechanizm grup, ale nie do tego on służy (wbrew pozorom), bo i tak nie unikniemy tu sprawdzania typu.</p>
<h5>Jeff Bay przychodzi z pomocą</h5>
<p>W komentarzach do <a href="http://koziolekweb.pl/2011/11/06/ekstremalna-obiektowosc-w-praktyce-%E2%80%93-czesc-3-opakowuj-wszystkie-prymitywy-i-stringi/">trzeciej części EOwP</a> pojawiły się głosy, że dodatkowa warstwa nie jest potrzebna, bo tyko komplikuje kod. Tu jednak mamy dobre miejsce na wprowadzenie typu obudowującego.<br />
Na początek definiujemy interfejs <samp>BussinesInt</samp> w klasie <samp>SomeClass</samp>:</p>
<p class="listing">Listing 5. Interfejs <samp>BussinesInt</samp></p>
<pre class="java" name="code">public class SomeClass {

	protected static interface BussinesInt {
		Integer getValue();
	}

//...
}</pre>
<p>Następnie dodajemy implementację w ramach klasy <samp>SomeClass</samp>:</p>
<p class="listing">Listing 5. Implementacja <samp>BussinesInt</samp> w <samp>SomeClass</samp></p>
<pre class="java" name="code">public class SomeClass {

	private static class SomeBussinesInt implements BussinesInt {

		@NotNull
		private final Integer someInt;

		public SomeBussinesInt(Integer someInt) {
			this.someInt = someInt;
		}

		@Override
		public Integer getValue() {
			return someInt;
		}
	}

//...
}</pre>
<p>oraz <samp>SubSomeClass</samp>:</p>
<p class="listing">Listing 6. Implementacja <samp>BussinesInt</samp> w <samp>SubSomeClass</samp></p>
<pre class="java" name="code">public class SubSomeClass extends SomeClass {

	private static class SubSomeBussinesInt implements BussinesInt {

		@Null
		private final Integer someInt;

		public SubSomeBussinesInt(Integer someInt) {
			this.someInt = someInt;
		}

		@Override
		public Integer getValue() {
			return someInt;
		}
	}

//...
}</pre>
<p>na koniec jeszcze kilka zmian w kodzie <samp>SomeClass</samp>:</p>
<p class="listing">Listing 7. Nowa wersja <samp>SomeClass</samp></p>
<pre class="java" name="code">public class SomeClass {
//...
	@Valid
	private final BussinesInt someInt;

	public SomeClass(Integer someInt) {
		this.someInt = new SomeBussinesInt(someInt);
	}

	protected SomeClass(BussinesInt bussinesInt) {
		this.someInt = bussinesInt;
	}

	public Integer getSomeInt() {
		return someInt.getValue();
	}
}</pre>
<p>i jedna bardzo istotna w <samp>SubSomeClass</samp>:</p>
<p class="listing">Listing 7. Nowa wersja <samp>SubSomeClass</samp></p>
<pre class="java" name="code">public class SubSomeClass extends SomeClass {
//....
	public SubSomeClass(Integer someInt) {
		super(new SubSomeBussinesInt(someInt));
	}
}</pre>
<p>Ok teraz pytanie co tu się stało?</p>
<h4>Dlaczego tak?</h4>
<p>Stajemy tu przed często spotykanym problemem dopuszczenia wyjątku jako normalnego zachowania. </p>
<p>W ogólności każdy obiekt <samp>SomeClass</samp> nie może mieć wartości <samp>null</samp> w swoim biznesowym polu. Jednak w przypadku <samp>SubSomeClass</samp> dopuszcza się tą wartość. </p>
<p>Obie klasy są prawidłowo umieszczone w hierarchii, obie zachowują się &#8220;na zewnątrz&#8221; w taki sam sposób. Inne są jednak zachowania wewnątrz klas. Tu mała uwaga, jeżeli podklasa zmienia zachowanie nadklasy w znaczący sposób np. umożliwia zwrócenie wartości <samp>null</samp> pomimo, że nadklasa wyraźnie tego zabrania to oznacza, że należy zmienić hierarchie klas. Tu nie ma takiego zagrożenia ponieważ metoda <samp>getSomeInt</samp> nie mówi nic o ograniczeniu wartości zwracanej więc <samp>null</samp> jest poprawnym wyjściem. Przykład z życia? Pracownik &#8211; handlowcy mają klientów asystenci handlowców nie mają klientów, ale są też handlowcami (nie dostają tylko bonusów z tytułu posiadania klientów).<br />
klasy różnią się wewnętrzną obsługą jednego z pól zatem zamykamy to pole w specjalizowanym interfejsie, która może, ale nie musi być implementowany przez podklasy. Wystarczy zatem, że dodamy implementację tam gdzie tego potrzebujemy. Reszta bez zmian.</p>
<h4>podsumowanie</h4>
<p>JSR 303 fajne jest, ale ma wiele kruczków-sztuczków (Corvus Corvax Magicus), które czasami przyprawiają o ból głowy.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/&amp;title=JSR-303%2C+a+spadki" title="dodaj 'JSR-303, a spadki' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'JSR-303, a spadki' do Del.icio.us" alt="dodaj 'JSR-303, a spadki' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/&amp;title=JSR-303%2C+a+spadki" title="dodaj 'JSR-303, a spadki' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'JSR-303, a spadki' do digg" alt="dodaj 'JSR-303, a spadki' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/" title="dodaj 'JSR-303, a spadki' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'JSR-303, a spadki' do Technorati" alt="dodaj 'JSR-303, a spadki' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/&amp;title=JSR-303%2C+a+spadki" title="dodaj 'JSR-303, a spadki' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'JSR-303, a spadki' do Stumble Upon" alt="dodaj 'JSR-303, a spadki' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/&amp;title=JSR-303%2C+a+spadki" title="dodaj 'JSR-303, a spadki' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'JSR-303, a spadki' do Google Bookmarks" alt="dodaj 'JSR-303, a spadki' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/&amp;t=JSR-303%2C+a+spadki" title="dodaj 'JSR-303, a spadki' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'JSR-303, a spadki' do FaceBook" alt="dodaj 'JSR-303, a spadki' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/&amp;title=JSR-303%2C+a+spadki" title="dodaj 'JSR-303, a spadki' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'JSR-303, a spadki' do wykop.pl" alt="dodaj 'JSR-303, a spadki' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/03/16/jsr-303-a-spadki/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

